setEnableQuickPunch( false ); //Helps prevent duplicate punch IDs and validation failures. $dd->setUserNamePostFix( '_' . uniqid( null, true ) ); //Needs to be super random to prevent conflicts and random failing tests. $this->company_id = $dd->createCompany(); $this->legal_entity_id = $dd->createLegalEntity( $this->company_id, 10 ); Debug::text( 'Company ID: ' . $this->company_id, __FILE__, __LINE__, __METHOD__, 10 ); $this->currency_id[10] = $dd->createCurrency( $this->company_id, 10 ); $this->currency_id[20] = $dd->createCurrency( $this->company_id, 20 ); $this->currency_id[30] = $dd->createCurrency( $this->company_id, 30 ); $this->currency_id[40] = $dd->createCurrency( $this->company_id, 40 ); //$dd->createPermissionGroups( $this->company_id, 40 ); //Administrator only. $dd->createPayStubAccount( $this->company_id ); $this->createPayStubAccounts(); $dd->createPayStubAccountLink( $this->company_id ); $this->getPayStubAccountLinkArray(); //Company Deductions $dd->createCompanyDeduction( $this->company_id, $this->user_id, $this->legal_entity_id ); $this->createCompanyDeductions(); $dd->createUserWageGroups( $this->company_id ); $this->remittance_source_account_ids[$this->legal_entity_id][] = $dd->createRemittanceSourceAccount( $this->company_id, $this->legal_entity_id, $this->currency_id[10], 10 ); // Check $this->remittance_source_account_ids[$this->legal_entity_id][] = $dd->createRemittanceSourceAccount( $this->company_id, $this->legal_entity_id, $this->currency_id[10], 20 ); // US - EFT $this->remittance_source_account_ids[$this->legal_entity_id][] = $dd->createRemittanceSourceAccount( $this->company_id, $this->legal_entity_id, $this->currency_id[10], 30 ); // CA - EFT //createUser() also handles remittance destination accounts. $this->user_id = $dd->createUser( $this->company_id, $this->legal_entity_id, 100, null, null, null, null, null, null, null, $this->remittance_source_account_ids ); $this->createPayPeriodSchedule(); $this->createPayPeriods(); $this->getAllPayPeriods(); //Create policies $this->policy_ids['pay_formula_policy'][100] = $dd->createPayFormulaPolicy( $this->company_id, 100 ); //Regular $this->policy_ids['pay_formula_policy'][110] = $dd->createPayFormulaPolicy( $this->company_id, 110 ); //Vacation $this->policy_ids['pay_formula_policy'][120] = $dd->createPayFormulaPolicy( $this->company_id, 120 ); //Bank $this->policy_ids['pay_formula_policy'][130] = $dd->createPayFormulaPolicy( $this->company_id, 130 ); //Sick $this->policy_ids['pay_formula_policy'][200] = $dd->createPayFormulaPolicy( $this->company_id, 200 ); //OT1.5 $this->policy_ids['pay_formula_policy'][210] = $dd->createPayFormulaPolicy( $this->company_id, 210 ); //OT2.0 $this->policy_ids['pay_formula_policy'][300] = $dd->createPayFormulaPolicy( $this->company_id, 300 ); //Prem1 $this->policy_ids['pay_formula_policy'][310] = $dd->createPayFormulaPolicy( $this->company_id, 310 ); //Prem2 $this->policy_ids['pay_code'][100] = $dd->createPayCode( $this->company_id, 100, $this->policy_ids['pay_formula_policy'][100] ); //Regular $this->policy_ids['pay_code'][190] = $dd->createPayCode( $this->company_id, 190, $this->policy_ids['pay_formula_policy'][100] ); //Lunch $this->policy_ids['pay_code'][192] = $dd->createPayCode( $this->company_id, 192, $this->policy_ids['pay_formula_policy'][100] ); //Break $this->policy_ids['pay_code'][200] = $dd->createPayCode( $this->company_id, 200, $this->policy_ids['pay_formula_policy'][200] ); //OT1 $this->policy_ids['pay_code'][210] = $dd->createPayCode( $this->company_id, 210, $this->policy_ids['pay_formula_policy'][210] ); //OT2 $this->policy_ids['pay_code'][300] = $dd->createPayCode( $this->company_id, 300, $this->policy_ids['pay_formula_policy'][300] ); //Prem1 $this->policy_ids['pay_code'][310] = $dd->createPayCode( $this->company_id, 310, $this->policy_ids['pay_formula_policy'][310] ); //Prem2 $this->policy_ids['pay_code'][900] = $dd->createPayCode( $this->company_id, 900, $this->policy_ids['pay_formula_policy'][110] ); //Vacation $this->policy_ids['pay_code'][910] = $dd->createPayCode( $this->company_id, 910, $this->policy_ids['pay_formula_policy'][120] ); //Bank $this->policy_ids['pay_code'][920] = $dd->createPayCode( $this->company_id, 920, $this->policy_ids['pay_formula_policy'][130] ); //Sick $this->policy_ids['contributing_pay_code_policy'][10] = $dd->createContributingPayCodePolicy( $this->company_id, 10, [ $this->policy_ids['pay_code'][100] ] ); //Regular $this->policy_ids['contributing_pay_code_policy'][12] = $dd->createContributingPayCodePolicy( $this->company_id, 12, [ $this->policy_ids['pay_code'][100], $this->policy_ids['pay_code'][190], $this->policy_ids['pay_code'][192] ] ); //Regular+Meal/Break $this->policy_ids['contributing_pay_code_policy'][14] = $dd->createContributingPayCodePolicy( $this->company_id, 14, [ $this->policy_ids['pay_code'][100], $this->policy_ids['pay_code'][190], $this->policy_ids['pay_code'][192], $this->policy_ids['pay_code'][900] ] ); //Regular+Meal/Break+Absence $this->policy_ids['contributing_pay_code_policy'][20] = $dd->createContributingPayCodePolicy( $this->company_id, 20, [ $this->policy_ids['pay_code'][100], $this->policy_ids['pay_code'][200], $this->policy_ids['pay_code'][210], $this->policy_ids['pay_code'][190], $this->policy_ids['pay_code'][192] ] ); //Regular+OT+Meal/Break $this->policy_ids['contributing_pay_code_policy'][90] = $dd->createContributingPayCodePolicy( $this->company_id, 90, [ $this->policy_ids['pay_code'][900] ] ); //Absence $this->policy_ids['contributing_pay_code_policy'][99] = $dd->createContributingPayCodePolicy( $this->company_id, 99, $this->policy_ids['pay_code'] ); //All Time $this->policy_ids['contributing_shift_policy'][12] = $dd->createContributingShiftPolicy( $this->company_id, 10, $this->policy_ids['contributing_pay_code_policy'][12] ); //Regular+Meal/Break $this->policy_ids['contributing_shift_policy'][20] = $dd->createContributingShiftPolicy( $this->company_id, 20, $this->policy_ids['contributing_pay_code_policy'][20] ); //Regular+OT+Meal/Break $this->policy_ids['regular'][] = $dd->createRegularTimePolicy( $this->company_id, 10, $this->policy_ids['contributing_shift_policy'][12], $this->policy_ids['pay_code'][100] ); $this->policy_ids['overtime'][] = $dd->createOverTimePolicy( $this->company_id, 10, $this->policy_ids['contributing_shift_policy'][12], $this->policy_ids['pay_code'][200] ); $this->policy_ids['overtime'][] = $dd->createOverTimePolicy( $this->company_id, 20, $this->policy_ids['contributing_shift_policy'][12], $this->policy_ids['pay_code'][210] ); $this->policy_ids['premium'][] = $dd->createPremiumPolicy( $this->company_id, 10, $this->policy_ids['contributing_shift_policy'][20], $this->policy_ids['pay_code'][300] ); $this->policy_ids['premium'][] = $dd->createPremiumPolicy( $this->company_id, 20, $this->policy_ids['contributing_shift_policy'][20], $this->policy_ids['pay_code'][310] ); $dd->createPolicyGroup( $this->company_id, null, //Meal null, //Exception null, //Holiday $this->policy_ids['overtime'], //OT $this->policy_ids['premium'], //Premium null, //Round [ $this->user_id ], //Users null, //Break null, //Accrual null, //Expense null, //Absence $this->policy_ids['regular'] //Regular ); $this->createPunchData(); $this->assertTrue( TTUUID::isUUID( $this->company_id ) ); $this->assertTrue( TTUUID::isUUID( $this->user_id ) ); } public function tearDown(): void { Debug::text( 'Running tearDown(): ', __FILE__, __LINE__, __METHOD__, 10 ); } function deleteUserWage( $user_id ) { $uwlf = TTnew( 'UserWageListFactory' ); /** @var UserWageListFactory $uwlf */ $uwlf->getByUserId( $user_id ); if ( $uwlf->getRecordCount() > 0 ) { foreach ( $uwlf as $uw_obj ) { $uw_obj->setDeleted( true ); if ( $uw_obj->isValid() ) { $uw_obj->Save(); } } } return true; } function createUserSalaryWage( $user_id, $rate, $effective_date, $wage_group_id = 0 ) { $uwf = TTnew( 'UserWageFactory' ); /** @var UserWageFactory $uwf */ $uwf->setUser( $user_id ); $uwf->setWageGroup( $wage_group_id ); $uwf->setType( 13 ); //BiWeekly $uwf->setWage( $rate ); $uwf->setWeeklyTime( ( 3600 * 40 ) ); $uwf->setHourlyRate( 10.00 ); $uwf->setEffectiveDate( $effective_date ); if ( $uwf->isValid() ) { $insert_id = $uwf->Save(); Debug::Text( 'User Wage ID: ' . $insert_id, __FILE__, __LINE__, __METHOD__, 10 ); return $insert_id; } Debug::Text( 'Failed Creating User Wage!', __FILE__, __LINE__, __METHOD__, 10 ); return false; } function getPayStubAccountLinkArray() { $this->pay_stub_account_link_arr = [ 'total_gross' => CompanyDeductionFactory::getPayStubEntryAccountByCompanyIDAndTypeAndFuzzyName( $this->company_id, 40, 'Total Gross' ), 'total_deductions' => CompanyDeductionFactory::getPayStubEntryAccountByCompanyIDAndTypeAndFuzzyName( $this->company_id, 40, 'Total Deductions' ), 'employer_contribution' => CompanyDeductionFactory::getPayStubEntryAccountByCompanyIDAndTypeAndFuzzyName( $this->company_id, 40, 'Employer Total Contributions' ), 'net_pay' => CompanyDeductionFactory::getPayStubEntryAccountByCompanyIDAndTypeAndFuzzyName( $this->company_id, 40, 'Net Pay' ), 'regular_time' => CompanyDeductionFactory::getPayStubEntryAccountByCompanyIDAndTypeAndFuzzyName( $this->company_id, 10, 'Regular Time' ), 'vacation_accrual_release' => CompanyDeductionFactory::getPayStubEntryAccountByCompanyIDAndTypeAndFuzzyName( $this->company_id, 10, 'Vacation - Accrual Release' ), 'vacation_accrual' => CompanyDeductionFactory::getPayStubEntryAccountByCompanyIDAndTypeAndFuzzyName( $this->company_id, 50, 'Vacation Accrual' ), 'cpp' => CompanyDeductionFactory::getPayStubEntryAccountByCompanyIDAndTypeAndFuzzyName( $this->company_id, 20, 'CPP' ), 'ei' => CompanyDeductionFactory::getPayStubEntryAccountByCompanyIDAndTypeAndFuzzyName( $this->company_id, 20, 'EI' ), 'advanced_percent_2' => CompanyDeductionFactory::getPayStubEntryAccountByCompanyIDAndTypeAndFuzzyName( $this->company_id, 20, 'Advanced Percent 2' ), 'advanced_percent_1' => CompanyDeductionFactory::getPayStubEntryAccountByCompanyIDAndTypeAndFuzzyName( $this->company_id, 20, 'Advanced Percent 1' ), 'other2' => CompanyDeductionFactory::getPayStubEntryAccountByCompanyIDAndTypeAndFuzzyName( $this->company_id, 20, 'Other2' ), 'other' => CompanyDeductionFactory::getPayStubEntryAccountByCompanyIDAndTypeAndFuzzyName( $this->company_id, 20, 'Other' ), ]; return true; } function createPayStubAccounts() { Debug::text( 'Saving.... Employee Deduction - Other', __FILE__, __LINE__, __METHOD__, 10 ); $pseaf = new PayStubEntryAccountFactory(); $pseaf->setCompany( $this->company_id ); $pseaf->setStatus( 10 ); $pseaf->setType( 20 ); $pseaf->setName( 'Other' ); $pseaf->setOrder( 290 ); if ( $pseaf->isValid() ) { $pseaf->Save(); } Debug::text( 'Saving.... Employee Deduction - Other2', __FILE__, __LINE__, __METHOD__, 10 ); $pseaf = new PayStubEntryAccountFactory(); $pseaf->setCompany( $this->company_id ); $pseaf->setStatus( 10 ); $pseaf->setType( 20 ); $pseaf->setName( 'Other2' ); $pseaf->setOrder( 291 ); if ( $pseaf->isValid() ) { $pseaf->Save(); } Debug::text( 'Saving.... Employee Deduction - Custom1', __FILE__, __LINE__, __METHOD__, 10 ); $pseaf = new PayStubEntryAccountFactory(); $pseaf->setCompany( $this->company_id ); $pseaf->setStatus( 10 ); $pseaf->setType( 20 ); $pseaf->setName( 'Custom1' ); $pseaf->setOrder( 291 ); if ( $pseaf->isValid() ) { $pseaf->Save(); } Debug::text( 'Saving.... Employee Deduction - Custom2', __FILE__, __LINE__, __METHOD__, 10 ); $pseaf = new PayStubEntryAccountFactory(); $pseaf->setCompany( $this->company_id ); $pseaf->setStatus( 10 ); $pseaf->setType( 20 ); $pseaf->setName( 'Custom2' ); $pseaf->setOrder( 291 ); if ( $pseaf->isValid() ) { $pseaf->Save(); } Debug::text( 'Saving.... Employee Deduction - Advanced Percent 1', __FILE__, __LINE__, __METHOD__, 10 ); $pseaf = new PayStubEntryAccountFactory(); $pseaf->setCompany( $this->company_id ); $pseaf->setStatus( 10 ); $pseaf->setType( 20 ); $pseaf->setName( 'Advanced Percent 1' ); $pseaf->setOrder( 291 ); if ( $pseaf->isValid() ) { $pseaf->Save(); } Debug::text( 'Saving.... Employee Deduction - Advanced Percent 2', __FILE__, __LINE__, __METHOD__, 10 ); $pseaf = new PayStubEntryAccountFactory(); $pseaf->setCompany( $this->company_id ); $pseaf->setStatus( 10 ); $pseaf->setType( 20 ); $pseaf->setName( 'Advanced Percent 2' ); $pseaf->setOrder( 291 ); if ( $pseaf->isValid() ) { $pseaf->Save(); } Debug::text( 'Saving.... Employee Deduction - EI', __FILE__, __LINE__, __METHOD__, 10 ); $pseaf = new PayStubEntryAccountFactory(); $pseaf->setCompany( $this->company_id ); $pseaf->setStatus( 10 ); $pseaf->setType( 20 ); $pseaf->setName( 'EI' ); $pseaf->setOrder( 292 ); if ( $pseaf->isValid() ) { $pseaf->Save(); } Debug::text( 'Saving.... Employee Deduction - CPP', __FILE__, __LINE__, __METHOD__, 10 ); $pseaf = new PayStubEntryAccountFactory(); $pseaf->setCompany( $this->company_id ); $pseaf->setStatus( 10 ); $pseaf->setType( 20 ); $pseaf->setName( 'CPP' ); $pseaf->setOrder( 293 ); if ( $pseaf->isValid() ) { $pseaf->Save(); } /* //Do this in createPayStubEntryAccountLink() instead, otherwise we have to deal with multiple account link records. //Link Account EI and CPP accounts $pseallf = new PayStubEntryAccountLinkListFactory(); $pseallf->getByCompanyId( $this->company_id ); if ( $pseallf->getRecordCount() == 1 ) { $pseal_obj = $pseallf->getCurrent(); Debug::text('PayStubEntryAccountLink ID: '. $pseal_obj->getID(), __FILE__, __LINE__, __METHOD__, 10); $pseal_obj->setEmployeeEI( CompanyDeductionFactory::getPayStubEntryAccountByCompanyIDAndTypeAndFuzzyName($this->company_id, 20, 'EI') ); $pseal_obj->setEmployeeCPP( CompanyDeductionFactory::getPayStubEntryAccountByCompanyIDAndTypeAndFuzzyName($this->company_id, 20, 'CPP') ); $pseal_obj->Save(); } else { Debug::text('PayStubEntryAccountLink ID: FAILED!', __FILE__, __LINE__, __METHOD__, 10); } */ return true; } function createCompanyDeductions() { //Vacation Accrual Calculation. $cdf = new CompanyDeductionFactory(); $cdf->setCompany( $this->company_id ); $cdf->setLegalEntity( $this->legal_entity_id ); $cdf->setStatus( 10 ); //Enabled $cdf->setType( 20 ); //Deduction $cdf->setName( 'Vacation Accrual' ); $cdf->setCalculation( 10 ); $cdf->setCalculationOrder( 50 ); //$cdf->setPayStubEntryAccount( $vacation_accrual_id ); $cdf->setPayStubEntryAccount( CompanyDeductionFactory::getPayStubEntryAccountByCompanyIDAndTypeAndFuzzyName( $this->company_id, 50, 'Vacation Accrual' ) ); $cdf->setUserValue1( 4 ); if ( $cdf->isValid() ) { $cdf->Save( false ); $cdf->setIncludePayStubEntryAccount( [ CompanyDeductionFactory::getPayStubEntryAccountByCompanyIDAndTypeAndFuzzyName( $this->company_id, 40, 'Total Gross' ) ] ); if ( $cdf->isValid() ) { $cdf->Save(); } } //Test Wage Base amount $cdf = new CompanyDeductionFactory(); $cdf->setCompany( $this->company_id ); $cdf->setLegalEntity( $this->legal_entity_id ); $cdf->setStatus( 10 ); //Enabled $cdf->setType( 10 ); //Tax $cdf->setName( 'Union Dues' ); $cdf->setCalculation( 15 ); $cdf->setCalculationOrder( 90 ); $cdf->setPayStubEntryAccount( CompanyDeductionFactory::getPayStubEntryAccountByCompanyIDAndTypeAndFuzzyName( $this->company_id, 20, 'Union Dues' ) ); $cdf->setUserValue1( 1 ); //10% $cdf->setUserValue2( 3000 ); if ( $cdf->isValid() ) { $cdf->Save( false ); $cdf->setIncludePayStubEntryAccount( [ $this->pay_stub_account_link_arr['total_gross'] ] ); if ( $cdf->isValid() ) { $cdf->Save(); } } //Test Wage Exempt Amount $cdf = new CompanyDeductionFactory(); $cdf->setCompany( $this->company_id ); $cdf->setLegalEntity( $this->legal_entity_id ); $cdf->setStatus( 10 ); //Enabled $cdf->setType( 10 ); //Tax $cdf->setName( 'Union Dues2' ); $cdf->setCalculation( 15 ); $cdf->setCalculationOrder( 90 ); $cdf->setPayStubEntryAccount( CompanyDeductionFactory::getPayStubEntryAccountByCompanyIDAndTypeAndFuzzyName( $this->company_id, 20, 'Other' ) ); $cdf->setUserValue1( 10 ); //10% //$cdf->setUserValue2( 0 ); $cdf->setUserValue3( '78, 000' ); //Annual -- Test with commas in the values to make sure they are handled properly. if ( $cdf->isValid() ) { $cdf->Save( false ); $cdf->setIncludePayStubEntryAccount( [ $this->pay_stub_account_link_arr['total_gross'] ] ); if ( $cdf->isValid() ) { $cdf->Save(); } } //Test Advanced Percent Calculation maximum amount. $cdf = new CompanyDeductionFactory(); $cdf->setCompany( $this->company_id ); $cdf->setLegalEntity( $this->legal_entity_id ); $cdf->setStatus( 10 ); //Enabled $cdf->setType( 10 ); //Tax $cdf->setName( 'Test Advanced Percent 1' ); $cdf->setCalculation( 15 ); $cdf->setCalculationOrder( 90 ); $cdf->setPayStubEntryAccount( CompanyDeductionFactory::getPayStubEntryAccountByCompanyIDAndTypeAndFuzzyName( $this->company_id, 20, 'Advanced Percent 1' ) ); $cdf->setUserValue1( 1 ); //1% $cdf->setUserValue2( 2000 ); //Wage Base if ( $cdf->isValid() ) { $cdf->Save( false ); $cdf->setIncludePayStubEntryAccount( [ $this->pay_stub_account_link_arr['regular_time'] ] ); if ( $cdf->isValid() ) { $cdf->Save(); } } //Test Advanced Percent Calculation maximum amount. $cdf = new CompanyDeductionFactory(); $cdf->setCompany( $this->company_id ); $cdf->setLegalEntity( $this->legal_entity_id ); $cdf->setStatus( 10 ); //Enabled $cdf->setType( 10 ); //Tax $cdf->setName( 'Test Advanced Percent 2' ); $cdf->setCalculation( 15 ); $cdf->setCalculationOrder( 90 ); $cdf->setPayStubEntryAccount( CompanyDeductionFactory::getPayStubEntryAccountByCompanyIDAndTypeAndFuzzyName( $this->company_id, 20, 'Advanced Percent 2' ) ); $cdf->setUserValue1( 1 ); //1% $cdf->setUserValue2( 2500 ); //Wage Base if ( $cdf->isValid() ) { $cdf->Save( false ); $cdf->setIncludePayStubEntryAccount( [ $this->pay_stub_account_link_arr['regular_time'] ] ); if ( $cdf->isValid() ) { $cdf->Save(); } } if ( getTTProductEdition() >= TT_PRODUCT_PROFESSIONAL ) { $cdf = new CompanyDeductionFactory(); $cdf->setCompany( $this->company_id ); $cdf->setLegalEntity( $this->legal_entity_id ); $cdf->setStatus( 10 ); $cdf->setType( 30 ); $cdf->setName( 'Test Custom Formula' ); $cdf->setCalculation( 69 ); $cdf->setCalculationOrder( 80 ); $cdf->setPayStubEntryAccount( CompanyDeductionFactory::getPayStubEntryAccountByCompanyIDAndTypeAndFuzzyName( $this->company_id, 20, 'Other2' ) ); $cdf->setCompanyValue1( "(#custom_value1#+#custom_value2#+#custom_value3#+#custom_value4#+#custom_value5#+#custom_value6#+#custom_value7#+#custom_value8#+#custom_value9#+#custom_value10#)/100" ); $cdf->setUserValue1( 10 ); $cdf->setUserValue2( 20 ); $cdf->setUserValue3( 30 ); $cdf->setUserValue4( 40 ); $cdf->setUserValue5( 50 ); $cdf->setUserValue6( 60 ); $cdf->setUserValue7( 70 ); $cdf->setUserValue8( 80 ); $cdf->setUserValue9( 90 ); $cdf->setUserValue10( 100 ); if ( $cdf->isValid() ) { $cdf->Save( false ); $cdf->setIncludePayStubEntryAccount( [ $this->pay_stub_account_link_arr['total_deductions'] ] ); if ( $cdf->isValid() ) { $cdf->Save(); } } $cdf = new CompanyDeductionFactory(); $cdf->setCompany( $this->company_id ); $cdf->setLegalEntity( $this->legal_entity_id ); $cdf->setStatus( 10 ); $cdf->setType( 20 ); $cdf->setName( 'Test Custom Formula 1' ); $cdf->setCalculation( 69 ); $cdf->setCalculationOrder( 80 ); $cdf->setPayStubEntryAccount( CompanyDeductionFactory::getPayStubEntryAccountByCompanyIDAndTypeAndFuzzyName( $this->company_id, 20, 'Custom1' ) ); $cdf->setCompanyValue1( "(#custom_value1#*((#custom_value2#+#custom_value3#)*#custom_value4#/#custom_value5#)+#custom_value6#/(#custom_value7#+#custom_value8#)+#custom_value9#+#custom_value10#)/100" ); $cdf->setUserValue1( 45 ); $cdf->setUserValue2( 20 ); $cdf->setUserValue3( 30 ); $cdf->setUserValue4( 40 ); $cdf->setUserValue5( 78.12 ); $cdf->setUserValue6( 60 ); $cdf->setUserValue7( 44.34 ); $cdf->setUserValue8( 33 ); $cdf->setUserValue9( 90 ); $cdf->setUserValue10( 8 ); if ( $cdf->isValid() ) { $cdf->Save( false ); $cdf->setIncludePayStubEntryAccount( [ $this->pay_stub_account_link_arr['total_deductions'] ] ); if ( $cdf->isValid() ) { $cdf->Save(); } } $cdf = new CompanyDeductionFactory(); $cdf->setCompany( $this->company_id ); $cdf->setLegalEntity( $this->legal_entity_id ); $cdf->setStatus( 10 ); $cdf->setType( 20 ); $cdf->setName( 'Test Custom Formula 2' ); $cdf->setCalculation( 69 ); $cdf->setCalculationOrder( 80 ); $cdf->setPayStubEntryAccount( CompanyDeductionFactory::getPayStubEntryAccountByCompanyIDAndTypeAndFuzzyName( $this->company_id, 20, 'Custom2' ) ); $cdf->setCompanyValue1( "values(n) = (#custom_value1#+#custom_value2#+#custom_value3#+#custom_value4#+#custom_value5#+#custom_value6#+#custom_value7#+#custom_value8#+#custom_value9#+#custom_value10#)/n include_amounts(n)=(#include_pay_stub_amount#+#include_pay_stub_ytd_amount#)/n exclude_amounts(n)=(#exclude_pay_stub_amount#+#exclude_pay_stub_ytd_amount#)/n (values(2)+include_amounts(3)+exclude_amounts(4)+#employee_hourly_rate#)/100" ); $cdf->setUserValue1( 0.23 ); $cdf->setUserValue2( 1114.65 ); $cdf->setUserValue3( 30 ); $cdf->setUserValue4( 40.55 ); $cdf->setUserValue5( 55.55 ); $cdf->setUserValue6( 32.33 ); $cdf->setUserValue7( 44.34 ); $cdf->setUserValue8( 21 ); $cdf->setUserValue9( 47 ); $cdf->setUserValue10( 8 ); if ( $cdf->isValid() ) { $cdf->Save( false ); $cdf->setIncludePayStubEntryAccount( [ //$this->pay_stub_account_link_arr['total_deductions'], //$this->pay_stub_account_link_arr['employer_contribution'], $this->pay_stub_account_link_arr['regular_time'], $this->pay_stub_account_link_arr['vacation_accrual'], $this->pay_stub_account_link_arr['advanced_percent_1'], $this->pay_stub_account_link_arr['cpp'], $this->pay_stub_account_link_arr['ei'], ] ); $cdf->setExcludePayStubEntryAccount( [ //$this->pay_stub_account_link_arr['vacation_accrual_release'], $this->pay_stub_account_link_arr['total_gross'], //$this->pay_stub_account_link_arr['other2'], ] ); if ( $cdf->isValid() ) { $cdf->Save(); } } } $cdf = new CompanyDeductionFactory(); $cdf->setCompany( $this->company_id ); $cdf->setLegalEntity( $this->legal_entity_id ); $cdf->setStatus( 10 ); //Enabled $cdf->setType( 10 ); //Tax $cdf->setName( 'EI - Employee' ); $cdf->setCalculation( 91 ); //EI Formula $cdf->setCalculationOrder( 90 ); $cdf->setPayStubEntryAccount( CompanyDeductionFactory::getPayStubEntryAccountByCompanyIDAndTypeAndFuzzyName( $this->company_id, 20, 'EI' ) ); if ( $cdf->isValid() ) { $cdf->Save( false ); $cdf->setIncludePayStubEntryAccount( [ $this->pay_stub_account_link_arr['total_gross'] ] ); if ( $cdf->isValid() ) { $cdf->Save(); } } $cdf = new CompanyDeductionFactory(); $cdf->setCompany( $this->company_id ); $cdf->setLegalEntity( $this->legal_entity_id ); $cdf->setStatus( 10 ); //Enabled $cdf->setType( 10 ); //Tax $cdf->setName( 'CPP - Employee' ); $cdf->setCalculation( 90 ); //CPP Formula $cdf->setCalculationOrder( 91 ); $cdf->setPayStubEntryAccount( CompanyDeductionFactory::getPayStubEntryAccountByCompanyIDAndTypeAndFuzzyName( $this->company_id, 20, 'CPP' ) ); if ( $cdf->isValid() ) { $cdf->Save( false ); $cdf->setIncludePayStubEntryAccount( [ $this->pay_stub_account_link_arr['total_gross'] ] ); if ( $cdf->isValid() ) { $cdf->Save(); } } return true; } function createPayPeriodSchedule() { $ppsf = new PayPeriodScheduleFactory(); $ppsf->setCompany( $this->company_id ); //$ppsf->setName( 'Bi-Weekly'.rand(1000,9999) ); $ppsf->setName( 'Bi-Weekly' ); $ppsf->setDescription( 'Pay every two weeks' ); $ppsf->setType( 20 ); $ppsf->setStartWeekDay( 0 ); $anchor_date = TTDate::getBeginWeekEpoch( TTDate::getBeginYearEpoch() ); //Start 6 weeks ago $ppsf->setAnchorDate( $anchor_date ); $ppsf->setStartDayOfWeek( TTDate::getDayOfWeek( $anchor_date ) ); $ppsf->setTransactionDate( 7 ); $ppsf->setTransactionDateBusinessDay( true ); $ppsf->setTimeZone( 'America/Vancouver' ); $ppsf->setDayStartTime( 0 ); $ppsf->setNewDayTriggerTime( ( 4 * 3600 ) ); $ppsf->setMaximumShiftTime( ( 16 * 3600 ) ); $ppsf->setEnableInitialPayPeriods( false ); if ( $ppsf->isValid() ) { $insert_id = $ppsf->Save( false ); Debug::Text( 'Pay Period Schedule ID: ' . $insert_id, __FILE__, __LINE__, __METHOD__, 10 ); $ppsf->setUser( [ $this->user_id ] ); $ppsf->Save(); $this->pay_period_schedule_id = $insert_id; return $insert_id; } Debug::Text( 'Failed Creating Pay Period Schedule!', __FILE__, __LINE__, __METHOD__, 10 ); return false; } function createPayPeriods() { $max_pay_periods = 5; $ppslf = new PayPeriodScheduleListFactory(); $ppslf->getById( $this->pay_period_schedule_id ); if ( $ppslf->getRecordCount() > 0 ) { $pps_obj = $ppslf->getCurrent(); $end_date = null; for ( $i = 0; $i < $max_pay_periods; $i++ ) { if ( $i == 0 ) { $end_date = TTDate::getBeginYearEpoch( strtotime( '01-Jan-06' ) ); } else { $end_date = TTDate::incrementDate( $end_date, 14, 'day' ); } Debug::Text( 'I: ' . $i . ' End Date: ' . TTDate::getDate( 'DATE+TIME', $end_date ), __FILE__, __LINE__, __METHOD__, 10 ); $pps_obj->createNextPayPeriod( $end_date, ( 86400 + 3600 ), false ); //Don't import punches, as that causes deadlocks when running tests in parallel. } } return true; } function getAllPayPeriods() { $pplf = new PayPeriodListFactory(); //$pplf->getByCompanyId( $this->company_id ); $pplf->getByPayPeriodScheduleId( $this->pay_period_schedule_id ); if ( $pplf->getRecordCount() > 0 ) { foreach ( $pplf as $pp_obj ) { Debug::text( 'Pay Period... Start: ' . TTDate::getDate( 'DATE+TIME', $pp_obj->getStartDate() ) . ' End: ' . TTDate::getDate( 'DATE+TIME', $pp_obj->getEndDate() ), __FILE__, __LINE__, __METHOD__, 10 ); $this->pay_period_objs[] = $pp_obj; } } $this->pay_period_objs = array_reverse( $this->pay_period_objs ); return true; } function getPayStubEntryArray( $pay_stub_id ) { //Check Pay Stub to make sure it was created correctly. $pself = new PayStubEntryListFactory(); $pself->getByPayStubId( $pay_stub_id ); if ( $pself->getRecordCount() > 0 ) { foreach ( $pself as $pse_obj ) { $ps_entry_arr[$pse_obj->getPayStubEntryNameId()][] = [ 'rate' => Misc::MoneyRound( $pse_obj->getRate() ), 'units' => Misc::MoneyRound( $pse_obj->getUnits() ), 'amount' => Misc::MoneyRound( $pse_obj->getAmount() ), 'ytd_amount' => Misc::MoneyRound( $pse_obj->getYTDAmount() ), ]; } } if ( isset( $ps_entry_arr ) ) { return $ps_entry_arr; } return false; } function getPayStubTransactionArray( $pay_stub_id ) { $pstlf = new PayStubTransactionListFactory(); $pstlf->getByPayStubId( $pay_stub_id ); if ( $pstlf->getRecordCount() > 0 ) { foreach ( $pstlf as $pst_obj ) { $retarr[] = $pst_obj->getObjectAsArray(); } } if ( isset( $retarr ) ) { return $retarr; } return false; } function createPunchData() { global $dd; $punch_date = $this->pay_period_objs[0]->getStartDate(); $end_punch_date = $this->pay_period_objs[0]->getEndDate(); $i = 0; while ( $punch_date <= $end_punch_date ) { $date_stamp = TTDate::getDate( 'DATE', $punch_date ); //$punch_full_time_stamp = strtotime($pc_data['date_stamp'].' '.$pc_data['time_stamp']); $dd->createPunchPair( $this->user_id, strtotime( $date_stamp . ' 08:00AM' ), strtotime( $date_stamp . ' 11:00AM' ), [ 'in_type_id' => 10, 'out_type_id' => 10, 'branch_id' => 0, 'department_id' => 0, 'job_id' => 0, 'job_item_id' => 0, ] ); $dd->createPunchPair( $this->user_id, strtotime( $date_stamp . ' 11:00AM' ), strtotime( $date_stamp . ' 1:00PM' ), [ 'in_type_id' => 10, 'out_type_id' => 20, 'branch_id' => 0, 'department_id' => 0, 'job_id' => 0, 'job_item_id' => 0, ] ); $dd->createPunchPair( $this->user_id, strtotime( $date_stamp . ' 2:00PM' ), strtotime( $date_stamp . ' 6:00PM' ), [ 'in_type_id' => 20, 'out_type_id' => 10, 'branch_id' => 0, 'department_id' => 0, 'job_id' => 0, 'job_item_id' => 0, ] ); $punch_date += 86400; $i++; } unset( $punch_options_arr, $punch_date, $user_id ); } function addPayStubAmendments() { //Regular FIXED PS amendment $psaf = new PayStubAmendmentFactory(); $psaf->setUser( $this->user_id ); $psaf->setPayStubEntryNameId( CompanyDeductionFactory::getPayStubEntryAccountByCompanyIDAndTypeAndFuzzyName( $this->company_id, 10, 'Bonus' ) ); $psaf->setStatus( 50 ); //Active $psaf->setType( 10 ); $psaf->setRate( 10 ); $psaf->setUnits( 10 ); $psaf->setDescription( 'Test Fixed PS Amendment' ); $psaf->setEffectiveDate( $this->pay_period_objs[0]->getEndDate() ); $psaf->setAuthorized( true ); if ( $psaf->isValid() ) { $psaf->Save(); } //Regular percent PS amendment $psaf = new PayStubAmendmentFactory(); $psaf->setUser( $this->user_id ); $psaf->setPayStubEntryNameId( CompanyDeductionFactory::getPayStubEntryAccountByCompanyIDAndTypeAndFuzzyName( $this->company_id, 10, 'Commission' ) ); $psaf->setStatus( 50 ); //Active $psaf->setType( 20 ); $psaf->setPercentAmount( 10 ); //10% $psaf->setPercentAmountEntryNameId( CompanyDeductionFactory::getPayStubEntryAccountByCompanyIDAndTypeAndFuzzyName( $this->company_id, 10, 'Regular Time' ) ); $psaf->setDescription( 'Test Percent PS Amendment' ); $psaf->setEffectiveDate( $this->pay_period_objs[0]->getEndDate() ); $psaf->setAuthorized( true ); if ( $psaf->isValid() ) { $psaf->Save(); } //Vacation Accrual Release percent PS amendment $psaf = new PayStubAmendmentFactory(); $psaf->setUser( $this->user_id ); $psaf->setPayStubEntryNameId( CompanyDeductionFactory::getPayStubEntryAccountByCompanyIDAndTypeAndFuzzyName( $this->company_id, 10, 'Vacation - Accrual Release' ) ); $psaf->setStatus( 50 ); //Active $psaf->setType( 20 ); $psaf->setPercentAmount( 50 ); //50% - Leave some balance to check against. $psaf->setPercentAmountEntryNameId( CompanyDeductionFactory::getPayStubEntryAccountByCompanyIDAndTypeAndFuzzyName( $this->company_id, 50, 'Vacation Accrual' ) ); $psaf->setDescription( 'Test Vacation Release Percent PS Amendment' ); $psaf->setEffectiveDate( $this->pay_period_objs[0]->getEndDate() ); $psaf->setAuthorized( true ); if ( $psaf->isValid() ) { $psaf->Save(); } //YTD Adjustment FIXED PS amendment $psaf = new PayStubAmendmentFactory(); $psaf->setUser( $this->user_id ); $psaf->setPayStubEntryNameId( CompanyDeductionFactory::getPayStubEntryAccountByCompanyIDAndTypeAndFuzzyName( $this->company_id, 10, 'Premium 2' ) ); $psaf->setStatus( 50 ); //Active $psaf->setType( 10 ); $psaf->setAmount( 1.99 ); $psaf->setYTDAdjustment( true ); $psaf->setDescription( 'Test YTD PS Amendment' ); $psaf->setEffectiveDate( $this->pay_period_objs[0]->getEndDate() ); $psaf->setAuthorized( true ); if ( $psaf->isValid() ) { $psaf->Save(); } //YTD Adjustment FIXED PS amendment $psaf = new PayStubAmendmentFactory(); $psaf->setUser( $this->user_id ); $psaf->setPayStubEntryNameId( CompanyDeductionFactory::getPayStubEntryAccountByCompanyIDAndTypeAndFuzzyName( $this->company_id, 10, 'Commission' ) ); $psaf->setStatus( 50 ); //Active $psaf->setType( 10 ); //$psaf->setAmount( 0.09 ); $psaf->setAmount( 1000 ); //Increase this so Union Dues are closer to the maximum earnings and are calculated to be less. $psaf->setYTDAdjustment( true ); $psaf->setDescription( 'Test YTD (2) PS Amendment' ); $psaf->setEffectiveDate( $this->pay_period_objs[0]->getEndDate() ); $psaf->setAuthorized( true ); if ( $psaf->isValid() ) { $psaf->Save(); } //YTD Adjustment FIXED PS amendment for testing Maximum EI contribution $psaf = new PayStubAmendmentFactory(); $psaf->setUser( $this->user_id ); $psaf->setPayStubEntryNameId( CompanyDeductionFactory::getPayStubEntryAccountByCompanyIDAndTypeAndFuzzyName( $this->company_id, 20, 'EI' ) ); $psaf->setStatus( 50 ); //Active $psaf->setType( 10 ); $psaf->setAmount( 700.00 ); $psaf->setYTDAdjustment( true ); $psaf->setDescription( 'Test EI YTD PS Amendment' ); $psaf->setEffectiveDate( $this->pay_period_objs[0]->getEndDate() ); $psaf->setAuthorized( true ); if ( $psaf->isValid() ) { $psaf->Save(); } //YTD Adjustment FIXED PS amendment for testing Maximum CPP contribution $psaf = new PayStubAmendmentFactory(); $psaf->setUser( $this->user_id ); $psaf->setPayStubEntryNameId( CompanyDeductionFactory::getPayStubEntryAccountByCompanyIDAndTypeAndFuzzyName( $this->company_id, 20, 'CPP' ) ); $psaf->setStatus( 50 ); //Active $psaf->setType( 10 ); $psaf->setAmount( 1900.00 ); $psaf->setYTDAdjustment( true ); $psaf->setDescription( 'Test CPP YTD PS Amendment' ); $psaf->setEffectiveDate( $this->pay_period_objs[0]->getEndDate() ); $psaf->setAuthorized( true ); if ( $psaf->isValid() ) { $psaf->Save(); } //YTD Adjustment FIXED PS amendment for testing Vacation Accrual totaling issues. $psaf = new PayStubAmendmentFactory(); $psaf->setUser( $this->user_id ); $psaf->setPayStubEntryNameId( CompanyDeductionFactory::getPayStubEntryAccountByCompanyIDAndTypeAndFuzzyName( $this->company_id, 50, 'Vacation Accrual' ) ); $psaf->setStatus( 50 ); //Active $psaf->setType( 10 ); $psaf->setAmount( 99.01 ); $psaf->setYTDAdjustment( true ); $psaf->setDescription( 'Test Vacation Accrual YTD PS Amendment' ); $psaf->setEffectiveDate( $this->pay_period_objs[0]->getEndDate() ); $psaf->setAuthorized( true ); if ( $psaf->isValid() ) { $psaf->Save(); } // // Add EARNING PS amendments for a pay period that has no Punch hours. // Include a regular time adjustment so we can test Wage Base amounts for some tax/deductions. //Regular FIXED PS amendment as regular time. $psaf = new PayStubAmendmentFactory(); $psaf->setUser( $this->user_id ); $psaf->setPayStubEntryNameId( CompanyDeductionFactory::getPayStubEntryAccountByCompanyIDAndTypeAndFuzzyName( $this->company_id, 10, 'Regular Time' ) ); $psaf->setStatus( 50 ); //Active $psaf->setType( 10 ); $psaf->setRate( 33.33 ); $psaf->setUnits( 3 ); $psaf->setDescription( 'Test Fixed PS Amendment (1)' ); $psaf->setEffectiveDate( $this->pay_period_objs[1]->getEndDate() ); $psaf->setAuthorized( true ); if ( $psaf->isValid() ) { $psaf->Save(); } //Regular FIXED PS amendment as Bonus $psaf = new PayStubAmendmentFactory(); $psaf->setUser( $this->user_id ); $psaf->setPayStubEntryNameId( CompanyDeductionFactory::getPayStubEntryAccountByCompanyIDAndTypeAndFuzzyName( $this->company_id, 10, 'Bonus' ) ); $psaf->setStatus( 50 ); //Active $psaf->setType( 10 ); $psaf->setRate( 10 ); $psaf->setUnits( 30 ); $psaf->setDescription( 'Test Fixed PS Amendment (2)' ); $psaf->setEffectiveDate( $this->pay_period_objs[1]->getEndDate() ); $psaf->setAuthorized( true ); if ( $psaf->isValid() ) { $psaf->Save(); } return true; } function createPayStub() { $cps = new CalculatePayStub(); $cps->setUser( $this->user_id ); $cps->setPayPeriod( $this->pay_period_objs[0]->getId() ); $cps->calculate(); //Pay stub for 2nd pay period $cps = new CalculatePayStub(); $cps->setUser( $this->user_id ); $cps->setPayPeriod( $this->pay_period_objs[1]->getId() ); $cps->calculate(); return true; } function getPayStub( $pay_period_id = false ) { if ( $pay_period_id == false ) { $pay_period_id = $this->pay_period_objs[0]->getId(); } $pslf = new PayStubListFactory(); $pslf->getByUserIdAndPayPeriodId( $this->user_id, $pay_period_id ); if ( $pslf->getRecordCount() > 0 ) { $retval = $pslf->getCurrent()->getId(); Debug::Text( ' Found Pay Stub ID: '. $retval, __FILE__, __LINE__, __METHOD__, 10 ); return $retval; } Debug::Text( 'ERROR: Pay Stub not found! User ID: '. $this->user_id .' Pay Period ID: '. $pay_period_id, __FILE__, __LINE__, __METHOD__, 10 ); return false; } /** * @group PayStubCalculation_testMain */ function testMain() { $this->addPayStubAmendments(); $this->createPayStub(); $pse_accounts = [ 'regular_time' => CompanyDeductionFactory::getPayStubEntryAccountByCompanyIDAndTypeAndFuzzyName( $this->company_id, 10, 'Regular Time' ), 'over_time_1' => CompanyDeductionFactory::getPayStubEntryAccountByCompanyIDAndTypeAndFuzzyName( $this->company_id, 10, 'Over Time 1' ), 'premium_1' => CompanyDeductionFactory::getPayStubEntryAccountByCompanyIDAndTypeAndFuzzyName( $this->company_id, 10, 'Premium 1' ), 'premium_2' => CompanyDeductionFactory::getPayStubEntryAccountByCompanyIDAndTypeAndFuzzyName( $this->company_id, 10, 'Premium 2' ), 'bonus' => CompanyDeductionFactory::getPayStubEntryAccountByCompanyIDAndTypeAndFuzzyName( $this->company_id, 10, 'Bonus' ), 'other' => CompanyDeductionFactory::getPayStubEntryAccountByCompanyIDAndTypeAndFuzzyName( $this->company_id, 10, 'Commission' ), 'vacation_accrual_release' => CompanyDeductionFactory::getPayStubEntryAccountByCompanyIDAndTypeAndFuzzyName( $this->company_id, 10, 'Vacation - Accrual Release' ), 'federal_income_tax' => CompanyDeductionFactory::getPayStubEntryAccountByCompanyIDAndTypeAndFuzzyName( $this->company_id, 20, 'US - Federal Income Tax' ), 'state_income_tax' => CompanyDeductionFactory::getPayStubEntryAccountByCompanyIDAndTypeAndFuzzyName( $this->company_id, 20, 'NY - State Income Tax' ), 'state_disability' => CompanyDeductionFactory::getPayStubEntryAccountByCompanyIDAndTypeAndFuzzyName( $this->company_id, 20, 'NY - Disability Insurance' ), 'medicare' => CompanyDeductionFactory::getPayStubEntryAccountByCompanyIDAndTypeAndFuzzyName( $this->company_id, 20, 'Medicare' ), 'union_dues' => CompanyDeductionFactory::getPayStubEntryAccountByCompanyIDAndTypeAndFuzzyName( $this->company_id, 20, 'Union Dues' ), 'advanced_percent_1' => CompanyDeductionFactory::getPayStubEntryAccountByCompanyIDAndTypeAndFuzzyName( $this->company_id, 20, 'Advanced Percent 1' ), 'advanced_percent_2' => CompanyDeductionFactory::getPayStubEntryAccountByCompanyIDAndTypeAndFuzzyName( $this->company_id, 20, 'Advanced Percent 2' ), 'deduction_other' => CompanyDeductionFactory::getPayStubEntryAccountByCompanyIDAndTypeAndFuzzyName( $this->company_id, 20, 'Other' ), 'ei' => CompanyDeductionFactory::getPayStubEntryAccountByCompanyIDAndTypeAndFuzzyName( $this->company_id, 20, 'ei' ), 'cpp' => CompanyDeductionFactory::getPayStubEntryAccountByCompanyIDAndTypeAndFuzzyName( $this->company_id, 20, 'cpp' ), 'employer_medicare' => CompanyDeductionFactory::getPayStubEntryAccountByCompanyIDAndTypeAndFuzzyName( $this->company_id, 30, 'Medicare' ), 'employer_fica' => CompanyDeductionFactory::getPayStubEntryAccountByCompanyIDAndTypeAndFuzzyName( $this->company_id, 30, 'Social Security (FICA)' ), 'vacation_accrual' => CompanyDeductionFactory::getPayStubEntryAccountByCompanyIDAndTypeAndFuzzyName( $this->company_id, 50, 'Vacation Accrual' ), ]; $pay_stub_id = $this->getPayStub(); $pse_arr = $this->getPayStubEntryArray( $pay_stub_id ); //var_dump($pse_accounts); //var_dump($pse_arr); $this->assertEquals( '2408.00', $pse_arr[$pse_accounts['regular_time']][0]['amount'] ); $this->assertEquals( '2408.00', $pse_arr[$pse_accounts['regular_time']][0]['ytd_amount'] ); $this->assertEquals( '451.50', $pse_arr[$pse_accounts['over_time_1']][0]['amount'] ); $this->assertEquals( '451.50', $pse_arr[$pse_accounts['over_time_1']][0]['ytd_amount'] ); $this->assertEquals( '47.88', $pse_arr[$pse_accounts['premium_1']][0]['amount'] ); $this->assertEquals( '47.88', $pse_arr[$pse_accounts['premium_1']][0]['ytd_amount'] ); $this->assertEquals( '10.00', $pse_arr[$pse_accounts['bonus']][0]['rate'] ); $this->assertEquals( '10.00', $pse_arr[$pse_accounts['bonus']][0]['units'] ); $this->assertEquals( '100.00', $pse_arr[$pse_accounts['bonus']][0]['amount'] ); $this->assertEquals( '100.00', $pse_arr[$pse_accounts['bonus']][0]['ytd_amount'] ); //NOTICE: After switching to UUID, it caused ordering by ID (specifically in CalculatePayStub->getOrderedDeductionAndPSAmendment() ) to be inconsistent from one run to the next. // This casued failures here because 240.80 and 1000.00 could be in reverse order. // In this case, the sort order doesn't really matter, as long as its consistent, which it would be for customers. // However when running unit tests it can switch from one test to another, so lets account for that. //YTD adjustment if ( $pse_arr[$pse_accounts['other']][0]['amount'] == '240.80' ) { $this->assertEquals( '240.80', $pse_arr[$pse_accounts['other']][0]['amount'] ); $this->assertEquals( '0.00', $pse_arr[$pse_accounts['other']][0]['ytd_amount'] ); //Fixed amount PS amendment $this->assertEquals( '1000.00', $pse_arr[$pse_accounts['other']][1]['amount'] ); $this->assertEquals( '1240.80', $pse_arr[$pse_accounts['other']][1]['ytd_amount'] ); } else { //Fixed amount PS amendment $this->assertEquals( '1000.00', $pse_arr[$pse_accounts['other']][0]['amount'] ); $this->assertEquals( '0.00', $pse_arr[$pse_accounts['other']][0]['ytd_amount'] ); $this->assertEquals( '240.80', $pse_arr[$pse_accounts['other']][1]['amount'] ); $this->assertEquals( '1240.80', $pse_arr[$pse_accounts['other']][1]['ytd_amount'] ); } $this->assertEquals( '10.00', $pse_arr[$pse_accounts['premium_2']][0]['amount'] ); $this->assertEquals( '0.00', $pse_arr[$pse_accounts['premium_2']][0]['ytd_amount'] ); $this->assertEquals( '1.99', $pse_arr[$pse_accounts['premium_2']][1]['amount'] ); $this->assertEquals( '11.99', $pse_arr[$pse_accounts['premium_2']][1]['ytd_amount'] ); //Vacation accrual release $this->assertEquals( '114.67', $pse_arr[$pse_accounts['vacation_accrual_release']][0]['amount'] ); $this->assertEquals( '114.67', $pse_arr[$pse_accounts['vacation_accrual_release']][0]['ytd_amount'] ); //Vacation accrual deduction $this->assertEquals( '99.01', $pse_arr[$pse_accounts['vacation_accrual']][0]['amount'] ); $this->assertEquals( '0.00', $pse_arr[$pse_accounts['vacation_accrual']][0]['ytd_amount'] ); $this->assertEquals( '130.33', $pse_arr[$pse_accounts['vacation_accrual']][1]['amount'] ); $this->assertEquals( '0.00', $pse_arr[$pse_accounts['vacation_accrual']][1]['ytd_amount'] ); $this->assertEquals( '-114.67', $pse_arr[$pse_accounts['vacation_accrual']][2]['amount'] ); $this->assertEquals( '114.67', $pse_arr[$pse_accounts['vacation_accrual']][2]['ytd_amount'] ); //Union Dues - Should be 19.98 due to getting close to hitting Wage Base, because a YTD adjustment for Total Gross exists for around 1001.99. $this->assertEquals( '19.98', $pse_arr[$pse_accounts['union_dues']][0]['amount'] ); $this->assertEquals( '19.98', $pse_arr[$pse_accounts['union_dues']][0]['ytd_amount'] ); //Advanced Percent $this->assertEquals( '20.00', $pse_arr[$pse_accounts['advanced_percent_1']][0]['amount'] ); $this->assertEquals( '20.00', $pse_arr[$pse_accounts['advanced_percent_1']][0]['ytd_amount'] ); //Exceeds Wage Base $this->assertEquals( '24.08', $pse_arr[$pse_accounts['advanced_percent_2']][0]['amount'] ); $this->assertEquals( '24.08', $pse_arr[$pse_accounts['advanced_percent_2']][0]['ytd_amount'] ); //Not close to Wage Base. $this->assertEquals( '37.29', $pse_arr[$pse_accounts['deduction_other']][0]['amount'] ); $this->assertEquals( '37.29', $pse_arr[$pse_accounts['deduction_other']][0]['ytd_amount'] ); //EI $this->assertEquals( '700.00', $pse_arr[$pse_accounts['ei']][0]['amount'] ); $this->assertEquals( '0.00', $pse_arr[$pse_accounts['ei']][0]['ytd_amount'] ); $this->assertEquals( '29.30', $pse_arr[$pse_accounts['ei']][1]['amount'] ); //HAS TO BE 29.30, as it reached maximum contribution. $this->assertEquals( '729.30', $pse_arr[$pse_accounts['ei']][1]['ytd_amount'] ); //CPP $this->assertEquals( '1900.00', $pse_arr[$pse_accounts['cpp']][0]['amount'] ); $this->assertEquals( '0.00', $pse_arr[$pse_accounts['cpp']][0]['ytd_amount'] ); $this->assertEquals( '10.70', $pse_arr[$pse_accounts['cpp']][1]['amount'] ); $this->assertEquals( '1910.70', $pse_arr[$pse_accounts['cpp']][1]['ytd_amount'] ); if ( $pse_arr[$pse_accounts['federal_income_tax']][0]['amount'] >= 600 && $pse_arr[$pse_accounts['federal_income_tax']][0]['amount'] <= 800 ) { $this->assertTrue( true ); } else { $this->assertTrue( false, 'Federal Income Tax not within range! Amount: ' . $pse_arr[$pse_accounts['federal_income_tax']][0]['amount'] ); } if ( $pse_arr[$pse_accounts['state_income_tax']][0]['amount'] >= 100 && $pse_arr[$pse_accounts['state_income_tax']][0]['amount'] <= 300 ) { $this->assertTrue( true ); } else { $this->assertTrue( false, 'State Income Tax not within range! Amount: ' . $pse_arr[$pse_accounts['state_income_tax']][0]['amount'] ); } if ( $pse_arr[$pse_accounts['medicare']][0]['amount'] >= 10 && $pse_arr[$pse_accounts['medicare']][0]['amount'] <= 100 ) { $this->assertTrue( true ); } else { $this->assertTrue( false, 'Medicare not within range!' ); } if ( $pse_arr[$pse_accounts['state_disability']][0]['amount'] >= 2 && $pse_arr[$pse_accounts['state_disability']][0]['amount'] <= 50 ) { $this->assertTrue( true ); } else { $this->assertTrue( false, 'State Disability not within range!' ); } if ( $pse_arr[$pse_accounts['employer_medicare']][0]['amount'] >= 10 && $pse_arr[$pse_accounts['employer_medicare']][0]['amount'] <= 100 ) { $this->assertTrue( true ); } else { $this->assertTrue( false, 'Employer Medicare not within range!' ); } if ( $pse_arr[$pse_accounts['employer_fica']][0]['amount'] >= 100 && $pse_arr[$pse_accounts['employer_fica']][0]['amount'] <= 250 ) { $this->assertTrue( true ); } else { $this->assertTrue( false, 'Employer FICA not within range!' ); } if ( $pse_arr[$this->pay_stub_account_link_arr['total_gross']][0]['amount'] >= 3300 && $pse_arr[$this->pay_stub_account_link_arr['total_gross']][0]['amount'] <= 3450 && ( $pse_arr[$this->pay_stub_account_link_arr['total_gross']][0]['amount'] + ( 1000 + 1.99 ) ) == $pse_arr[$this->pay_stub_account_link_arr['total_gross']][0]['ytd_amount'] ) { $this->assertTrue( true ); } else { $this->assertTrue( false, 'Total Gross not within range!' ); } if ( $pse_arr[$this->pay_stub_account_link_arr['total_deductions']][0]['amount'] >= 1300 && $pse_arr[$this->pay_stub_account_link_arr['total_deductions']][0]['amount'] <= 1500 && ( bcadd( $pse_arr[$this->pay_stub_account_link_arr['total_deductions']][0]['amount'], 2600 ) ) == $pse_arr[$this->pay_stub_account_link_arr['total_deductions']][0]['ytd_amount'] ) { $this->assertTrue( true ); } else { $this->assertTrue( false, 'Total Deductions not within range! Amount: ' . $pse_arr[$this->pay_stub_account_link_arr['total_deductions']][0]['amount'] . ' YTD Amount: ' . $pse_arr[$this->pay_stub_account_link_arr['total_deductions']][0]['ytd_amount'] ); } if ( $pse_arr[$this->pay_stub_account_link_arr['net_pay']][0]['amount'] >= 1800 && $pse_arr[$this->pay_stub_account_link_arr['net_pay']][0]['amount'] <= 2100 && bcsub( $pse_arr[$this->pay_stub_account_link_arr['net_pay']][0]['amount'], 1598.01 ) == $pse_arr[$this->pay_stub_account_link_arr['net_pay']][0]['ytd_amount'] ) { $this->assertTrue( true ); } else { $this->assertTrue( false, 'NET PAY not within range!' ); } return true; } /** * @group PayStubCalculation_testMainCustomFormulas */ function testMainCustomFormulas() { $this->addPayStubAmendments(); $this->createPayStub(); if ( getTTProductEdition() >= TT_PRODUCT_PROFESSIONAL ) { $pse_accounts = [ 'regular_time' => CompanyDeductionFactory::getPayStubEntryAccountByCompanyIDAndTypeAndFuzzyName( $this->company_id, 10, 'Regular Time' ), 'over_time_1' => CompanyDeductionFactory::getPayStubEntryAccountByCompanyIDAndTypeAndFuzzyName( $this->company_id, 10, 'Over Time 1' ), 'premium_1' => CompanyDeductionFactory::getPayStubEntryAccountByCompanyIDAndTypeAndFuzzyName( $this->company_id, 10, 'Premium 1' ), 'premium_2' => CompanyDeductionFactory::getPayStubEntryAccountByCompanyIDAndTypeAndFuzzyName( $this->company_id, 10, 'Premium 2' ), 'bonus' => CompanyDeductionFactory::getPayStubEntryAccountByCompanyIDAndTypeAndFuzzyName( $this->company_id, 10, 'Bonus' ), 'other' => CompanyDeductionFactory::getPayStubEntryAccountByCompanyIDAndTypeAndFuzzyName( $this->company_id, 10, 'Commission' ), 'vacation_accrual_release' => CompanyDeductionFactory::getPayStubEntryAccountByCompanyIDAndTypeAndFuzzyName( $this->company_id, 10, 'Vacation - Accrual Release' ), 'federal_income_tax' => CompanyDeductionFactory::getPayStubEntryAccountByCompanyIDAndTypeAndFuzzyName( $this->company_id, 20, 'US - Federal Income Tax' ), 'state_income_tax' => CompanyDeductionFactory::getPayStubEntryAccountByCompanyIDAndTypeAndFuzzyName( $this->company_id, 20, 'NY - State Income Tax' ), 'state_disability' => CompanyDeductionFactory::getPayStubEntryAccountByCompanyIDAndTypeAndFuzzyName( $this->company_id, 20, 'NY - Disability Insurance' ), 'medicare' => CompanyDeductionFactory::getPayStubEntryAccountByCompanyIDAndTypeAndFuzzyName( $this->company_id, 20, 'Medicare' ), 'union_dues' => CompanyDeductionFactory::getPayStubEntryAccountByCompanyIDAndTypeAndFuzzyName( $this->company_id, 20, 'Union Dues' ), 'advanced_percent_1' => CompanyDeductionFactory::getPayStubEntryAccountByCompanyIDAndTypeAndFuzzyName( $this->company_id, 20, 'Advanced Percent 1' ), 'advanced_percent_2' => CompanyDeductionFactory::getPayStubEntryAccountByCompanyIDAndTypeAndFuzzyName( $this->company_id, 20, 'Advanced Percent 2' ), 'deduction_other' => CompanyDeductionFactory::getPayStubEntryAccountByCompanyIDAndTypeAndFuzzyName( $this->company_id, 20, 'Other' ), 'ei' => CompanyDeductionFactory::getPayStubEntryAccountByCompanyIDAndTypeAndFuzzyName( $this->company_id, 20, 'ei' ), 'cpp' => CompanyDeductionFactory::getPayStubEntryAccountByCompanyIDAndTypeAndFuzzyName( $this->company_id, 20, 'cpp' ), 'employer_medicare' => CompanyDeductionFactory::getPayStubEntryAccountByCompanyIDAndTypeAndFuzzyName( $this->company_id, 30, 'Medicare' ), 'employer_fica' => CompanyDeductionFactory::getPayStubEntryAccountByCompanyIDAndTypeAndFuzzyName( $this->company_id, 30, 'Social Security (FICA)' ), 'vacation_accrual' => CompanyDeductionFactory::getPayStubEntryAccountByCompanyIDAndTypeAndFuzzyName( $this->company_id, 50, 'Vacation Accrual' ), 'test_custom_formula' => CompanyDeductionFactory::getPayStubEntryAccountByCompanyIDAndTypeAndFuzzyName( $this->company_id, 20, 'Other2' ), 'test_custom_formula_1' => CompanyDeductionFactory::getPayStubEntryAccountByCompanyIDAndTypeAndFuzzyName( $this->company_id, 20, 'Custom1' ), 'test_custom_formula_2' => CompanyDeductionFactory::getPayStubEntryAccountByCompanyIDAndTypeAndFuzzyName( $this->company_id, 20, 'Custom2' ), ]; $pay_stub_id = $this->getPayStub(); $pse_arr = $this->getPayStubEntryArray( $pay_stub_id ); //var_dump($pse_accounts); //var_dump($pse_arr); $this->assertTrue( is_array( $pse_arr ), 'Pay Stub was not created!' ); $this->assertEquals( '2408.00', $pse_arr[$pse_accounts['regular_time']][0]['amount'] ); $this->assertEquals( '2408.00', $pse_arr[$pse_accounts['regular_time']][0]['ytd_amount'] ); $this->assertEquals( '451.50', $pse_arr[$pse_accounts['over_time_1']][0]['amount'] ); $this->assertEquals( '451.50', $pse_arr[$pse_accounts['over_time_1']][0]['ytd_amount'] ); $this->assertEquals( '47.88', $pse_arr[$pse_accounts['premium_1']][0]['amount'] ); $this->assertEquals( '47.88', $pse_arr[$pse_accounts['premium_1']][0]['ytd_amount'] ); $this->assertEquals( '10.00', $pse_arr[$pse_accounts['bonus']][0]['rate'] ); $this->assertEquals( '10.00', $pse_arr[$pse_accounts['bonus']][0]['units'] ); $this->assertEquals( '100.00', $pse_arr[$pse_accounts['bonus']][0]['amount'] ); $this->assertEquals( '100.00', $pse_arr[$pse_accounts['bonus']][0]['ytd_amount'] ); //NOTICE: After switching to UUID, it caused ordering by ID (specifically in CalculatePayStub->getOrderedDeductionAndPSAmendment() ) to be inconsistent from one run to the next. // This casued failures here because 240.80 and 1000.00 could be in reverse order. // In this case, the sort order doesn't really matter, as long as its consistent, which it would be for customers. // However when running unit tests it can switch from one test to another, so lets account for that. //YTD adjustment if ( $pse_arr[$pse_accounts['other']][0]['amount'] == '240.80' ) { $this->assertEquals( '240.80', $pse_arr[$pse_accounts['other']][0]['amount'] ); $this->assertEquals( '0.00', $pse_arr[$pse_accounts['other']][0]['ytd_amount'] ); //Fixed amount PS amendment $this->assertEquals( '1000.00', $pse_arr[$pse_accounts['other']][1]['amount'] ); $this->assertEquals( '1240.80', $pse_arr[$pse_accounts['other']][1]['ytd_amount'] ); } else { //Fixed amount PS amendment $this->assertEquals( '1000.00', $pse_arr[$pse_accounts['other']][0]['amount'] ); $this->assertEquals( '0.00', $pse_arr[$pse_accounts['other']][0]['ytd_amount'] ); $this->assertEquals( '240.80', $pse_arr[$pse_accounts['other']][1]['amount'] ); $this->assertEquals( '1240.80', $pse_arr[$pse_accounts['other']][1]['ytd_amount'] ); } $this->assertEquals( '10.00', $pse_arr[$pse_accounts['premium_2']][0]['amount'] ); $this->assertEquals( '0.00', $pse_arr[$pse_accounts['premium_2']][0]['ytd_amount'] ); $this->assertEquals( '1.99', $pse_arr[$pse_accounts['premium_2']][1]['amount'] ); $this->assertEquals( '11.99', $pse_arr[$pse_accounts['premium_2']][1]['ytd_amount'] ); //Vacation accrual release $this->assertEquals( '114.67', $pse_arr[$pse_accounts['vacation_accrual_release']][0]['amount'] ); $this->assertEquals( '114.67', $pse_arr[$pse_accounts['vacation_accrual_release']][0]['ytd_amount'] ); //Vacation accrual deduction $this->assertEquals( '99.01', $pse_arr[$pse_accounts['vacation_accrual']][0]['amount'] ); $this->assertEquals( '0.00', $pse_arr[$pse_accounts['vacation_accrual']][0]['ytd_amount'] ); $this->assertEquals( '130.33', $pse_arr[$pse_accounts['vacation_accrual']][1]['amount'] ); $this->assertEquals( '0.00', $pse_arr[$pse_accounts['vacation_accrual']][1]['ytd_amount'] ); $this->assertEquals( '-114.67', $pse_arr[$pse_accounts['vacation_accrual']][2]['amount'] ); $this->assertEquals( '114.67', $pse_arr[$pse_accounts['vacation_accrual']][2]['ytd_amount'] ); //Union Dues - Should be 19.98 due to getting close to hitting Wage Base, because a YTD adjustment for Total Gross exists for around 1001.99. $this->assertEquals( '19.98', $pse_arr[$pse_accounts['union_dues']][0]['amount'] ); $this->assertEquals( '19.98', $pse_arr[$pse_accounts['union_dues']][0]['ytd_amount'] ); //Advanced Percent $this->assertEquals( '20.00', $pse_arr[$pse_accounts['advanced_percent_1']][0]['amount'] ); $this->assertEquals( '20.00', $pse_arr[$pse_accounts['advanced_percent_1']][0]['ytd_amount'] ); //Exceeds Wage Base $this->assertEquals( '24.08', $pse_arr[$pse_accounts['advanced_percent_2']][0]['amount'] ); $this->assertEquals( '24.08', $pse_arr[$pse_accounts['advanced_percent_2']][0]['ytd_amount'] ); //Not close to Wage Base. $this->assertEquals( '37.29', $pse_arr[$pse_accounts['deduction_other']][0]['amount'] ); $this->assertEquals( '37.29', $pse_arr[$pse_accounts['deduction_other']][0]['ytd_amount'] ); //EI $this->assertEquals( '700.00', $pse_arr[$pse_accounts['ei']][0]['amount'] ); $this->assertEquals( '0.00', $pse_arr[$pse_accounts['ei']][0]['ytd_amount'] ); $this->assertEquals( '29.30', $pse_arr[$pse_accounts['ei']][1]['amount'] ); //HAS TO BE 29.30, as it reached maximum contribution. $this->assertEquals( '729.30', $pse_arr[$pse_accounts['ei']][1]['ytd_amount'] ); //CPP $this->assertEquals( '1900.00', $pse_arr[$pse_accounts['cpp']][0]['amount'] ); $this->assertEquals( '0.00', $pse_arr[$pse_accounts['cpp']][0]['ytd_amount'] ); $this->assertEquals( '10.70', $pse_arr[$pse_accounts['cpp']][1]['amount'] ); $this->assertEquals( '1910.70', $pse_arr[$pse_accounts['cpp']][1]['ytd_amount'] ); //Custom formula deductions. $this->assertEquals( '5.50', $pse_arr[$pse_accounts['test_custom_formula']][0]['amount'] ); $this->assertEquals( '5.50', $pse_arr[$pse_accounts['test_custom_formula']][0]['ytd_amount'] ); $this->assertEquals( '12.51', $pse_arr[$pse_accounts['test_custom_formula_1']][0]['amount'] ); $this->assertEquals( '12.51', $pse_arr[$pse_accounts['test_custom_formula_1']][0]['ytd_amount'] ); $this->assertEquals( '35.40', $pse_arr[$pse_accounts['test_custom_formula_2']][0]['amount'] ); $this->assertEquals( '35.40', $pse_arr[$pse_accounts['test_custom_formula_2']][0]['ytd_amount'] ); if ( $pse_arr[$pse_accounts['federal_income_tax']][0]['amount'] >= 600 && $pse_arr[$pse_accounts['federal_income_tax']][0]['amount'] <= 800 ) { $this->assertTrue( true ); } else { $this->assertTrue( false, 'Federal Income Tax not within range! Amount: ' . $pse_arr[$pse_accounts['federal_income_tax']][0]['amount'] ); } if ( $pse_arr[$pse_accounts['state_income_tax']][0]['amount'] >= 100 && $pse_arr[$pse_accounts['state_income_tax']][0]['amount'] <= 300 ) { $this->assertTrue( true ); } else { $this->assertTrue( false, 'State Income Tax not within range! Amount: ' . $pse_arr[$pse_accounts['state_income_tax']][0]['amount'] ); } if ( $pse_arr[$pse_accounts['medicare']][0]['amount'] >= 10 && $pse_arr[$pse_accounts['medicare']][0]['amount'] <= 100 ) { $this->assertTrue( true ); } else { $this->assertTrue( false, 'Medicare not within range!' ); } if ( $pse_arr[$pse_accounts['state_disability']][0]['amount'] >= 2 && $pse_arr[$pse_accounts['state_disability']][0]['amount'] <= 50 ) { $this->assertTrue( true ); } else { $this->assertTrue( false, 'State Disability not within range!' ); } if ( $pse_arr[$pse_accounts['employer_medicare']][0]['amount'] >= 10 && $pse_arr[$pse_accounts['employer_medicare']][0]['amount'] <= 100 ) { $this->assertTrue( true ); } else { $this->assertTrue( false, 'Employer Medicare not within range!' ); } if ( $pse_arr[$pse_accounts['employer_fica']][0]['amount'] >= 100 && $pse_arr[$pse_accounts['employer_fica']][0]['amount'] <= 250 ) { $this->assertTrue( true ); } else { $this->assertTrue( false, 'Employer FICA not within range!' ); } if ( $pse_arr[$this->pay_stub_account_link_arr['total_gross']][0]['amount'] >= 3300 && $pse_arr[$this->pay_stub_account_link_arr['total_gross']][0]['amount'] <= 3450 && ( $pse_arr[$this->pay_stub_account_link_arr['total_gross']][0]['amount'] + ( 1000 + 1.99 ) ) == $pse_arr[$this->pay_stub_account_link_arr['total_gross']][0]['ytd_amount'] ) { $this->assertTrue( true ); } else { $this->assertTrue( false, 'Total Gross not within range!' ); } if ( $pse_arr[$this->pay_stub_account_link_arr['total_deductions']][0]['amount'] >= 1300 && $pse_arr[$this->pay_stub_account_link_arr['total_deductions']][0]['amount'] <= 1500 && ( bcadd( $pse_arr[$this->pay_stub_account_link_arr['total_deductions']][0]['amount'], 2600 ) ) == $pse_arr[$this->pay_stub_account_link_arr['total_deductions']][0]['ytd_amount'] ) { $this->assertTrue( true ); } else { $this->assertTrue( false, 'Total Deductions not within range! Amount: ' . $pse_arr[$this->pay_stub_account_link_arr['total_deductions']][0]['amount'] . ' YTD Amount: ' . $pse_arr[$this->pay_stub_account_link_arr['total_deductions']][0]['ytd_amount'] ); } if ( $pse_arr[$this->pay_stub_account_link_arr['net_pay']][0]['amount'] >= 1800 && $pse_arr[$this->pay_stub_account_link_arr['net_pay']][0]['amount'] <= 2100 && bcsub( $pse_arr[$this->pay_stub_account_link_arr['net_pay']][0]['amount'], 1598.01 ) == $pse_arr[$this->pay_stub_account_link_arr['net_pay']][0]['ytd_amount'] ) { $this->assertTrue( true ); } else { $this->assertTrue( false, 'NET PAY not within range!' ); } } return true; } /** * @group PayStubCalculation_testNoHoursPayStub */ function testNoHoursPayStub() { $this->addPayStubAmendments(); $this->createPayStub(); $pse_accounts = [ 'regular_time' => CompanyDeductionFactory::getPayStubEntryAccountByCompanyIDAndTypeAndFuzzyName( $this->company_id, 10, 'Regular Time' ), 'over_time_1' => CompanyDeductionFactory::getPayStubEntryAccountByCompanyIDAndTypeAndFuzzyName( $this->company_id, 10, 'Over Time 1' ), 'premium_1' => CompanyDeductionFactory::getPayStubEntryAccountByCompanyIDAndTypeAndFuzzyName( $this->company_id, 10, 'Premium 1' ), 'premium_2' => CompanyDeductionFactory::getPayStubEntryAccountByCompanyIDAndTypeAndFuzzyName( $this->company_id, 10, 'Premium 2' ), 'bonus' => CompanyDeductionFactory::getPayStubEntryAccountByCompanyIDAndTypeAndFuzzyName( $this->company_id, 10, 'Bonus' ), 'other' => CompanyDeductionFactory::getPayStubEntryAccountByCompanyIDAndTypeAndFuzzyName( $this->company_id, 10, 'Commission' ), 'vacation_accrual_release' => CompanyDeductionFactory::getPayStubEntryAccountByCompanyIDAndTypeAndFuzzyName( $this->company_id, 10, 'Vacation - Accrual Release' ), 'federal_income_tax' => CompanyDeductionFactory::getPayStubEntryAccountByCompanyIDAndTypeAndFuzzyName( $this->company_id, 20, 'US - Federal Income Tax' ), 'state_income_tax' => CompanyDeductionFactory::getPayStubEntryAccountByCompanyIDAndTypeAndFuzzyName( $this->company_id, 20, 'NY - State Income Tax' ), 'state_disability' => CompanyDeductionFactory::getPayStubEntryAccountByCompanyIDAndTypeAndFuzzyName( $this->company_id, 20, 'NY - Disability Insurance' ), 'medicare' => CompanyDeductionFactory::getPayStubEntryAccountByCompanyIDAndTypeAndFuzzyName( $this->company_id, 20, 'Medicare' ), 'union_dues' => CompanyDeductionFactory::getPayStubEntryAccountByCompanyIDAndTypeAndFuzzyName( $this->company_id, 20, 'Union Dues' ), 'advanced_percent_1' => CompanyDeductionFactory::getPayStubEntryAccountByCompanyIDAndTypeAndFuzzyName( $this->company_id, 20, 'Advanced Percent 1' ), 'advanced_percent_2' => CompanyDeductionFactory::getPayStubEntryAccountByCompanyIDAndTypeAndFuzzyName( $this->company_id, 20, 'Advanced Percent 2' ), 'deduction_other' => CompanyDeductionFactory::getPayStubEntryAccountByCompanyIDAndTypeAndFuzzyName( $this->company_id, 20, 'Other' ), 'ei' => CompanyDeductionFactory::getPayStubEntryAccountByCompanyIDAndTypeAndFuzzyName( $this->company_id, 20, 'ei' ), 'cpp' => CompanyDeductionFactory::getPayStubEntryAccountByCompanyIDAndTypeAndFuzzyName( $this->company_id, 20, 'cpp' ), 'employer_medicare' => CompanyDeductionFactory::getPayStubEntryAccountByCompanyIDAndTypeAndFuzzyName( $this->company_id, 30, 'Medicare' ), 'employer_fica' => CompanyDeductionFactory::getPayStubEntryAccountByCompanyIDAndTypeAndFuzzyName( $this->company_id, 30, 'Social Security (FICA)' ), 'vacation_accrual' => CompanyDeductionFactory::getPayStubEntryAccountByCompanyIDAndTypeAndFuzzyName( $this->company_id, 50, 'Vacation Accrual' ), ]; $pay_stub_id = $this->getPayStub( $this->pay_period_objs[1]->getId() ); $pse_arr = $this->getPayStubEntryArray( $pay_stub_id ); //var_dump($pse_arr); $this->assertEquals( '33.33', $pse_arr[$pse_accounts['regular_time']][0]['rate'] ); $this->assertEquals( '3.00', $pse_arr[$pse_accounts['regular_time']][0]['units'] ); $this->assertEquals( '99.99', $pse_arr[$pse_accounts['regular_time']][0]['amount'] ); $this->assertEquals( '2507.99', $pse_arr[$pse_accounts['regular_time']][0]['ytd_amount'] ); $this->assertEquals( '10.00', $pse_arr[$pse_accounts['bonus']][0]['rate'] ); $this->assertEquals( '30.00', $pse_arr[$pse_accounts['bonus']][0]['units'] ); $this->assertEquals( '300.00', $pse_arr[$pse_accounts['bonus']][0]['amount'] ); $this->assertEquals( '400.00', $pse_arr[$pse_accounts['bonus']][0]['ytd_amount'] ); $this->assertEquals( '0.00', $pse_arr[$pse_accounts['union_dues']][0]['amount'] ); $this->assertEquals( '19.98', $pse_arr[$pse_accounts['union_dues']][0]['ytd_amount'] ); $this->assertEquals( '399.99', $pse_arr[$this->pay_stub_account_link_arr['total_gross']][0]['amount'] ); //Check deductions. $this->assertEquals( '0.00', $pse_arr[$pse_accounts['advanced_percent_1']][0]['amount'] ); //Already Exceeded Wage Base, this should be 0!! $this->assertEquals( '20.00', $pse_arr[$pse_accounts['advanced_percent_1']][0]['ytd_amount'] ); $this->assertEquals( '0.92', $pse_arr[$pse_accounts['advanced_percent_2']][0]['amount'] ); //Nearing Wage Base, this should be less than 1!! $this->assertEquals( '25.00', $pse_arr[$pse_accounts['advanced_percent_2']][0]['ytd_amount'] ); if ( getTTProductEdition() >= TT_PRODUCT_PROFESSIONAL ) { if ( $pse_arr[$this->pay_stub_account_link_arr['total_deductions']][0]['amount'] >= 110 && $pse_arr[$this->pay_stub_account_link_arr['total_deductions']][0]['amount'] <= 150 && ( bcadd( $pse_arr[$this->pay_stub_account_link_arr['total_deductions']][0]['amount'], 4000.32 ) ) == $pse_arr[$this->pay_stub_account_link_arr['total_deductions']][0]['ytd_amount'] ) { $this->assertTrue( true ); } else { $this->assertTrue( false, 'Total Deductions not within range! Total Deductions: ' . $pse_arr[$this->pay_stub_account_link_arr['total_deductions']][0]['amount'] . ' YTD Amount: ' . $pse_arr[$this->pay_stub_account_link_arr['total_deductions']][0]['ytd_amount'] ); } if ( $pse_arr[$this->pay_stub_account_link_arr['net_pay']][0]['amount'] >= 225 && $pse_arr[$this->pay_stub_account_link_arr['net_pay']][0]['amount'] <= 290 && bcadd( $pse_arr[$this->pay_stub_account_link_arr['net_pay']][0]['amount'], 374.52 ) == $pse_arr[$this->pay_stub_account_link_arr['net_pay']][0]['ytd_amount'] ) { $this->assertTrue( true ); } else { $this->assertTrue( false, 'NET PAY not within range! Net Pay: ' . $pse_arr[$this->pay_stub_account_link_arr['net_pay']][0]['amount'] . ' YTD Amount: ' . $pse_arr[$this->pay_stub_account_link_arr['net_pay']][0]['ytd_amount'] ); } } else { //If Community Edition without custom formulas these values all change. if ( $pse_arr[$this->pay_stub_account_link_arr['total_deductions']][0]['amount'] >= 65 && $pse_arr[$this->pay_stub_account_link_arr['total_deductions']][0]['amount'] <= 80 && ( bcadd( $pse_arr[$this->pay_stub_account_link_arr['total_deductions']][0]['amount'], 3946.91 ) ) == $pse_arr[$this->pay_stub_account_link_arr['total_deductions']][0]['ytd_amount'] ) { $this->assertTrue( true ); } else { $this->assertTrue( false, 'Total Deductions not within range! Total Deductions: ' . $pse_arr[$this->pay_stub_account_link_arr['total_deductions']][0]['amount'] . ' YTD Amount: ' . $pse_arr[$this->pay_stub_account_link_arr['total_deductions']][0]['ytd_amount'] ); } if ( $pse_arr[$this->pay_stub_account_link_arr['net_pay']][0]['amount'] >= 225 && $pse_arr[$this->pay_stub_account_link_arr['net_pay']][0]['amount'] <= 350 && bcadd( $pse_arr[$this->pay_stub_account_link_arr['net_pay']][0]['amount'], 427.93 ) == $pse_arr[$this->pay_stub_account_link_arr['net_pay']][0]['ytd_amount'] ) { $this->assertTrue( true ); } else { $this->assertTrue( false, 'NET PAY not within range! Net Pay: ' . $pse_arr[$this->pay_stub_account_link_arr['net_pay']][0]['amount'] . ' YTD Amount: ' . $pse_arr[$this->pay_stub_account_link_arr['net_pay']][0]['ytd_amount'] ); } } return true; } /** * @group PayStubCalculation_testSalaryPayStubA */ //Test basic salary calculation. function testSalaryPayStubA() { $this->deleteUserWage( $this->user_id ); //First Wage Entry $this->createUserSalaryWage( $this->user_id, 1, strtotime( '01-Jan-2001' ) ); $this->createUserSalaryWage( $this->user_id, 1000, TTDate::incrementDate( $this->pay_period_objs[0]->getStartDate(), -1, 'day' ) ); $this->addPayStubAmendments(); $this->createPayStub(); $pse_accounts = [ 'regular_time' => CompanyDeductionFactory::getPayStubEntryAccountByCompanyIDAndTypeAndFuzzyName( $this->company_id, 10, 'Regular Time' ), ]; $pay_stub_id = $this->getPayStub( $this->pay_period_objs[0]->getId() ); $pse_arr = $this->getPayStubEntryArray( $pay_stub_id ); //var_dump($pse_arr); $this->assertEquals( '0.00', (float)$pse_arr[$pse_accounts['regular_time']][0]['rate'] ); //$this->assertEquals( $pse_arr[$pse_accounts['regular_time']][0]['units'], '3.00' ); $this->assertEquals( '1000.00', $pse_arr[$pse_accounts['regular_time']][0]['amount'] ); $this->assertEquals( '1000.00', $pse_arr[$pse_accounts['regular_time']][0]['ytd_amount'] ); $this->assertCount( 1, $pse_arr[$pse_accounts['regular_time']] ); $pay_stub_id = $this->getPayStub( $this->pay_period_objs[1]->getId() ); $pse_arr = $this->getPayStubEntryArray( $pay_stub_id ); //var_dump($pse_arr); $this->assertEquals( '33.33', $pse_arr[$pse_accounts['regular_time']][0]['rate'] ); $this->assertEquals( '3.00', $pse_arr[$pse_accounts['regular_time']][0]['units'] ); $this->assertEquals( '99.99', $pse_arr[$pse_accounts['regular_time']][0]['amount'] ); $this->assertEquals( '1099.99', $pse_arr[$pse_accounts['regular_time']][0]['ytd_amount'] ); $this->assertCount( 1, $pse_arr[$pse_accounts['regular_time']] ); return true; } /** * @group PayStubCalculation_testSalaryPayStubB */ //Test advanced pro-rating salary calculation. function testSalaryPayStubB() { $this->deleteUserWage( $this->user_id ); //First Wage Entry $this->createUserSalaryWage( $this->user_id, 1, strtotime( '01-Jan-2001' ) ); $this->createUserSalaryWage( $this->user_id, 1000, TTDate::incrementDate( $this->pay_period_objs[0]->getStartDate(), -1, 'day' ) ); $this->createUserSalaryWage( $this->user_id, 1500, TTDate::incrementDate( $this->pay_period_objs[0]->getStartDate(), 4, 'day' ) ); $this->createUserSalaryWage( $this->user_id, 2000, TTDate::incrementDate( $this->pay_period_objs[0]->getStartDate(), 8, 'day' ) ); $this->addPayStubAmendments(); $this->createPayStub(); $pse_accounts = [ 'regular_time' => CompanyDeductionFactory::getPayStubEntryAccountByCompanyIDAndTypeAndFuzzyName( $this->company_id, 10, 'Regular Time' ), ]; $pay_stub_id = $this->getPayStub( $this->pay_period_objs[0]->getId() ); $pse_arr = $this->getPayStubEntryArray( $pay_stub_id ); //var_dump($pse_arr); $this->assertEquals( '0.00', (float)$pse_arr[$pse_accounts['regular_time']][0]['rate'] ); $this->assertEquals( '48.00', $pse_arr[$pse_accounts['regular_time']][0]['units'] ); $this->assertEquals( '857.14', $pse_arr[$pse_accounts['regular_time']][0]['amount'] ); $this->assertEquals( '0.00', $pse_arr[$pse_accounts['regular_time']][0]['ytd_amount'] ); $this->assertEquals( '0.00', (float)$pse_arr[$pse_accounts['regular_time']][1]['rate'] ); $this->assertEquals( '32.00', $pse_arr[$pse_accounts['regular_time']][1]['units'] ); $this->assertEquals( '428.57', $pse_arr[$pse_accounts['regular_time']][1]['amount'] ); $this->assertEquals( '0.00', $pse_arr[$pse_accounts['regular_time']][1]['ytd_amount'] ); $this->assertEquals( '0.00', (float)$pse_arr[$pse_accounts['regular_time']][2]['rate'] ); $this->assertEquals( '32.00', $pse_arr[$pse_accounts['regular_time']][2]['units'] ); $this->assertEquals( '285.71', $pse_arr[$pse_accounts['regular_time']][2]['amount'] ); $this->assertEquals( '1571.42', $pse_arr[$pse_accounts['regular_time']][2]['ytd_amount'] ); $this->assertCount( 3, $pse_arr[$pse_accounts['regular_time']] ); $pay_stub_id = $this->getPayStub( $this->pay_period_objs[1]->getId() ); $pse_arr = $this->getPayStubEntryArray( $pay_stub_id ); //var_dump($pse_arr); $this->assertEquals( '33.33', $pse_arr[$pse_accounts['regular_time']][0]['rate'] ); $this->assertEquals( '3.00', $pse_arr[$pse_accounts['regular_time']][0]['units'] ); $this->assertEquals( '99.99', $pse_arr[$pse_accounts['regular_time']][0]['amount'] ); $this->assertEquals( '1671.41', $pse_arr[$pse_accounts['regular_time']][0]['ytd_amount'] ); $this->assertCount( 1, $pse_arr[$pse_accounts['regular_time']] ); return true; } /** * @group PayStubCalculation_testSalaryPayStubC */ //Test advanced pro-rating salary calculation. function testSalaryPayStubC() { $this->deleteUserWage( $this->user_id ); //First Wage Entry $this->createUserSalaryWage( $this->user_id, 1, strtotime( '01-Jan-2001' ) ); $this->createUserSalaryWage( $this->user_id, 1000, TTDate::incrementDate( $this->pay_period_objs[1]->getStartDate(), -1, 'day' ) ); $this->createUserSalaryWage( $this->user_id, 1000, TTDate::incrementDate( $this->pay_period_objs[1]->getStartDate(), 1, 'day' ) ); $this->createUserSalaryWage( $this->user_id, 1000, TTDate::incrementDate( $this->pay_period_objs[1]->getStartDate(), 2, 'day' ) ); $this->createUserSalaryWage( $this->user_id, 1000, TTDate::incrementDate( $this->pay_period_objs[1]->getStartDate(), 3, 'day' ) ); $this->createUserSalaryWage( $this->user_id, 1000, TTDate::incrementDate( $this->pay_period_objs[1]->getStartDate(), 4, 'day' ) ); $this->createUserSalaryWage( $this->user_id, 1000, TTDate::incrementDate( $this->pay_period_objs[1]->getStartDate(), 5, 'day' ) ); $this->createUserSalaryWage( $this->user_id, 1000, TTDate::incrementDate( $this->pay_period_objs[1]->getStartDate(), 6, 'day' ) ); $this->createUserSalaryWage( $this->user_id, 1000, TTDate::incrementDate( $this->pay_period_objs[1]->getStartDate(), 7, 'day' ) ); $this->createUserSalaryWage( $this->user_id, 1000, TTDate::incrementDate( $this->pay_period_objs[1]->getStartDate(), 8, 'day' ) ); $this->createUserSalaryWage( $this->user_id, 1000, TTDate::incrementDate( $this->pay_period_objs[1]->getStartDate(), 9, 'day' ) ); $this->createUserSalaryWage( $this->user_id, 1000, TTDate::incrementDate( $this->pay_period_objs[1]->getStartDate(), 10, 'day' ) ); $this->createUserSalaryWage( $this->user_id, 1000, TTDate::incrementDate( $this->pay_period_objs[1]->getStartDate(), 11, 'day' ) ); $this->createUserSalaryWage( $this->user_id, 1000, TTDate::incrementDate( $this->pay_period_objs[1]->getStartDate(), 12, 'day' ) ); $this->createUserSalaryWage( $this->user_id, 1000, TTDate::incrementDate( $this->pay_period_objs[1]->getStartDate(), 13, 'day' ) ); $this->createUserSalaryWage( $this->user_id, 1000, TTDate::incrementDate( $this->pay_period_objs[1]->getStartDate(), 14, 'day' ) ); $this->createUserSalaryWage( $this->user_id, 1000, TTDate::incrementDate( $this->pay_period_objs[1]->getStartDate(), 15, 'day' ) ); //Create one punch in the next pay period so we can test pro-rating without any regular time. global $dd; $date_stamp = TTDate::getDate( 'DATE', $this->pay_period_objs[1]->getStartDate() ); $dd->createPunchPair( $this->user_id, strtotime( $date_stamp . ' 08:00AM' ), strtotime( $date_stamp . ' 11:00AM' ), [ 'in_type_id' => 10, 'out_type_id' => 10, 'branch_id' => 0, 'department_id' => 0, 'job_id' => 0, 'job_item_id' => 0, ] ); $this->addPayStubAmendments(); $this->createPayStub(); $pse_accounts = [ 'regular_time' => CompanyDeductionFactory::getPayStubEntryAccountByCompanyIDAndTypeAndFuzzyName( $this->company_id, 10, 'Regular Time' ), ]; //Just check the final pay stub. $pay_stub_id = $this->getPayStub( $this->pay_period_objs[1]->getId() ); $pse_arr = $this->getPayStubEntryArray( $pay_stub_id ); //var_dump($pse_arr); for ( $i = 0; $i <= 12; $i++ ) { $this->assertEquals( '0.00', (float)$pse_arr[$pse_accounts['regular_time']][$i]['rate'] ); $this->assertEquals( '0.00', (float)$pse_arr[$pse_accounts['regular_time']][$i]['units'] ); $this->assertEquals( '71.43', $pse_arr[$pse_accounts['regular_time']][$i]['amount'] ); $this->assertEquals( '0.00', $pse_arr[$pse_accounts['regular_time']][$i]['ytd_amount'] ); } $this->assertEquals( '0.00', (float)$pse_arr[$pse_accounts['regular_time']][13]['rate'] ); $this->assertEquals( '3.00', $pse_arr[$pse_accounts['regular_time']][13]['units'] ); $this->assertEquals( '71.43', $pse_arr[$pse_accounts['regular_time']][13]['amount'] ); $this->assertEquals( '0.00', $pse_arr[$pse_accounts['regular_time']][13]['ytd_amount'] ); $this->assertEquals( '33.33', $pse_arr[$pse_accounts['regular_time']][14]['rate'] ); $this->assertEquals( '3.00', $pse_arr[$pse_accounts['regular_time']][14]['units'] ); $this->assertEquals( '99.99', $pse_arr[$pse_accounts['regular_time']][14]['amount'] ); $this->assertEquals( '1172.37', $pse_arr[$pse_accounts['regular_time']][14]['ytd_amount'] ); $this->assertCount( 15, $pse_arr[$pse_accounts['regular_time']] ); return true; } /** * @group PayStubCalculation_testMultiCurrencyPayStubA */ function testMultiCurrencyPayStubA() { global $dd; $this->remittance_source_account_ids[$this->legal_entity_id][20] = $dd->createRemittanceSourceAccount( $this->company_id, $this->legal_entity_id, $this->currency_id[20], 100 ); // Check - CAD $this->remittance_source_account_ids[$this->legal_entity_id][30] = $dd->createRemittanceSourceAccount( $this->company_id, $this->legal_entity_id, $this->currency_id[30], 110 ); // Check - EUR $this->remittance_source_account_ids[$this->legal_entity_id][40] = $dd->createRemittanceSourceAccount( $this->company_id, $this->legal_entity_id, $this->currency_id[40], 120 ); // Check - MXN //Delete existing destination accounts so random fixed amounts don't cause problems. $rdlf = TTnew('RemittanceDestinationAccountListFactory'); $rdlf->getByUserIdAndCompany( $this->user_id, $this->company_id ); if ( $rdlf->getRecordCount() > 0 ) { foreach( $rdlf as $rd_obj ) { $rd_obj->Delete(); } } unset($rdlf); $dd->createRemittanceDestinationAccount( $this->user_id, $this->currency_id[10], $this->legal_entity_id, $this->remittance_source_account_ids[$this->legal_entity_id][0], 100, 55 ); $dd->createRemittanceDestinationAccount( $this->user_id, $this->currency_id[20], $this->legal_entity_id, $this->remittance_source_account_ids[$this->legal_entity_id][20], 110, 10 ); $dd->createRemittanceDestinationAccount( $this->user_id, $this->currency_id[30], $this->legal_entity_id, $this->remittance_source_account_ids[$this->legal_entity_id][30], 120, 15 ); $dd->createRemittanceDestinationAccount( $this->user_id, $this->currency_id[40], $this->legal_entity_id, $this->remittance_source_account_ids[$this->legal_entity_id][40], 130, 20 ); $this->deleteUserWage( $this->user_id ); //First Wage Entry $this->createUserSalaryWage( $this->user_id, 1, strtotime( '01-Jan-2001' ) ); $this->createUserSalaryWage( $this->user_id, 10000, TTDate::incrementDate( $this->pay_period_objs[0]->getStartDate(), -1, 'day' ) ); //$this->addPayStubAmendments(); //When run on Community Edition, custom formula Tax/Deductions don't exist, so emulate those manually. if ( getTTProductEdition() == TT_PRODUCT_COMMUNITY ) { $psaf = new PayStubAmendmentFactory(); $psaf->setUser( $this->user_id ); $psaf->setPayStubEntryNameId( CompanyDeductionFactory::getPayStubEntryAccountByCompanyIDAndTypeAndFuzzyName( $this->company_id, 20, 'Other2' ) ); $psaf->setStatus( 50 ); //Active $psaf->setType( 10 ); $psaf->setAmount( 5.50 ); $psaf->setDescription( 'Emulate Custom Formula' ); $psaf->setEffectiveDate( $this->pay_period_objs[0]->getStartDate() ); $psaf->setAuthorized( true ); if ( $psaf->isValid() ) { $psaf->Save(); } $psaf = new PayStubAmendmentFactory(); $psaf->setUser( $this->user_id ); $psaf->setPayStubEntryNameId( CompanyDeductionFactory::getPayStubEntryAccountByCompanyIDAndTypeAndFuzzyName( $this->company_id, 20, 'Custom1' ) ); $psaf->setStatus( 50 ); //Active $psaf->setType( 10 ); $psaf->setAmount( 12.51 ); $psaf->setDescription( 'Emulate Custom Formula' ); $psaf->setEffectiveDate( $this->pay_period_objs[0]->getStartDate() ); $psaf->setAuthorized( true ); if ( $psaf->isValid() ) { $psaf->Save(); } $psaf = new PayStubAmendmentFactory(); $psaf->setUser( $this->user_id ); $psaf->setPayStubEntryNameId( CompanyDeductionFactory::getPayStubEntryAccountByCompanyIDAndTypeAndFuzzyName( $this->company_id, 20, 'Custom2' ) ); $psaf->setStatus( 50 ); //Active $psaf->setType( 10 ); $psaf->setAmount( 69.05 ); $psaf->setDescription( 'Emulate Custom Formula' ); $psaf->setEffectiveDate( $this->pay_period_objs[0]->getStartDate() ); $psaf->setAuthorized( true ); if ( $psaf->isValid() ) { $psaf->Save(); } } $this->createPayStub(); $pse_accounts = [ 'regular_time' => CompanyDeductionFactory::getPayStubEntryAccountByCompanyIDAndTypeAndFuzzyName( $this->company_id, 10, 'Regular Time' ), ]; $pay_stub_id = $this->getPayStub( $this->pay_period_objs[0]->getId() ); $pse_arr = $this->getPayStubEntryArray( $pay_stub_id ); //var_dump($pse_arr); $this->assertEquals( '0.00', (float)$pse_arr[$pse_accounts['regular_time']][0]['rate'] ); $this->assertEquals( '10000.00', $pse_arr[$pse_accounts['regular_time']][0]['amount'] ); $this->assertEquals( '10000.00', $pse_arr[$pse_accounts['regular_time']][0]['ytd_amount'] ); $this->assertCount( 1, $pse_arr[$pse_accounts['regular_time']] ); $pst_arr = $this->getPayStubTransactionArray( $pay_stub_id ); //var_dump($pst_arr); //Different calculations due to custom formula Tax/Deductions. $this->assertEquals( '2269.85', $pst_arr[0]['amount'] ); $this->assertEquals( $pst_arr[0]['currency_id'], $this->currency_id[10] ); //USD $this->assertEquals( '1.0000000000', $pst_arr[0]['currency_rate'] ); $this->assertEquals( '495.24', $pst_arr[1]['amount'] ); $this->assertEquals( $pst_arr[1]['currency_id'], $this->currency_id[20] ); //CAD $this->assertEquals( '0.8333333333', $pst_arr[1]['currency_rate'] ); $this->assertEquals( '804.765', $pst_arr[2]['amount'] ); $this->assertEquals( $pst_arr[2]['currency_id'], $this->currency_id[30] ); //EUR $this->assertEquals( '0.7692307692', $pst_arr[2]['currency_rate'] ); $this->assertEquals( '8051777.00', $pst_arr[3]['amount'] ); $this->assertEquals( $pst_arr[3]['currency_id'], $this->currency_id[40] ); //MXN (Pesos) $this->assertEquals( '0.0001025115', $pst_arr[3]['currency_rate'] ); $this->assertCount( 4, $pst_arr ); return true; } /** * @group PayStubCalculation_testCPPAgeLimitsA */ //Test 18/70 age limits for CPP and pro-rating. function testCPPAgeLimitsA() { $cdf = new CompanyDeductionFactory(); $cdf->setCompany( $this->company_id ); $cdf->setLegalEntity( $this->legal_entity_id ); $cdf->setStatus( 10 ); //Enabled $cdf->setType( 10 ); //Tax $cdf->setName( 'CPP' ); $cdf->setCalculation( 90 ); //CPP $cdf->setCalculationOrder( 90 ); $cdf->setPayStubEntryAccount( CompanyDeductionFactory::getPayStubEntryAccountByCompanyIDAndTypeAndFuzzyName( $this->company_id, 20, 'CPP' ) ); $cdf->setMinimumUserAge( 18 ); $cdf->setMaximumUserAge( 70 ); //if ( $cdf->isValid() ) { // $cdf->Save(FALSE); // $cdf->setIncludePayStubEntryAccount( array( $this->pay_stub_account_link_arr['total_gross'] ) ); // if ( $cdf->isValid() ) { // $cdf->Save( FALSE ); // } //} //Test with no birth date defaulting to having CPP deducted. $this->assertEquals( true, $cdf->isCPPAgeEligible( strtotime( '01-Sep-1990' ), strtotime( '01-Sep-2014' ) ) ); $this->assertEquals( true, $cdf->isCPPAgeEligible( '', strtotime( '01-Sep-2014' ) ) ); $this->assertEquals( true, $cdf->isCPPAgeEligible( false, strtotime( '01-Sep-2014' ) ) ); $this->assertEquals( true, $cdf->isCPPAgeEligible( null, strtotime( '01-Sep-2014' ) ) ); $this->assertEquals( false, $cdf->isCPPAgeEligible( strtotime( '01-Sep-2000' ), '' ) ); //No transaction date specified, always false. $this->assertEquals( false, $cdf->isCPPAgeEligible( strtotime( '01-Sep-2000' ), false ) ); //No transaction date specified, always false. $this->assertEquals( false, $cdf->isCPPAgeEligible( strtotime( '01-Sep-2000' ), null ) ); //No transaction date specified, always false. $birth_date = strtotime( '16-Oct-1997' ); //18yrs old $this->assertEquals( false, $cdf->isCPPAgeEligible( $birth_date, strtotime( '01-Sep-2014' ) ) ); $this->assertEquals( false, $cdf->isCPPAgeEligible( $birth_date, strtotime( '01-Sep-2015' ) ) ); $this->assertEquals( false, $cdf->isCPPAgeEligible( $birth_date, strtotime( '01-Oct-2015' ) ) ); $this->assertEquals( false, $cdf->isCPPAgeEligible( $birth_date, strtotime( '31-Oct-2015' ) ) ); $this->assertEquals( true, $cdf->isCPPAgeEligible( $birth_date, strtotime( '01-Nov-2015' ) ) ); $this->assertEquals( true, $cdf->isCPPAgeEligible( $birth_date, strtotime( '31-Nov-2015' ) ) ); $this->assertEquals( true, $cdf->isCPPAgeEligible( $birth_date, strtotime( '01-Dec-2015' ) ) ); $this->assertEquals( true, $cdf->isCPPAgeEligible( $birth_date, strtotime( '31-Dec-2015' ) ) ); $this->assertEquals( true, $cdf->isCPPAgeEligible( $birth_date, strtotime( '01-Jan-2016' ) ) ); $this->assertEquals( true, $cdf->isCPPAgeEligible( $birth_date, strtotime( '14-Jan-2016' ) ) ); $this->assertEquals( true, $cdf->isCPPAgeEligible( $birth_date, strtotime( '16-Jan-2016' ) ) ); $this->assertEquals( true, $cdf->isCPPAgeEligible( $birth_date, strtotime( '31-Jan-2016' ) ) ); $this->assertEquals( true, $cdf->isCPPAgeEligible( $birth_date, strtotime( '31-Jan-2017' ) ) ); $birth_date = strtotime( '31-Dec-1997' ); //18yrs old $this->assertEquals( false, $cdf->isCPPAgeEligible( $birth_date, strtotime( '01-Sep-2014' ) ) ); $this->assertEquals( false, $cdf->isCPPAgeEligible( $birth_date, strtotime( '01-Sep-2015' ) ) ); $this->assertEquals( false, $cdf->isCPPAgeEligible( $birth_date, strtotime( '01-Oct-2015' ) ) ); $this->assertEquals( false, $cdf->isCPPAgeEligible( $birth_date, strtotime( '31-Oct-2015' ) ) ); $this->assertEquals( false, $cdf->isCPPAgeEligible( $birth_date, strtotime( '01-Nov-2015' ) ) ); $this->assertEquals( false, $cdf->isCPPAgeEligible( $birth_date, strtotime( '31-Nov-2015' ) ) ); $this->assertEquals( false, $cdf->isCPPAgeEligible( $birth_date, strtotime( '01-Dec-2015' ) ) ); $this->assertEquals( false, $cdf->isCPPAgeEligible( $birth_date, strtotime( '31-Dec-2015' ) ) ); $this->assertEquals( true, $cdf->isCPPAgeEligible( $birth_date, strtotime( '01-Jan-2016' ) ) ); $this->assertEquals( true, $cdf->isCPPAgeEligible( $birth_date, strtotime( '14-Jan-2016' ) ) ); $this->assertEquals( true, $cdf->isCPPAgeEligible( $birth_date, strtotime( '16-Jan-2016' ) ) ); $this->assertEquals( true, $cdf->isCPPAgeEligible( $birth_date, strtotime( '31-Jan-2016' ) ) ); $this->assertEquals( true, $cdf->isCPPAgeEligible( $birth_date, strtotime( '31-Jan-2017' ) ) ); $birth_date = strtotime( '15-Jun-1997' ); //18yrs old $this->assertEquals( false, $cdf->isCPPAgeEligible( $birth_date, strtotime( '30-May-2011' ) ) ); $this->assertEquals( false, $cdf->isCPPAgeEligible( $birth_date, strtotime( '30-Jun-2011' ) ) ); $this->assertEquals( false, $cdf->isCPPAgeEligible( $birth_date, strtotime( '30-Jul-2011' ) ) ); $this->assertEquals( false, $cdf->isCPPAgeEligible( $birth_date, strtotime( '30-May-2012' ) ) ); $this->assertEquals( false, $cdf->isCPPAgeEligible( $birth_date, strtotime( '30-Jun-2012' ) ) ); $this->assertEquals( false, $cdf->isCPPAgeEligible( $birth_date, strtotime( '30-Jul-2012' ) ) ); $this->assertEquals( false, $cdf->isCPPAgeEligible( $birth_date, strtotime( '30-May-2013' ) ) ); $this->assertEquals( false, $cdf->isCPPAgeEligible( $birth_date, strtotime( '30-Jun-2013' ) ) ); $this->assertEquals( false, $cdf->isCPPAgeEligible( $birth_date, strtotime( '30-Jul-2013' ) ) ); $this->assertEquals( false, $cdf->isCPPAgeEligible( $birth_date, strtotime( '30-May-2014' ) ) ); $this->assertEquals( false, $cdf->isCPPAgeEligible( $birth_date, strtotime( '30-Jun-2014' ) ) ); $this->assertEquals( false, $cdf->isCPPAgeEligible( $birth_date, strtotime( '30-Jul-2014' ) ) ); $this->assertEquals( false, $cdf->isCPPAgeEligible( $birth_date, strtotime( '01-May-2015' ) ) ); $this->assertEquals( false, $cdf->isCPPAgeEligible( $birth_date, strtotime( '01-Jun-2015' ) ) ); $this->assertEquals( false, $cdf->isCPPAgeEligible( $birth_date, strtotime( '15-Jun-2015' ) ) ); $this->assertEquals( false, $cdf->isCPPAgeEligible( $birth_date, strtotime( '30-Jun-2015' ) ) ); $this->assertEquals( true, $cdf->isCPPAgeEligible( $birth_date, strtotime( '01-Jul-2015' ) ) ); $this->assertEquals( true, $cdf->isCPPAgeEligible( $birth_date, strtotime( '03-Jul-2015' ) ) ); $this->assertEquals( true, $cdf->isCPPAgeEligible( $birth_date, strtotime( '15-Jul-2015' ) ) ); $this->assertEquals( true, $cdf->isCPPAgeEligible( $birth_date, strtotime( '30-Jul-2015' ) ) ); $this->assertEquals( true, $cdf->isCPPAgeEligible( $birth_date, strtotime( '30-Aug-2015' ) ) ); $this->assertEquals( true, $cdf->isCPPAgeEligible( $birth_date, strtotime( '30-May-2016' ) ) ); $this->assertEquals( true, $cdf->isCPPAgeEligible( $birth_date, strtotime( '30-Jun-2016' ) ) ); $this->assertEquals( true, $cdf->isCPPAgeEligible( $birth_date, strtotime( '30-Jul-2016' ) ) ); $this->assertEquals( true, $cdf->isCPPAgeEligible( $birth_date, strtotime( '30-May-2017' ) ) ); $this->assertEquals( true, $cdf->isCPPAgeEligible( $birth_date, strtotime( '30-Jun-2017' ) ) ); $this->assertEquals( true, $cdf->isCPPAgeEligible( $birth_date, strtotime( '30-Jul-2017' ) ) ); $this->assertEquals( true, $cdf->isCPPAgeEligible( $birth_date, strtotime( '30-May-2018' ) ) ); $this->assertEquals( true, $cdf->isCPPAgeEligible( $birth_date, strtotime( '30-Jun-2018' ) ) ); $this->assertEquals( true, $cdf->isCPPAgeEligible( $birth_date, strtotime( '30-Jul-2018' ) ) ); $this->assertEquals( true, $cdf->isCPPAgeEligible( $birth_date, strtotime( '30-May-2019' ) ) ); $this->assertEquals( true, $cdf->isCPPAgeEligible( $birth_date, strtotime( '30-Jun-2019' ) ) ); $this->assertEquals( true, $cdf->isCPPAgeEligible( $birth_date, strtotime( '30-Jul-2019' ) ) ); $birth_date = strtotime( '15-Jun-1960' ); //55yrs old $this->assertEquals( true, $cdf->isCPPAgeEligible( $birth_date, strtotime( '30-May-2011' ) ) ); $this->assertEquals( true, $cdf->isCPPAgeEligible( $birth_date, strtotime( '30-Jun-2011' ) ) ); $this->assertEquals( true, $cdf->isCPPAgeEligible( $birth_date, strtotime( '30-Jul-2011' ) ) ); $this->assertEquals( true, $cdf->isCPPAgeEligible( $birth_date, strtotime( '30-May-2012' ) ) ); $this->assertEquals( true, $cdf->isCPPAgeEligible( $birth_date, strtotime( '30-Jun-2012' ) ) ); $this->assertEquals( true, $cdf->isCPPAgeEligible( $birth_date, strtotime( '30-Jul-2012' ) ) ); $this->assertEquals( true, $cdf->isCPPAgeEligible( $birth_date, strtotime( '30-May-2013' ) ) ); $this->assertEquals( true, $cdf->isCPPAgeEligible( $birth_date, strtotime( '30-Jun-2013' ) ) ); $this->assertEquals( true, $cdf->isCPPAgeEligible( $birth_date, strtotime( '30-Jul-2013' ) ) ); $this->assertEquals( true, $cdf->isCPPAgeEligible( $birth_date, strtotime( '30-May-2014' ) ) ); $this->assertEquals( true, $cdf->isCPPAgeEligible( $birth_date, strtotime( '30-Jun-2014' ) ) ); $this->assertEquals( true, $cdf->isCPPAgeEligible( $birth_date, strtotime( '30-Jul-2014' ) ) ); $this->assertEquals( true, $cdf->isCPPAgeEligible( $birth_date, strtotime( '30-May-2015' ) ) ); $this->assertEquals( true, $cdf->isCPPAgeEligible( $birth_date, strtotime( '30-Jun-2015' ) ) ); $this->assertEquals( true, $cdf->isCPPAgeEligible( $birth_date, strtotime( '30-Jul-2015' ) ) ); $this->assertEquals( true, $cdf->isCPPAgeEligible( $birth_date, strtotime( '30-May-2016' ) ) ); $this->assertEquals( true, $cdf->isCPPAgeEligible( $birth_date, strtotime( '30-Jun-2016' ) ) ); $this->assertEquals( true, $cdf->isCPPAgeEligible( $birth_date, strtotime( '30-Jul-2016' ) ) ); $birth_date = strtotime( '15-Jun-1945' ); //70yrs old $this->assertEquals( true, $cdf->isCPPAgeEligible( $birth_date, strtotime( '30-May-2011' ) ) ); $this->assertEquals( true, $cdf->isCPPAgeEligible( $birth_date, strtotime( '30-Jun-2011' ) ) ); $this->assertEquals( true, $cdf->isCPPAgeEligible( $birth_date, strtotime( '30-Jul-2011' ) ) ); $this->assertEquals( true, $cdf->isCPPAgeEligible( $birth_date, strtotime( '30-May-2012' ) ) ); $this->assertEquals( true, $cdf->isCPPAgeEligible( $birth_date, strtotime( '30-Jun-2012' ) ) ); $this->assertEquals( true, $cdf->isCPPAgeEligible( $birth_date, strtotime( '30-Jul-2012' ) ) ); $this->assertEquals( true, $cdf->isCPPAgeEligible( $birth_date, strtotime( '30-May-2013' ) ) ); $this->assertEquals( true, $cdf->isCPPAgeEligible( $birth_date, strtotime( '30-Jun-2013' ) ) ); $this->assertEquals( true, $cdf->isCPPAgeEligible( $birth_date, strtotime( '30-Jul-2013' ) ) ); $this->assertEquals( true, $cdf->isCPPAgeEligible( $birth_date, strtotime( '30-May-2014' ) ) ); $this->assertEquals( true, $cdf->isCPPAgeEligible( $birth_date, strtotime( '30-Jun-2014' ) ) ); $this->assertEquals( true, $cdf->isCPPAgeEligible( $birth_date, strtotime( '30-Jul-2014' ) ) ); $this->assertEquals( true, $cdf->isCPPAgeEligible( $birth_date, strtotime( '01-May-2015' ) ) ); $this->assertEquals( true, $cdf->isCPPAgeEligible( $birth_date, strtotime( '01-Jun-2015' ) ) ); $this->assertEquals( true, $cdf->isCPPAgeEligible( $birth_date, strtotime( '15-Jun-2015' ) ) ); $this->assertEquals( true, $cdf->isCPPAgeEligible( $birth_date, strtotime( '30-Jun-2015' ) ) ); $this->assertEquals( false, $cdf->isCPPAgeEligible( $birth_date, strtotime( '01-Jul-2015' ) ) ); $this->assertEquals( false, $cdf->isCPPAgeEligible( $birth_date, strtotime( '03-Jul-2015' ) ) ); $this->assertEquals( false, $cdf->isCPPAgeEligible( $birth_date, strtotime( '15-Jul-2015' ) ) ); $this->assertEquals( false, $cdf->isCPPAgeEligible( $birth_date, strtotime( '30-Jul-2015' ) ) ); $this->assertEquals( false, $cdf->isCPPAgeEligible( $birth_date, strtotime( '30-Aug-2015' ) ) ); $this->assertEquals( false, $cdf->isCPPAgeEligible( $birth_date, strtotime( '30-May-2016' ) ) ); $this->assertEquals( false, $cdf->isCPPAgeEligible( $birth_date, strtotime( '30-Jun-2016' ) ) ); $this->assertEquals( false, $cdf->isCPPAgeEligible( $birth_date, strtotime( '30-Jul-2016' ) ) ); $this->assertEquals( false, $cdf->isCPPAgeEligible( $birth_date, strtotime( '30-May-2017' ) ) ); $this->assertEquals( false, $cdf->isCPPAgeEligible( $birth_date, strtotime( '30-Jun-2017' ) ) ); $this->assertEquals( false, $cdf->isCPPAgeEligible( $birth_date, strtotime( '30-Jul-2017' ) ) ); $this->assertEquals( false, $cdf->isCPPAgeEligible( $birth_date, strtotime( '30-May-2018' ) ) ); $this->assertEquals( false, $cdf->isCPPAgeEligible( $birth_date, strtotime( '30-Jun-2018' ) ) ); $this->assertEquals( false, $cdf->isCPPAgeEligible( $birth_date, strtotime( '30-Jul-2018' ) ) ); $this->assertEquals( false, $cdf->isCPPAgeEligible( $birth_date, strtotime( '30-May-2019' ) ) ); $this->assertEquals( false, $cdf->isCPPAgeEligible( $birth_date, strtotime( '30-Jun-2019' ) ) ); $this->assertEquals( false, $cdf->isCPPAgeEligible( $birth_date, strtotime( '30-Jul-2019' ) ) ); return true; } /** * @group PayStubCalculation_testCPPAgeLimitsB */ //Test 18/70 age limits for CPP and pro-rating. function testCPPAgeLimitsB() { $cdf = new CompanyDeductionFactory(); $cdf->setCompany( $this->company_id ); $cdf->setLegalEntity( $this->legal_entity_id ); $cdf->setStatus( 10 ); //Enabled $cdf->setType( 10 ); //Tax $cdf->setName( 'CPP' ); $cdf->setCalculation( 90 ); //CPP $cdf->setCalculationOrder( 100 ); $cdf->setPayStubEntryAccount( CompanyDeductionFactory::getPayStubEntryAccountByCompanyIDAndTypeAndFuzzyName( $this->company_id, 20, 'CPP' ) ); //if ( $cdf->isValid() ) { // $cdf->Save(FALSE); // $cdf->setIncludePayStubEntryAccount( array( $this->pay_stub_account_link_arr['total_gross'] ) ); // if ( $cdf->isValid() ) { // $cdf->Save( FALSE ); // } //} $udf = new UserDeductionFactory(); $udf->setUser( $this->user_id ); $udf->setStartDate( strtotime( '16-Oct-2015' ) ); $udf->setEndDate( '' ); $this->assertEquals( false, $cdf->isActiveDate( $udf, null, strtotime( '01-Sep-2014' ) ) ); $this->assertEquals( false, $cdf->isActiveDate( $udf, null, strtotime( '01-Sep-2015' ) ) ); $this->assertEquals( false, $cdf->isActiveDate( $udf, null, strtotime( '01-Oct-2015' ) ) ); $this->assertEquals( false, $cdf->isActiveDate( $udf, null, strtotime( '31-Oct-2015' ) ) ); $this->assertEquals( true, $cdf->isActiveDate( $udf, null, strtotime( '01-Nov-2015' ) ) ); $this->assertEquals( true, $cdf->isActiveDate( $udf, null, strtotime( '31-Nov-2015' ) ) ); $this->assertEquals( true, $cdf->isActiveDate( $udf, null, strtotime( '01-Dec-2015' ) ) ); $this->assertEquals( true, $cdf->isActiveDate( $udf, null, strtotime( '31-Dec-2015' ) ) ); $this->assertEquals( true, $cdf->isActiveDate( $udf, null, strtotime( '01-Jan-2016' ) ) ); $this->assertEquals( true, $cdf->isActiveDate( $udf, null, strtotime( '14-Jan-2016' ) ) ); $this->assertEquals( true, $cdf->isActiveDate( $udf, null, strtotime( '16-Jan-2016' ) ) ); $this->assertEquals( true, $cdf->isActiveDate( $udf, null, strtotime( '31-Jan-2016' ) ) ); $this->assertEquals( true, $cdf->isActiveDate( $udf, null, strtotime( '31-Jan-2017' ) ) ); $udf->setStartDate( strtotime( '31-Dec-2015' ) ); //18yrs old $this->assertEquals( false, $cdf->isActiveDate( $udf, null, strtotime( '01-Sep-2014' ) ) ); $this->assertEquals( false, $cdf->isActiveDate( $udf, null, strtotime( '01-Sep-2015' ) ) ); $this->assertEquals( false, $cdf->isActiveDate( $udf, null, strtotime( '01-Oct-2015' ) ) ); $this->assertEquals( false, $cdf->isActiveDate( $udf, null, strtotime( '31-Oct-2015' ) ) ); $this->assertEquals( false, $cdf->isActiveDate( $udf, null, strtotime( '01-Nov-2015' ) ) ); $this->assertEquals( false, $cdf->isActiveDate( $udf, null, strtotime( '31-Nov-2015' ) ) ); $this->assertEquals( false, $cdf->isActiveDate( $udf, null, strtotime( '01-Dec-2015' ) ) ); $this->assertEquals( false, $cdf->isActiveDate( $udf, null, strtotime( '31-Dec-2015' ) ) ); $this->assertEquals( true, $cdf->isActiveDate( $udf, null, strtotime( '01-Jan-2016' ) ) ); $this->assertEquals( true, $cdf->isActiveDate( $udf, null, strtotime( '14-Jan-2016' ) ) ); $this->assertEquals( true, $cdf->isActiveDate( $udf, null, strtotime( '16-Jan-2016' ) ) ); $this->assertEquals( true, $cdf->isActiveDate( $udf, null, strtotime( '31-Jan-2016' ) ) ); $this->assertEquals( true, $cdf->isActiveDate( $udf, null, strtotime( '31-Jan-2017' ) ) ); $udf->setStartDate( strtotime( '15-Jun-2015' ) ); //18yrs old $this->assertEquals( false, $cdf->isActiveDate( $udf, null, strtotime( '30-May-2011' ) ) ); $this->assertEquals( false, $cdf->isActiveDate( $udf, null, strtotime( '30-Jun-2011' ) ) ); $this->assertEquals( false, $cdf->isActiveDate( $udf, null, strtotime( '30-Jul-2011' ) ) ); $this->assertEquals( false, $cdf->isActiveDate( $udf, null, strtotime( '30-May-2012' ) ) ); $this->assertEquals( false, $cdf->isActiveDate( $udf, null, strtotime( '30-Jun-2012' ) ) ); $this->assertEquals( false, $cdf->isActiveDate( $udf, null, strtotime( '30-Jul-2012' ) ) ); $this->assertEquals( false, $cdf->isActiveDate( $udf, null, strtotime( '30-May-2013' ) ) ); $this->assertEquals( false, $cdf->isActiveDate( $udf, null, strtotime( '30-Jun-2013' ) ) ); $this->assertEquals( false, $cdf->isActiveDate( $udf, null, strtotime( '30-Jul-2013' ) ) ); $this->assertEquals( false, $cdf->isActiveDate( $udf, null, strtotime( '30-May-2014' ) ) ); $this->assertEquals( false, $cdf->isActiveDate( $udf, null, strtotime( '30-Jun-2014' ) ) ); $this->assertEquals( false, $cdf->isActiveDate( $udf, null, strtotime( '30-Jul-2014' ) ) ); $this->assertEquals( false, $cdf->isActiveDate( $udf, null, strtotime( '01-May-2015' ) ) ); $this->assertEquals( false, $cdf->isActiveDate( $udf, null, strtotime( '01-Jun-2015' ) ) ); $this->assertEquals( false, $cdf->isActiveDate( $udf, null, strtotime( '15-Jun-2015' ) ) ); $this->assertEquals( false, $cdf->isActiveDate( $udf, null, strtotime( '30-Jun-2015' ) ) ); $this->assertEquals( true, $cdf->isActiveDate( $udf, null, strtotime( '01-Jul-2015' ) ) ); $this->assertEquals( true, $cdf->isActiveDate( $udf, null, strtotime( '03-Jul-2015' ) ) ); $this->assertEquals( true, $cdf->isActiveDate( $udf, null, strtotime( '15-Jul-2015' ) ) ); $this->assertEquals( true, $cdf->isActiveDate( $udf, null, strtotime( '30-Jul-2015' ) ) ); $this->assertEquals( true, $cdf->isActiveDate( $udf, null, strtotime( '30-Aug-2015' ) ) ); $this->assertEquals( true, $cdf->isActiveDate( $udf, null, strtotime( '30-May-2016' ) ) ); $this->assertEquals( true, $cdf->isActiveDate( $udf, null, strtotime( '30-Jun-2016' ) ) ); $this->assertEquals( true, $cdf->isActiveDate( $udf, null, strtotime( '30-Jul-2016' ) ) ); $this->assertEquals( true, $cdf->isActiveDate( $udf, null, strtotime( '30-May-2017' ) ) ); $this->assertEquals( true, $cdf->isActiveDate( $udf, null, strtotime( '30-Jun-2017' ) ) ); $this->assertEquals( true, $cdf->isActiveDate( $udf, null, strtotime( '30-Jul-2017' ) ) ); $this->assertEquals( true, $cdf->isActiveDate( $udf, null, strtotime( '30-May-2018' ) ) ); $this->assertEquals( true, $cdf->isActiveDate( $udf, null, strtotime( '30-Jun-2018' ) ) ); $this->assertEquals( true, $cdf->isActiveDate( $udf, null, strtotime( '30-Jul-2018' ) ) ); $this->assertEquals( true, $cdf->isActiveDate( $udf, null, strtotime( '30-May-2019' ) ) ); $this->assertEquals( true, $cdf->isActiveDate( $udf, null, strtotime( '30-Jun-2019' ) ) ); $this->assertEquals( true, $cdf->isActiveDate( $udf, null, strtotime( '30-Jul-2019' ) ) ); $udf->setStartDate( strtotime( '15-Jun-2010' ) ); //55yrs old $this->assertEquals( true, $cdf->isActiveDate( $udf, null, strtotime( '30-May-2011' ) ) ); $this->assertEquals( true, $cdf->isActiveDate( $udf, null, strtotime( '30-Jun-2011' ) ) ); $this->assertEquals( true, $cdf->isActiveDate( $udf, null, strtotime( '30-Jul-2011' ) ) ); $this->assertEquals( true, $cdf->isActiveDate( $udf, null, strtotime( '30-May-2012' ) ) ); $this->assertEquals( true, $cdf->isActiveDate( $udf, null, strtotime( '30-Jun-2012' ) ) ); $this->assertEquals( true, $cdf->isActiveDate( $udf, null, strtotime( '30-Jul-2012' ) ) ); $this->assertEquals( true, $cdf->isActiveDate( $udf, null, strtotime( '30-May-2013' ) ) ); $this->assertEquals( true, $cdf->isActiveDate( $udf, null, strtotime( '30-Jun-2013' ) ) ); $this->assertEquals( true, $cdf->isActiveDate( $udf, null, strtotime( '30-Jul-2013' ) ) ); $this->assertEquals( true, $cdf->isActiveDate( $udf, null, strtotime( '30-May-2014' ) ) ); $this->assertEquals( true, $cdf->isActiveDate( $udf, null, strtotime( '30-Jun-2014' ) ) ); $this->assertEquals( true, $cdf->isActiveDate( $udf, null, strtotime( '30-Jul-2014' ) ) ); $this->assertEquals( true, $cdf->isActiveDate( $udf, null, strtotime( '30-May-2015' ) ) ); $this->assertEquals( true, $cdf->isActiveDate( $udf, null, strtotime( '30-Jun-2015' ) ) ); $this->assertEquals( true, $cdf->isActiveDate( $udf, null, strtotime( '30-Jul-2015' ) ) ); $this->assertEquals( true, $cdf->isActiveDate( $udf, null, strtotime( '30-May-2016' ) ) ); $this->assertEquals( true, $cdf->isActiveDate( $udf, null, strtotime( '30-Jun-2016' ) ) ); $this->assertEquals( true, $cdf->isActiveDate( $udf, null, strtotime( '30-Jul-2016' ) ) ); $udf->setStartDate( strtotime( '15-Jun-1970' ) ); $udf->setEndDate( strtotime( '15-Jun-2015' ) ); //70yrs old $this->assertEquals( true, $cdf->isActiveDate( $udf, null, strtotime( '30-May-2011' ) ) ); $this->assertEquals( true, $cdf->isActiveDate( $udf, null, strtotime( '30-Jun-2011' ) ) ); $this->assertEquals( true, $cdf->isActiveDate( $udf, null, strtotime( '30-Jul-2011' ) ) ); $this->assertEquals( true, $cdf->isActiveDate( $udf, null, strtotime( '30-May-2012' ) ) ); $this->assertEquals( true, $cdf->isActiveDate( $udf, null, strtotime( '30-Jun-2012' ) ) ); $this->assertEquals( true, $cdf->isActiveDate( $udf, null, strtotime( '30-Jul-2012' ) ) ); $this->assertEquals( true, $cdf->isActiveDate( $udf, null, strtotime( '30-May-2013' ) ) ); $this->assertEquals( true, $cdf->isActiveDate( $udf, null, strtotime( '30-Jun-2013' ) ) ); $this->assertEquals( true, $cdf->isActiveDate( $udf, null, strtotime( '30-Jul-2013' ) ) ); $this->assertEquals( true, $cdf->isActiveDate( $udf, null, strtotime( '30-May-2014' ) ) ); $this->assertEquals( true, $cdf->isActiveDate( $udf, null, strtotime( '30-Jun-2014' ) ) ); $this->assertEquals( true, $cdf->isActiveDate( $udf, null, strtotime( '30-Jul-2014' ) ) ); $this->assertEquals( true, $cdf->isActiveDate( $udf, null, strtotime( '01-May-2015' ) ) ); $this->assertEquals( true, $cdf->isActiveDate( $udf, null, strtotime( '01-Jun-2015' ) ) ); $this->assertEquals( true, $cdf->isActiveDate( $udf, null, strtotime( '15-Jun-2015' ) ) ); $this->assertEquals( true, $cdf->isActiveDate( $udf, null, strtotime( '30-Jun-2015' ) ) ); $this->assertEquals( false, $cdf->isActiveDate( $udf, null, strtotime( '01-Jul-2015' ) ) ); $this->assertEquals( false, $cdf->isActiveDate( $udf, null, strtotime( '03-Jul-2015' ) ) ); $this->assertEquals( false, $cdf->isActiveDate( $udf, null, strtotime( '15-Jul-2015' ) ) ); $this->assertEquals( false, $cdf->isActiveDate( $udf, null, strtotime( '30-Jul-2015' ) ) ); $this->assertEquals( false, $cdf->isActiveDate( $udf, null, strtotime( '30-Aug-2015' ) ) ); $this->assertEquals( false, $cdf->isActiveDate( $udf, null, strtotime( '30-May-2016' ) ) ); $this->assertEquals( false, $cdf->isActiveDate( $udf, null, strtotime( '30-Jun-2016' ) ) ); $this->assertEquals( false, $cdf->isActiveDate( $udf, null, strtotime( '30-Jul-2016' ) ) ); $this->assertEquals( false, $cdf->isActiveDate( $udf, null, strtotime( '30-May-2017' ) ) ); $this->assertEquals( false, $cdf->isActiveDate( $udf, null, strtotime( '30-Jun-2017' ) ) ); $this->assertEquals( false, $cdf->isActiveDate( $udf, null, strtotime( '30-Jul-2017' ) ) ); $this->assertEquals( false, $cdf->isActiveDate( $udf, null, strtotime( '30-May-2018' ) ) ); $this->assertEquals( false, $cdf->isActiveDate( $udf, null, strtotime( '30-Jun-2018' ) ) ); $this->assertEquals( false, $cdf->isActiveDate( $udf, null, strtotime( '30-Jul-2018' ) ) ); $this->assertEquals( false, $cdf->isActiveDate( $udf, null, strtotime( '30-May-2019' ) ) ); $this->assertEquals( false, $cdf->isActiveDate( $udf, null, strtotime( '30-Jun-2019' ) ) ); $this->assertEquals( false, $cdf->isActiveDate( $udf, null, strtotime( '30-Jul-2019' ) ) ); return true; } /** * @group PayStubCalculation_testCompanyDeductionLengthOfServiceBracketsA */ function testCompanyDeductionLengthOfServiceBracketsA() { $cdf_a = new CompanyDeductionFactory(); $cdf_a->setCompany( $this->company_id ); $cdf_a->setLegalEntity( $this->legal_entity_id ); $cdf_a->setStatus( 10 ); //Enabled $cdf_a->setType( 10 ); //Tax $cdf_a->setName( 'Vacation Accrual 0 -> 4.999' ); $cdf_a->setCalculation( 10 ); //Percent $cdf_a->setCalculationOrder( 100 ); $cdf_a->setPayStubEntryAccount( CompanyDeductionFactory::getPayStubEntryAccountByCompanyIDAndTypeAndFuzzyName( $this->company_id, 20, 'Vacation Accrual' ) ); $cdf_a->setMinimumLengthOfServiceUnit( 40 ); $cdf_a->setMinimumLengthOfService( 0 ); $cdf_a->setMaximumLengthOfServiceUnit( 40 ); $cdf_a->setMaximumLengthOfService( 4.999 ); $cdf_a->preSave(); //Calculates the setMinimumLengthOfServiceDays(), setMaximumLengthOfServiceDays() $cdf_b = new CompanyDeductionFactory(); $cdf_b->setCompany( $this->company_id ); $cdf_b->setLegalEntity( $this->legal_entity_id ); $cdf_b->setStatus( 10 ); //Enabled $cdf_b->setType( 10 ); //Tax $cdf_b->setName( 'Vacation Accrual 5 -> 9.999' ); $cdf_b->setCalculation( 10 ); //Percent $cdf_b->setCalculationOrder( 100 ); $cdf_b->setPayStubEntryAccount( CompanyDeductionFactory::getPayStubEntryAccountByCompanyIDAndTypeAndFuzzyName( $this->company_id, 20, 'Vacation Accrual' ) ); $cdf_b->setMinimumLengthOfServiceUnit( 40 ); $cdf_b->setMinimumLengthOfService( 5 ); $cdf_b->setMaximumLengthOfServiceUnit( 40 ); $cdf_b->setMaximumLengthOfService( 9.999 ); $cdf_b->preSave(); //Calculates the setMinimumLengthOfServiceDays(), setMaximumLengthOfServiceDays() $udf = new UserDeductionFactory(); $udf->setUser( $this->user_id ); $udf->setLengthOfServiceDate( strtotime( '15-Jul-2010' ) ); $udf->setStartDate( '' ); $udf->setEndDate( '' ); $this->assertEquals( true, $cdf_a->isActiveLengthOfService( $udf, strtotime( '14-Jul-2010' ) ) ); //Before length of service date, its consider true if it starts on 0. $this->assertEquals( true, $cdf_a->isActiveLengthOfService( $udf, strtotime( '15-Jul-2010' ) ) ); //Right on length of service date. $this->assertEquals( true, $cdf_a->isActiveLengthOfService( $udf, strtotime( '16-Jul-2010' ) ) ); //One day after length of service date. $this->assertEquals( true, $cdf_a->isActiveLengthOfService( $udf, strtotime( '16-Jul-2011' ) ) ); $this->assertEquals( true, $cdf_a->isActiveLengthOfService( $udf, strtotime( '16-Jul-2012' ) ) ); $this->assertEquals( true, $cdf_a->isActiveLengthOfService( $udf, strtotime( '16-Jul-2013' ) ) ); $this->assertEquals( true, $cdf_a->isActiveLengthOfService( $udf, strtotime( '16-Jul-2014' ) ) ); $this->assertEquals( true, $cdf_a->isActiveLengthOfService( $udf, strtotime( '14-Jul-2015' ) ) ); $this->assertEquals( false, $cdf_a->isActiveLengthOfService( $udf, strtotime( '15-Jul-2015' ) ) ); $this->assertEquals( false, $cdf_a->isActiveLengthOfService( $udf, strtotime( '16-Jul-2015' ) ) ); $this->assertEquals( false, $cdf_a->isActiveLengthOfService( $udf, strtotime( '16-Jul-2016' ) ) ); $this->assertEquals( false, $cdf_a->isActiveLengthOfService( $udf, strtotime( '16-Jul-2017' ) ) ); $this->assertEquals( false, $cdf_a->isActiveLengthOfService( $udf, strtotime( '16-Jul-2018' ) ) ); $this->assertEquals( false, $cdf_a->isActiveLengthOfService( $udf, strtotime( '16-Jul-2019' ) ) ); $this->assertEquals( false, $cdf_a->isActiveLengthOfService( $udf, strtotime( '16-Jul-2020' ) ) ); $this->assertEquals( false, $cdf_b->isActiveLengthOfService( $udf, strtotime( '14-Jul-2010' ) ) ); $this->assertEquals( false, $cdf_b->isActiveLengthOfService( $udf, strtotime( '15-Jul-2010' ) ) ); $this->assertEquals( false, $cdf_b->isActiveLengthOfService( $udf, strtotime( '16-Jul-2010' ) ) ); $this->assertEquals( false, $cdf_b->isActiveLengthOfService( $udf, strtotime( '16-Jul-2011' ) ) ); $this->assertEquals( false, $cdf_b->isActiveLengthOfService( $udf, strtotime( '16-Jul-2012' ) ) ); $this->assertEquals( false, $cdf_b->isActiveLengthOfService( $udf, strtotime( '16-Jul-2013' ) ) ); $this->assertEquals( false, $cdf_b->isActiveLengthOfService( $udf, strtotime( '16-Jul-2014' ) ) ); $this->assertEquals( false, $cdf_b->isActiveLengthOfService( $udf, strtotime( '14-Jul-2014' ) ) ); $this->assertEquals( false, $cdf_b->isActiveLengthOfService( $udf, strtotime( '15-Jul-2014' ) ) ); $this->assertEquals( false, $cdf_b->isActiveLengthOfService( $udf, strtotime( '14-Jul-2015' ) ) ); $this->assertEquals( true, $cdf_b->isActiveLengthOfService( $udf, strtotime( '15-Jul-2015' ) ) ); $this->assertEquals( true, $cdf_b->isActiveLengthOfService( $udf, strtotime( '16-Jul-2015' ) ) ); $this->assertEquals( true, $cdf_b->isActiveLengthOfService( $udf, strtotime( '16-Jul-2016' ) ) ); $this->assertEquals( true, $cdf_b->isActiveLengthOfService( $udf, strtotime( '16-Jul-2017' ) ) ); $this->assertEquals( true, $cdf_b->isActiveLengthOfService( $udf, strtotime( '16-Jul-2018' ) ) ); $this->assertEquals( true, $cdf_b->isActiveLengthOfService( $udf, strtotime( '16-Jul-2019' ) ) ); $this->assertEquals( true, $cdf_b->isActiveLengthOfService( $udf, strtotime( '14-Jul-2020' ) ) ); $this->assertEquals( false, $cdf_b->isActiveLengthOfService( $udf, strtotime( '15-Jul-2020' ) ) ); $this->assertEquals( false, $cdf_b->isActiveLengthOfService( $udf, strtotime( '16-Jul-2020' ) ) ); return true; } /** * @group PayStubCalculation_testCompanyDeductionLengthOfServiceBracketsB */ function testCompanyDeductionLengthOfServiceBracketsB() { $cdf_a = new CompanyDeductionFactory(); $cdf_a->setCompany( $this->company_id ); $cdf_a->setLegalEntity( $this->legal_entity_id ); $cdf_a->setStatus( 10 ); //Enabled $cdf_a->setType( 10 ); //Tax $cdf_a->setName( 'Vacation Accrual 0 -> 5' ); $cdf_a->setCalculation( 10 ); //Percent $cdf_a->setCalculationOrder( 100 ); $cdf_a->setPayStubEntryAccount( CompanyDeductionFactory::getPayStubEntryAccountByCompanyIDAndTypeAndFuzzyName( $this->company_id, 20, 'Vacation Accrual' ) ); $cdf_a->setMinimumLengthOfServiceUnit( 40 ); $cdf_a->setMinimumLengthOfService( 0 ); $cdf_a->setMaximumLengthOfServiceUnit( 40 ); $cdf_a->setMaximumLengthOfService( 5 ); $cdf_a->preSave(); //Calculates the setMinimumLengthOfServiceDays(), setMaximumLengthOfServiceDays() $cdf_b = new CompanyDeductionFactory(); $cdf_b->setCompany( $this->company_id ); $cdf_b->setLegalEntity( $this->legal_entity_id ); $cdf_b->setStatus( 10 ); //Enabled $cdf_b->setType( 10 ); //Tax $cdf_b->setName( 'Vacation Accrual 5 -> 10' ); $cdf_b->setCalculation( 10 ); //Percent $cdf_b->setCalculationOrder( 100 ); $cdf_b->setPayStubEntryAccount( CompanyDeductionFactory::getPayStubEntryAccountByCompanyIDAndTypeAndFuzzyName( $this->company_id, 20, 'Vacation Accrual' ) ); $cdf_b->setMinimumLengthOfServiceUnit( 40 ); $cdf_b->setMinimumLengthOfService( 5 ); $cdf_b->setMaximumLengthOfServiceUnit( 40 ); $cdf_b->setMaximumLengthOfService( 10 ); $cdf_b->preSave(); //Calculates the setMinimumLengthOfServiceDays(), setMaximumLengthOfServiceDays() $udf = new UserDeductionFactory(); $udf->setUser( $this->user_id ); $udf->setLengthOfServiceDate( strtotime( '15-Jul-2010' ) ); $udf->setStartDate( '' ); $udf->setEndDate( '' ); $this->assertEquals( true, $cdf_a->isActiveLengthOfService( $udf, strtotime( '14-Jul-2010' ) ) ); //Before length of service date, its consider true if it starts on 0. $this->assertEquals( true, $cdf_a->isActiveLengthOfService( $udf, strtotime( '15-Jul-2010' ) ) ); //Right on length of service date. $this->assertEquals( true, $cdf_a->isActiveLengthOfService( $udf, strtotime( '16-Jul-2010' ) ) ); //One day after length of service date. $this->assertEquals( true, $cdf_a->isActiveLengthOfService( $udf, strtotime( '16-Jul-2011' ) ) ); $this->assertEquals( true, $cdf_a->isActiveLengthOfService( $udf, strtotime( '16-Jul-2012' ) ) ); $this->assertEquals( true, $cdf_a->isActiveLengthOfService( $udf, strtotime( '16-Jul-2013' ) ) ); $this->assertEquals( true, $cdf_a->isActiveLengthOfService( $udf, strtotime( '16-Jul-2014' ) ) ); $this->assertEquals( true, $cdf_a->isActiveLengthOfService( $udf, strtotime( '14-Jul-2015' ) ) ); $this->assertEquals( false, $cdf_a->isActiveLengthOfService( $udf, strtotime( '15-Jul-2015' ) ) ); $this->assertEquals( false, $cdf_a->isActiveLengthOfService( $udf, strtotime( '16-Jul-2015' ) ) ); $this->assertEquals( false, $cdf_a->isActiveLengthOfService( $udf, strtotime( '16-Jul-2016' ) ) ); $this->assertEquals( false, $cdf_a->isActiveLengthOfService( $udf, strtotime( '16-Jul-2017' ) ) ); $this->assertEquals( false, $cdf_a->isActiveLengthOfService( $udf, strtotime( '16-Jul-2018' ) ) ); $this->assertEquals( false, $cdf_a->isActiveLengthOfService( $udf, strtotime( '16-Jul-2019' ) ) ); $this->assertEquals( false, $cdf_a->isActiveLengthOfService( $udf, strtotime( '16-Jul-2020' ) ) ); $this->assertEquals( false, $cdf_b->isActiveLengthOfService( $udf, strtotime( '14-Jul-2010' ) ) ); $this->assertEquals( false, $cdf_b->isActiveLengthOfService( $udf, strtotime( '15-Jul-2010' ) ) ); $this->assertEquals( false, $cdf_b->isActiveLengthOfService( $udf, strtotime( '16-Jul-2010' ) ) ); $this->assertEquals( false, $cdf_b->isActiveLengthOfService( $udf, strtotime( '16-Jul-2011' ) ) ); $this->assertEquals( false, $cdf_b->isActiveLengthOfService( $udf, strtotime( '16-Jul-2012' ) ) ); $this->assertEquals( false, $cdf_b->isActiveLengthOfService( $udf, strtotime( '16-Jul-2013' ) ) ); $this->assertEquals( false, $cdf_b->isActiveLengthOfService( $udf, strtotime( '16-Jul-2014' ) ) ); $this->assertEquals( false, $cdf_b->isActiveLengthOfService( $udf, strtotime( '14-Jul-2014' ) ) ); $this->assertEquals( false, $cdf_b->isActiveLengthOfService( $udf, strtotime( '15-Jul-2014' ) ) ); $this->assertEquals( false, $cdf_b->isActiveLengthOfService( $udf, strtotime( '14-Jul-2015' ) ) ); $this->assertEquals( true, $cdf_b->isActiveLengthOfService( $udf, strtotime( '15-Jul-2015' ) ) ); $this->assertEquals( true, $cdf_b->isActiveLengthOfService( $udf, strtotime( '16-Jul-2015' ) ) ); $this->assertEquals( true, $cdf_b->isActiveLengthOfService( $udf, strtotime( '16-Jul-2016' ) ) ); $this->assertEquals( true, $cdf_b->isActiveLengthOfService( $udf, strtotime( '16-Jul-2017' ) ) ); $this->assertEquals( true, $cdf_b->isActiveLengthOfService( $udf, strtotime( '16-Jul-2018' ) ) ); $this->assertEquals( true, $cdf_b->isActiveLengthOfService( $udf, strtotime( '16-Jul-2019' ) ) ); $this->assertEquals( true, $cdf_b->isActiveLengthOfService( $udf, strtotime( '14-Jul-2020' ) ) ); $this->assertEquals( false, $cdf_b->isActiveLengthOfService( $udf, strtotime( '15-Jul-2020' ) ) ); $this->assertEquals( false, $cdf_b->isActiveLengthOfService( $udf, strtotime( '16-Jul-2020' ) ) ); return true; } /** * @group PayStubCalculation_testCompanyDeductionLengthOfServiceBracketsC */ function testCompanyDeductionLengthOfServiceBracketsC() { $cdf_a = new CompanyDeductionFactory(); $cdf_a->setCompany( $this->company_id ); $cdf_a->setLegalEntity( $this->legal_entity_id ); $cdf_a->setStatus( 10 ); //Enabled $cdf_a->setType( 10 ); //Tax $cdf_a->setName( 'Vacation Accrual 0 -> 7.999' ); $cdf_a->setCalculation( 10 ); //Percent $cdf_a->setCalculationOrder( 100 ); $cdf_a->setPayStubEntryAccount( CompanyDeductionFactory::getPayStubEntryAccountByCompanyIDAndTypeAndFuzzyName( $this->company_id, 20, 'Vacation Accrual' ) ); $cdf_a->setMinimumLengthOfServiceUnit( 40 ); $cdf_a->setMinimumLengthOfService( 0 ); $cdf_a->setMaximumLengthOfServiceUnit( 40 ); $cdf_a->setMaximumLengthOfService( 7.999 ); $cdf_a->preSave(); //Calculates the setMinimumLengthOfServiceDays(), setMaximumLengthOfServiceDays() $cdf_b = new CompanyDeductionFactory(); $cdf_b->setCompany( $this->company_id ); $cdf_b->setLegalEntity( $this->legal_entity_id ); $cdf_b->setStatus( 10 ); //Enabled $cdf_b->setType( 10 ); //Tax $cdf_b->setName( 'Vacation Accrual 8 -> 12' ); $cdf_b->setCalculation( 10 ); //Percent $cdf_b->setCalculationOrder( 100 ); $cdf_b->setPayStubEntryAccount( CompanyDeductionFactory::getPayStubEntryAccountByCompanyIDAndTypeAndFuzzyName( $this->company_id, 20, 'Vacation Accrual' ) ); $cdf_b->setMinimumLengthOfServiceUnit( 40 ); $cdf_b->setMinimumLengthOfService( 8 ); $cdf_b->setMaximumLengthOfServiceUnit( 40 ); $cdf_b->setMaximumLengthOfService( 11.999 ); $cdf_b->preSave(); //Calculates the setMinimumLengthOfServiceDays(), setMaximumLengthOfServiceDays() $udf = new UserDeductionFactory(); $udf->setUser( $this->user_id ); $udf->setLengthOfServiceDate( strtotime( '14-Feb-2013' ) ); $udf->setStartDate( '' ); $udf->setEndDate( '' ); $this->assertEquals( true, $cdf_a->isActiveLengthOfService( $udf, strtotime( '12-Feb-2021' ) ) ); $this->assertEquals( true, $cdf_a->isActiveLengthOfService( $udf, strtotime( '13-Feb-2021' ) ) ); $this->assertEquals( true, $cdf_a->isActiveLengthOfService( $udf, 1613275199 ) ); //Sat, 13 Feb 2021 23:59:59 -0400 $this->assertEquals( false, $cdf_a->isActiveLengthOfService( $udf, strtotime( '14-Feb-2021' ) ) ); $this->assertEquals( false, $cdf_a->isActiveLengthOfService( $udf, strtotime( '15-Feb-2021' ) ) ); $this->assertEquals( false, $cdf_b->isActiveLengthOfService( $udf, strtotime( '12-Feb-2021' ) ) ); $this->assertEquals( false, $cdf_b->isActiveLengthOfService( $udf, strtotime( '13-Feb-2021' ) ) ); $this->assertEquals( false, $cdf_b->isActiveLengthOfService( $udf, 1613275199 ) ); //Sat, 13 Feb 2021 23:59:59 -0400 $this->assertEquals( true, $cdf_b->isActiveLengthOfService( $udf, strtotime( '14-Feb-2021' ) ) ); $this->assertEquals( true, $cdf_b->isActiveLengthOfService( $udf, strtotime( '15-Feb-2021' ) ) ); return true; } /** * @group PayStubCalculation_testCompanyDeductionLengthOfServiceBracketsD */ function testCompanyDeductionLengthOfServiceBracketsD() { $cdf_a = new CompanyDeductionFactory(); $cdf_a->setCompany( $this->company_id ); $cdf_a->setLegalEntity( $this->legal_entity_id ); $cdf_a->setStatus( 10 ); //Enabled $cdf_a->setType( 10 ); //Tax $cdf_a->setName( 'Vacation Accrual 0 -> 2.999' ); $cdf_a->setCalculation( 10 ); //Percent $cdf_a->setCalculationOrder( 100 ); $cdf_a->setPayStubEntryAccount( CompanyDeductionFactory::getPayStubEntryAccountByCompanyIDAndTypeAndFuzzyName( $this->company_id, 20, 'Vacation Accrual' ) ); $cdf_a->setMinimumLengthOfServiceUnit( 40 ); //40=Years $cdf_a->setMinimumLengthOfService( 0 ); $cdf_a->setMaximumLengthOfServiceUnit( 40 ); //40=Years $cdf_a->setMaximumLengthOfService( 3 ); $cdf_a->preSave(); //Calculates the setMinimumLengthOfServiceDays(), setMaximumLengthOfServiceDays() $cdf_b = new CompanyDeductionFactory(); $cdf_b->setCompany( $this->company_id ); $cdf_b->setLegalEntity( $this->legal_entity_id ); $cdf_b->setStatus( 10 ); //Enabled $cdf_b->setType( 10 ); //Tax $cdf_b->setName( 'Vacation Accrual 0 -> 3' ); $cdf_b->setCalculation( 10 ); //Percent $cdf_b->setCalculationOrder( 100 ); $cdf_b->setPayStubEntryAccount( CompanyDeductionFactory::getPayStubEntryAccountByCompanyIDAndTypeAndFuzzyName( $this->company_id, 20, 'Vacation Accrual' ) ); $cdf_b->setMinimumLengthOfServiceUnit( 40 ); $cdf_b->setMinimumLengthOfService( 3 ); $cdf_b->setMaximumLengthOfServiceUnit( 40 ); $cdf_b->setMaximumLengthOfService( 5 ); $cdf_b->preSave(); //Calculates the setMinimumLengthOfServiceDays(), setMaximumLengthOfServiceDays() $udf = new UserDeductionFactory(); $udf->setUser( $this->user_id ); $udf->setLengthOfServiceDate( strtotime( '01-Feb-2019' ) ); $udf->setStartDate( '' ); $udf->setEndDate( '' ); $this->assertEquals( true, $cdf_a->isActiveLengthOfService( $udf, strtotime( '30-Jan-2022' ) ) ); $this->assertEquals( true, $cdf_a->isActiveLengthOfService( $udf, strtotime( '31-Jan-2022' ) ) ); $this->assertEquals( false, $cdf_a->isActiveLengthOfService( $udf, strtotime( '01-Feb-2022' ) ) ); $this->assertEquals( false, $cdf_a->isActiveLengthOfService( $udf, strtotime( '02-Feb-2022' ) ) ); $this->assertEquals( false, $cdf_b->isActiveLengthOfService( $udf, strtotime( '30-Jan-2022' ) ) ); $this->assertEquals( false, $cdf_b->isActiveLengthOfService( $udf, strtotime( '31-Jan-2022' ) ) ); $this->assertEquals( true, $cdf_b->isActiveLengthOfService( $udf, strtotime( '01-Feb-2022' ) ) ); $this->assertEquals( true, $cdf_b->isActiveLengthOfService( $udf, strtotime( '02-Feb-2022' ) ) ); return true; } /** * @group PayStubCalculation_testCompanyDeductionLengthOfServiceBracketsE */ function testCompanyDeductionLengthOfServiceBracketsE() { $cdf_a = new CompanyDeductionFactory(); $cdf_a->setCompany( $this->company_id ); $cdf_a->setLegalEntity( $this->legal_entity_id ); $cdf_a->setStatus( 10 ); //Enabled $cdf_a->setType( 10 ); //Tax $cdf_a->setName( 'Vacation Accrual 0 -> 2.999' ); $cdf_a->setCalculation( 10 ); //Percent $cdf_a->setCalculationOrder( 100 ); $cdf_a->setPayStubEntryAccount( CompanyDeductionFactory::getPayStubEntryAccountByCompanyIDAndTypeAndFuzzyName( $this->company_id, 20, 'Vacation Accrual' ) ); $cdf_a->setMinimumLengthOfServiceUnit( 30 ); //30=Month $cdf_a->setMinimumLengthOfService( 0 ); $cdf_a->setMaximumLengthOfServiceUnit( 30 ); //30=Month $cdf_a->setMaximumLengthOfService( 36 ); $cdf_a->preSave(); //Calculates the setMinimumLengthOfServiceDays(), setMaximumLengthOfServiceDays() $cdf_b = new CompanyDeductionFactory(); $cdf_b->setCompany( $this->company_id ); $cdf_b->setLegalEntity( $this->legal_entity_id ); $cdf_b->setStatus( 10 ); //Enabled $cdf_b->setType( 10 ); //Tax $cdf_b->setName( 'Vacation Accrual 0 -> 3' ); $cdf_b->setCalculation( 10 ); //Percent $cdf_b->setCalculationOrder( 100 ); $cdf_b->setPayStubEntryAccount( CompanyDeductionFactory::getPayStubEntryAccountByCompanyIDAndTypeAndFuzzyName( $this->company_id, 20, 'Vacation Accrual' ) ); $cdf_b->setMinimumLengthOfServiceUnit( 30 ); $cdf_b->setMinimumLengthOfService( 36 ); $cdf_b->setMaximumLengthOfServiceUnit( 30 ); $cdf_b->setMaximumLengthOfService( 60 ); $cdf_b->preSave(); //Calculates the setMinimumLengthOfServiceDays(), setMaximumLengthOfServiceDays() $udf = new UserDeductionFactory(); $udf->setUser( $this->user_id ); $udf->setLengthOfServiceDate( strtotime( '01-Feb-2019' ) ); $udf->setStartDate( '' ); $udf->setEndDate( '' ); $this->assertEquals( true, $cdf_a->isActiveLengthOfService( $udf, strtotime( '30-Jan-2022' ) ) ); $this->assertEquals( true, $cdf_a->isActiveLengthOfService( $udf, strtotime( '31-Jan-2022' ) ) ); $this->assertEquals( false, $cdf_a->isActiveLengthOfService( $udf, strtotime( '01-Feb-2022' ) ) ); $this->assertEquals( false, $cdf_a->isActiveLengthOfService( $udf, strtotime( '02-Feb-2022' ) ) ); $this->assertEquals( false, $cdf_b->isActiveLengthOfService( $udf, strtotime( '30-Jan-2022' ) ) ); $this->assertEquals( false, $cdf_b->isActiveLengthOfService( $udf, strtotime( '31-Jan-2022' ) ) ); $this->assertEquals( true, $cdf_b->isActiveLengthOfService( $udf, strtotime( '01-Feb-2022' ) ) ); $this->assertEquals( true, $cdf_b->isActiveLengthOfService( $udf, strtotime( '02-Feb-2022' ) ) ); return true; } /** * @group PayStubCalculation_testCompanyDeductionLengthOfServiceBracketsF */ function testCompanyDeductionLengthOfServiceBracketsF() { $cdf_a = new CompanyDeductionFactory(); $cdf_a->setCompany( $this->company_id ); $cdf_a->setLegalEntity( $this->legal_entity_id ); $cdf_a->setStatus( 10 ); //Enabled $cdf_a->setType( 10 ); //Tax $cdf_a->setName( 'Vacation Accrual 0 -> 2.999' ); $cdf_a->setCalculation( 10 ); //Percent $cdf_a->setCalculationOrder( 100 ); $cdf_a->setPayStubEntryAccount( CompanyDeductionFactory::getPayStubEntryAccountByCompanyIDAndTypeAndFuzzyName( $this->company_id, 20, 'Vacation Accrual' ) ); $cdf_a->setMinimumLengthOfServiceUnit( 20 ); //20=Week $cdf_a->setMinimumLengthOfService( 0 ); $cdf_a->setMaximumLengthOfServiceUnit( 20 ); //20=Week $cdf_a->setMaximumLengthOfService( 156 ); $cdf_a->preSave(); //Calculates the setMinimumLengthOfServiceDays(), setMaximumLengthOfServiceDays() $cdf_b = new CompanyDeductionFactory(); $cdf_b->setCompany( $this->company_id ); $cdf_b->setLegalEntity( $this->legal_entity_id ); $cdf_b->setStatus( 10 ); //Enabled $cdf_b->setType( 10 ); //Tax $cdf_b->setName( 'Vacation Accrual 0 -> 3' ); $cdf_b->setCalculation( 10 ); //Percent $cdf_b->setCalculationOrder( 100 ); $cdf_b->setPayStubEntryAccount( CompanyDeductionFactory::getPayStubEntryAccountByCompanyIDAndTypeAndFuzzyName( $this->company_id, 20, 'Vacation Accrual' ) ); $cdf_b->setMinimumLengthOfServiceUnit( 20 ); $cdf_b->setMinimumLengthOfService( 156 ); $cdf_b->setMaximumLengthOfServiceUnit( 20 ); $cdf_b->setMaximumLengthOfService( 260 ); $cdf_b->preSave(); //Calculates the setMinimumLengthOfServiceDays(), setMaximumLengthOfServiceDays() $udf = new UserDeductionFactory(); $udf->setUser( $this->user_id ); $udf->setLengthOfServiceDate( strtotime( '01-Feb-2019' ) ); $udf->setStartDate( '' ); $udf->setEndDate( '' ); $this->assertEquals( true, $cdf_a->isActiveLengthOfService( $udf, strtotime( '26-Jan-2022' ) ) ); $this->assertEquals( true, $cdf_a->isActiveLengthOfService( $udf, strtotime( '27-Jan-2022' ) ) ); $this->assertEquals( false, $cdf_a->isActiveLengthOfService( $udf, strtotime( '28-Jan-2022' ) ) ); $this->assertEquals( false, $cdf_a->isActiveLengthOfService( $udf, strtotime( '29-Jan-2022' ) ) ); $this->assertEquals( false, $cdf_a->isActiveLengthOfService( $udf, strtotime( '30-Jan-2022' ) ) ); $this->assertEquals( false, $cdf_a->isActiveLengthOfService( $udf, strtotime( '31-Jan-2022' ) ) ); $this->assertEquals( false, $cdf_a->isActiveLengthOfService( $udf, strtotime( '01-Feb-2022' ) ) ); $this->assertEquals( false, $cdf_a->isActiveLengthOfService( $udf, strtotime( '02-Feb-2022' ) ) ); $this->assertEquals( false, $cdf_b->isActiveLengthOfService( $udf, strtotime( '26-Jan-2022' ) ) ); $this->assertEquals( false, $cdf_b->isActiveLengthOfService( $udf, strtotime( '27-Jan-2022' ) ) ); $this->assertEquals( true, $cdf_b->isActiveLengthOfService( $udf, strtotime( '28-Jan-2022' ) ) ); $this->assertEquals( true, $cdf_b->isActiveLengthOfService( $udf, strtotime( '29-Jan-2022' ) ) ); $this->assertEquals( true, $cdf_b->isActiveLengthOfService( $udf, strtotime( '30-Jan-2022' ) ) ); $this->assertEquals( true, $cdf_b->isActiveLengthOfService( $udf, strtotime( '31-Jan-2022' ) ) ); $this->assertEquals( true, $cdf_b->isActiveLengthOfService( $udf, strtotime( '01-Feb-2022' ) ) ); $this->assertEquals( true, $cdf_b->isActiveLengthOfService( $udf, strtotime( '02-Feb-2022' ) ) ); return true; } } ?>