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 ); Debug::text( 'Legal Entity ID: ' . $this->legal_entity_id, __FILE__, __LINE__, __METHOD__, 10 ); //This is only needed to log in with the UI. comment this line out for production //$dd->createPermissionGroups( $this->company_id, 40 ); //Administrator only. $currency_id = $dd->createCurrency( $this->company_id, 10 ); $dd->createUserWageGroups( $this->company_id ); $this->user_id = $dd->createUser( $this->company_id, $this->legal_entity_id, 100 ); Debug::text( 'User ID: ' . $this->user_id, __FILE__, __LINE__, __METHOD__, 10 ); $user_obj = $this->getUserObject( $this->user_id ); //Use a consistent hire date, otherwise its difficult to get things correct due to the hire date being in different parts or different pay periods. //Make sure it is not on a pay period start date though. $user_obj->setHireDate( strtotime( '05-Mar-2017' ) ); //Must not be in the future either, otherwise it could cause failures when the date passes into the past. $user_obj->Save( false ); $rsa_obj = TTnew( 'RemittanceSourceAccountFactory' ); /** @var RemittanceSourceAccountFactory $rsa_obj */ $rsa_obj->setName( 'Test source account' ); $rsa_obj->setLegalEntity( $this->legal_entity_id ); $rsa_obj->setCompany( $this->company_id ); $rsa_obj->setStatus( 10 ); $rsa_obj->setType( 2000 ); $rsa_obj->setCountry( 'US' ); $rsa_obj->setDataFormat( 10 ); $rsa_obj->setLastTransactionNumber( 111 ); $rsa_obj->setCurrency( $currency_id ); $rsa_id = $rsa_obj->Save(); $praf = TTnew( 'PayrollRemittanceAgencyFactory' ); /** @var PayrollRemittanceAgencyFactory $praf */ $praf->setName( 'Testing Agency' ); $praf->setLegalEntity( $this->legal_entity_id ); $praf->setStatus( 10 ); $praf->setType( 10 ); $praf->setCountry( 'CA' ); //$praf->setProvince( 'NY' ); $praf->setAgency( '10:CA:00:00:0010' ); $praf->setContactUser( $this->user_id ); $praf->setRemittanceSourceAccount( $rsa_id ); $praf->setPrimaryIdentification( '123456789RP0001' ); if ( $praf->isValid() ) { $this->agency_id = $praf->Save(); } else { $this->assertEquals( true, false, $praf->Validator->getTextErrors() ); } $this->assertEquals( true, TTUUID::isUUID( $this->user_id ), 'company_id is not a UUID' ); $this->assertEquals( true, TTUUID::isUUID( $this->company_id ), 'user_id is not a UUID' ); $this->assertEquals( true, TTUUID::isUUID( $this->agency_id ), 'agency_id is not a UUID' ); } public function tearDown(): void { Debug::text( 'Running tearDown(): ', __FILE__, __LINE__, __METHOD__, 10 ); } 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 - 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(); } //Link Account EI and CPP accounts $pseallf = new PayStubEntryAccountLinkListFactory(); $pseallf->getByCompanyId( $this->company_id ); if ( $pseallf->getRecordCount() > 0 ) { $pseal_obj = $pseallf->getCurrent(); $pseal_obj->setEmployeeEI( CompanyDeductionFactory::getPayStubEntryAccountByCompanyIDAndTypeAndFuzzyName( $this->company_id, 20, 'EI' ) ); $pseal_obj->setEmployeeCPP( CompanyDeductionFactory::getPayStubEntryAccountByCompanyIDAndTypeAndFuzzyName( $this->company_id, 20, 'CPP' ) ); $pseal_obj->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 addUserToPayPeriodSchedule( $pay_period_schedule_id, $user_id ) { $ppsuf = new PayPeriodScheduleUserFactory(); $ppsuf->setUser( $user_id ); $ppsuf->setPayPeriodSchedule( $pay_period_schedule_id ); if ( $ppsuf->isValid() ) { $ppsuf->save(); } } function createPayPeriods( $initial_date, $pay_period_schedule_id ) { $max_pay_periods = 35; $ppslf = new PayPeriodScheduleListFactory(); $ppslf->getById( $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 ) { if ( $initial_date !== false ) { $end_date = $initial_date; } else { $end_date = TTDate::getBeginWeekEpoch( TTDate::incrementDate( time(), -42, 'day' ) ); } } 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( $pay_period_schedule_id ) { $pplf = new PayPeriodListFactory(); //$pplf->getByCompanyId( $this->company_id ); $pplf->getByPayPeriodScheduleId( $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 getUserObject( $user_id ) { $ulf = TTNew( 'UserListFactory' ); /** @var UserListFactory $ulf */ $ulf->getById( $user_id ); if ( $ulf->getRecordCount() > 0 ) { return $ulf->getCurrent(); } return false; } /** * @group PayrollRemittanceAgencyEvent_testWeekly */ function testWeekly() { $praef = TTnew( 'PayrollRemittanceAgencyEventFactory' ); /** @var PayrollRemittanceAgencyEventFactory $praef */ $praef->setPayrollRemittanceAgencyId( $this->agency_id ); $praef->setDayOfWeek( 0 ); //Sunday $praef->setFrequency( 5100 ); //time edges of 01-Dec 2016 $result = $praef->calculateNextDate( strtotime( '28-Nov-2016 12:01AM' ) ); $this->assertEquals( date( 'r', $result['start_date'] ), date( 'r', strtotime( '27-Nov-2016 12:00AM' ) ) ); $this->assertEquals( date( 'r', $result['end_date'] ), date( 'r', strtotime( '03-Dec-2016 11:59:59PM' ) ) ); $this->assertEquals( date( 'r', $result['due_date'] ), date( 'r', strtotime( '04-Dec-2016 12:00PM' ) ) ); $result = $praef->calculateNextDate( strtotime( '29-Nov-2016 12:00AM' ) ); $this->assertEquals( date( 'r', $result['start_date'] ), date( 'r', strtotime( '27-Nov-2016 12:00AM' ) ) ); $this->assertEquals( date( 'r', $result['end_date'] ), date( 'r', strtotime( '03-Dec-2016 11:59:59PM' ) ) ); $this->assertEquals( date( 'r', $result['due_date'] ), date( 'r', strtotime( '04-Dec-2016 12:00PM' ) ) ); $result = $praef->calculateNextDate( strtotime( '30-Nov-2016 11:59PM' ) ); $this->assertEquals( date( 'r', $result['start_date'] ), date( 'r', strtotime( '04-Dec-2016 12:00AM' ) ) ); $this->assertEquals( date( 'r', $result['end_date'] ), date( 'r', strtotime( '10-Dec-2016 11:59:59PM' ) ) ); $this->assertEquals( date( 'r', $result['due_date'] ), date( 'r', strtotime( '11-Dec-2016 12:00PM' ) ) ); $result = $praef->calculateNextDate( strtotime( '01-Dec-2016 12:01AM' ) ); $this->assertEquals( date( 'r', $result['start_date'] ), date( 'r', strtotime( '04-Dec-2016 12:00AM' ) ) ); $this->assertEquals( date( 'r', $result['end_date'] ), date( 'r', strtotime( '10-Dec-2016 11:59:59PM' ) ) ); $this->assertEquals( date( 'r', $result['due_date'] ), date( 'r', strtotime( '11-Dec-2016 12:00PM' ) ) ); $result = $praef->calculateNextDate( strtotime( '02-Dec-2016 12:00AM' ) ); $this->assertEquals( date( 'r', $result['start_date'] ), date( 'r', strtotime( '04-Dec-2016 12:00AM' ) ) ); $this->assertEquals( date( 'r', $result['end_date'] ), date( 'r', strtotime( '10-Dec-2016 11:59:59PM' ) ) ); $this->assertEquals( date( 'r', $result['due_date'] ), date( 'r', strtotime( '11-Dec-2016 12:00PM' ) ) ); $result = $praef->calculateNextDate( strtotime( '03-Dec-2016 11:59PM' ) ); $this->assertEquals( date( 'r', $result['start_date'] ), date( 'r', strtotime( '04-Dec-2016 12:00AM' ) ) ); $this->assertEquals( date( 'r', $result['end_date'] ), date( 'r', strtotime( '10-Dec-2016 11:59:59PM' ) ) ); $this->assertEquals( date( 'r', $result['due_date'] ), date( 'r', strtotime( '11-Dec-2016 12:00PM' ) ) ); //time edges of 04-Dec 2016 $result = $praef->calculateNextDate( strtotime( '04-Dec-2016 11:59PM' ) ); $this->assertEquals( date( 'r', $result['start_date'] ), date( 'r', strtotime( '04-Dec-2016 12:00AM' ) ) ); $this->assertEquals( date( 'r', $result['end_date'] ), date( 'r', strtotime( '10-Dec-2016 11:59:59PM' ) ) ); $this->assertEquals( date( 'r', $result['due_date'] ), date( 'r', strtotime( '11-Dec-2016 12:00PM' ) ) ); $result = $praef->calculateNextDate( strtotime( '04-Dec-2016 12:00PM' ) ); $this->assertEquals( date( 'r', $result['start_date'] ), date( 'r', strtotime( '04-Dec-2016 12:00AM' ) ) ); $this->assertEquals( date( 'r', $result['end_date'] ), date( 'r', strtotime( '10-Dec-2016 11:59:59PM' ) ) ); $this->assertEquals( date( 'r', $result['due_date'] ), date( 'r', strtotime( '11-Dec-2016 12:00PM' ) ) ); $result = $praef->calculateNextDate( strtotime( '04-Dec-2016 12:00AM' ) ); $this->assertEquals( date( 'r', $result['start_date'] ), date( 'r', strtotime( '04-Dec-2016 12:00AM' ) ) ); $this->assertEquals( date( 'r', $result['end_date'] ), date( 'r', strtotime( '10-Dec-2016 11:59:59PM' ) ) ); $this->assertEquals( date( 'r', $result['due_date'] ), date( 'r', strtotime( '11-Dec-2016 12:00PM' ) ) ); //checking every day for a week (like cron) $result = $praef->calculateNextDate( strtotime( '25-Nov-2016 11:59PM' ) ); $this->assertEquals( date( 'r', $result['start_date'] ), date( 'r', strtotime( '27-Nov-2016 12:00AM' ) ) ); $this->assertEquals( date( 'r', $result['end_date'] ), date( 'r', strtotime( '03-Dec-2016 11:59:59PM' ) ) ); $this->assertEquals( date( 'r', $result['due_date'] ), date( 'r', strtotime( '04-Dec-2016 12:00PM' ) ) ); $result = $praef->calculateNextDate( strtotime( '26-Nov-2016 11:59PM' ) ); $this->assertEquals( date( 'r', $result['start_date'] ), date( 'r', strtotime( '27-Nov-2016 12:00AM' ) ) ); $this->assertEquals( date( 'r', $result['end_date'] ), date( 'r', strtotime( '03-Dec-2016 11:59:59PM' ) ) ); $this->assertEquals( date( 'r', $result['due_date'] ), date( 'r', strtotime( '04-Dec-2016 12:00PM' ) ) ); $result = $praef->calculateNextDate( strtotime( '27-Nov-2016 11:59PM' ) ); $this->assertEquals( date( 'r', $result['start_date'] ), date( 'r', strtotime( '27-Nov-2016 12:00AM' ) ) ); $this->assertEquals( date( 'r', $result['end_date'] ), date( 'r', strtotime( '03-Dec-2016 11:59:59PM' ) ) ); $this->assertEquals( date( 'r', $result['due_date'] ), date( 'r', strtotime( '04-Dec-2016 12:00PM' ) ) ); $result = $praef->calculateNextDate( strtotime( '28-Nov-2016 11:59PM' ) ); $this->assertEquals( date( 'r', $result['start_date'] ), date( 'r', strtotime( '27-Nov-2016 12:00AM' ) ) ); $this->assertEquals( date( 'r', $result['end_date'] ), date( 'r', strtotime( '03-Dec-2016 11:59:59PM' ) ) ); $this->assertEquals( date( 'r', $result['due_date'] ), date( 'r', strtotime( '04-Dec-2016 12:00PM' ) ) ); $result = $praef->calculateNextDate( strtotime( '29-Nov-2016 11:59PM' ) ); $this->assertEquals( date( 'r', $result['start_date'] ), date( 'r', strtotime( '27-Nov-2016 12:00AM' ) ) ); $this->assertEquals( date( 'r', $result['end_date'] ), date( 'r', strtotime( '03-Dec-2016 11:59:59PM' ) ) ); $this->assertEquals( date( 'r', $result['due_date'] ), date( 'r', strtotime( '04-Dec-2016 12:00PM' ) ) ); $result = $praef->calculateNextDate( strtotime( '30-Nov-2016 11:59PM' ) ); $this->assertEquals( date( 'r', $result['start_date'] ), date( 'r', strtotime( '04-Dec-2016 12:00AM' ) ) ); $this->assertEquals( date( 'r', $result['end_date'] ), date( 'r', strtotime( '10-Dec-2016 11:59:59PM' ) ) ); $this->assertEquals( date( 'r', $result['due_date'] ), date( 'r', strtotime( '11-Dec-2016 12:00PM' ) ) ); $result = $praef->calculateNextDate( strtotime( '31-Nov-2016 11:59PM' ) ); $this->assertEquals( date( 'r', $result['start_date'] ), date( 'r', strtotime( '04-Dec-2016 12:00AM' ) ) ); $this->assertEquals( date( 'r', $result['end_date'] ), date( 'r', strtotime( '10-Dec-2016 11:59:59PM' ) ) ); $this->assertEquals( date( 'r', $result['due_date'] ), date( 'r', strtotime( '11-Dec-2016 12:00PM' ) ) ); //forward day of week edge $result = $praef->calculateNextDate( strtotime( '05-Dec-2016 11:59PM' ) ); $this->assertEquals( date( 'r', $result['start_date'] ), date( 'r', strtotime( '04-Dec-2016 12:00AM' ) ) ); $this->assertEquals( date( 'r', $result['end_date'] ), date( 'r', strtotime( '10-Dec-2016 11:59:59PM' ) ) ); $this->assertEquals( date( 'r', $result['due_date'] ), date( 'r', strtotime( '11-Dec-2016 12:00PM' ) ) ); $result = $praef->calculateNextDate( strtotime( '06-Dec-2016 11:59PM' ) ); $this->assertEquals( date( 'r', $result['start_date'] ), date( 'r', strtotime( '04-Dec-2016 12:00AM' ) ) ); $this->assertEquals( date( 'r', $result['end_date'] ), date( 'r', strtotime( '10-Dec-2016 11:59:59PM' ) ) ); $this->assertEquals( date( 'r', $result['due_date'] ), date( 'r', strtotime( '11-Dec-2016 12:00PM' ) ) ); $result = $praef->calculateNextDate( strtotime( '07-Dec-2016 11:59PM' ) ); $this->assertEquals( date( 'r', $result['start_date'] ), date( 'r', strtotime( '11-Dec-2016 12:00AM' ) ) ); $this->assertEquals( date( 'r', $result['end_date'] ), date( 'r', strtotime( '17-Dec-2016 11:59:59PM' ) ) ); $this->assertEquals( date( 'r', $result['due_date'] ), date( 'r', strtotime( '18-Dec-2016 12:00PM' ) ) ); //2 weeks spanning a year edge (like cron) $result = $praef->calculateNextDate( strtotime( '19-Dec-2016 11:59PM' ) ); $this->assertEquals( date( 'r', $result['start_date'] ), date( 'r', strtotime( '18-Dec-2016 12:00AM' ) ) ); $this->assertEquals( date( 'r', $result['end_date'] ), date( 'r', strtotime( '24-Dec-2016 11:59:59PM' ) ) ); $this->assertEquals( date( 'r', $result['due_date'] ), date( 'r', strtotime( '25-Dec-2016 12:00PM' ) ) ); $result = $praef->calculateNextDate( strtotime( '25-Dec-2016 11:59PM' ) ); $this->assertEquals( date( 'r', $result['start_date'] ), date( 'r', strtotime( '25-Dec-2016 12:00AM' ) ) ); $this->assertEquals( date( 'r', $result['end_date'] ), date( 'r', strtotime( '31-Dec-2016 11:59:59PM' ) ) ); $this->assertEquals( date( 'r', $result['due_date'] ), date( 'r', strtotime( '01-Jan-2017 12:00PM' ) ) ); $result = $praef->calculateNextDate( strtotime( '26-Dec-2016 11:59PM' ) ); $this->assertEquals( date( 'r', $result['start_date'] ), date( 'r', strtotime( '25-Dec-2016 12:00AM' ) ) ); $this->assertEquals( date( 'r', $result['end_date'] ), date( 'r', strtotime( '31-Dec-2016 11:59:59PM' ) ) ); $this->assertEquals( date( 'r', $result['due_date'] ), date( 'r', strtotime( '01-Jan-2017 12:00PM' ) ) ); $result = $praef->calculateNextDate( strtotime( '27-Dec-2016 11:59PM' ) ); $this->assertEquals( date( 'r', $result['start_date'] ), date( 'r', strtotime( '25-Dec-2016 12:00AM' ) ) ); $this->assertEquals( date( 'r', $result['end_date'] ), date( 'r', strtotime( '31-Dec-2016 11:59:59PM' ) ) ); $this->assertEquals( date( 'r', $result['due_date'] ), date( 'r', strtotime( '01-Jan-2017 12:00PM' ) ) ); $result = $praef->calculateNextDate( strtotime( '28-Dec-2016 11:59PM' ) ); $this->assertEquals( date( 'r', $result['start_date'] ), date( 'r', strtotime( '01-Jan-2017 12:00AM' ) ) ); $this->assertEquals( date( 'r', $result['end_date'] ), date( 'r', strtotime( '07-Jan-2017 11:59:59PM' ) ) ); $this->assertEquals( date( 'r', $result['due_date'] ), date( 'r', strtotime( '08-Jan-2017 12:00PM' ) ) ); $result = $praef->calculateNextDate( strtotime( '29-Dec-2016 11:59PM' ) ); $this->assertEquals( date( 'r', $result['start_date'] ), date( 'r', strtotime( '01-Jan-2017 12:00AM' ) ) ); $this->assertEquals( date( 'r', $result['end_date'] ), date( 'r', strtotime( '07-Jan-2017 11:59:59PM' ) ) ); $this->assertEquals( date( 'r', $result['due_date'] ), date( 'r', strtotime( '08-Jan-2017 12:00PM' ) ) ); $result = $praef->calculateNextDate( strtotime( '30-Dec-2016 11:59PM' ) ); $this->assertEquals( date( 'r', $result['start_date'] ), date( 'r', strtotime( '01-Jan-2017 12:00AM' ) ) ); $this->assertEquals( date( 'r', $result['end_date'] ), date( 'r', strtotime( '07-Jan-2017 11:59:59PM' ) ) ); $this->assertEquals( date( 'r', $result['due_date'] ), date( 'r', strtotime( '08-Jan-2017 12:00PM' ) ) ); $result = $praef->calculateNextDate( strtotime( '31-Dec-2016 11:59PM' ) ); $this->assertEquals( date( 'r', $result['start_date'] ), date( 'r', strtotime( '01-Jan-2017 12:00AM' ) ) ); $this->assertEquals( date( 'r', $result['end_date'] ), date( 'r', strtotime( '07-Jan-2017 11:59:59PM' ) ) ); $this->assertEquals( date( 'r', $result['due_date'] ), date( 'r', strtotime( '08-Jan-2017 12:00PM' ) ) ); $result = $praef->calculateNextDate( strtotime( '01-Jan-2017 11:59PM' ) ); $this->assertEquals( date( 'r', $result['start_date'] ), date( 'r', strtotime( '01-Jan-2017 12:00AM' ) ) ); $this->assertEquals( date( 'r', $result['end_date'] ), date( 'r', strtotime( '07-Jan-2017 11:59:59PM' ) ) ); $this->assertEquals( date( 'r', $result['due_date'] ), date( 'r', strtotime( '08-Jan-2017 12:00PM' ) ) ); $result = $praef->calculateNextDate( strtotime( '02-Jan-2017 11:59PM' ) ); $this->assertEquals( date( 'r', $result['start_date'] ), date( 'r', strtotime( '01-Jan-2017 12:00AM' ) ) ); $this->assertEquals( date( 'r', $result['end_date'] ), date( 'r', strtotime( '07-Jan-2017 11:59:59PM' ) ) ); $this->assertEquals( date( 'r', $result['due_date'] ), date( 'r', strtotime( '08-Jan-2017 12:00PM' ) ) ); $result = $praef->calculateNextDate( strtotime( '03-Jan-2017 11:59PM' ) ); $this->assertEquals( date( 'r', $result['start_date'] ), date( 'r', strtotime( '01-Jan-2017 12:00AM' ) ) ); $this->assertEquals( date( 'r', $result['end_date'] ), date( 'r', strtotime( '07-Jan-2017 11:59:59PM' ) ) ); $this->assertEquals( date( 'r', $result['due_date'] ), date( 'r', strtotime( '08-Jan-2017 12:00PM' ) ) ); $result = $praef->calculateNextDate( strtotime( '04-Jan-2017 11:59PM' ) ); $this->assertEquals( date( 'r', $result['start_date'] ), date( 'r', strtotime( '08-Jan-2017 12:00AM' ) ) ); $this->assertEquals( date( 'r', $result['end_date'] ), date( 'r', strtotime( '14-Jan-2017 11:59:59PM' ) ) ); $this->assertEquals( date( 'r', $result['due_date'] ), date( 'r', strtotime( '15-Jan-2017 12:00PM' ) ) ); $result = $praef->calculateNextDate( strtotime( '05-Jan-2017 11:59PM' ) ); $this->assertEquals( date( 'r', $result['start_date'] ), date( 'r', strtotime( '08-Jan-2017 12:00AM' ) ) ); $this->assertEquals( date( 'r', $result['end_date'] ), date( 'r', strtotime( '14-Jan-2017 11:59:59PM' ) ) ); $this->assertEquals( date( 'r', $result['due_date'] ), date( 'r', strtotime( '15-Jan-2017 12:00PM' ) ) ); //daylight savings $result = $praef->calculateNextDate( strtotime( '12-Mar-2017 01:59AM' ) ); $this->assertEquals( date( 'r', $result['start_date'] ), date( 'r', strtotime( '12-Mar-2017 12:00AM' ) ) ); $this->assertEquals( date( 'r', $result['end_date'] ), date( 'r', strtotime( '18-Mar-2017 11:59:59PM' ) ) ); $this->assertEquals( date( 'r', $result['due_date'] ), date( 'r', strtotime( '19-Mar-2017 12:00PM' ) ) ); $result = $praef->calculateNextDate( strtotime( '12-Mar-2017 02:01AM' ) ); $this->assertEquals( date( 'r', $result['start_date'] ), date( 'r', strtotime( '12-Mar-2017 12:00AM' ) ) ); $this->assertEquals( date( 'r', $result['end_date'] ), date( 'r', strtotime( '18-Mar-2017 11:59:59PM' ) ) ); $this->assertEquals( date( 'r', $result['due_date'] ), date( 'r', strtotime( '19-Mar-2017 12:00PM' ) ) ); $result = $praef->calculateNextDate( strtotime( '12-Mar-2017 11:59AM' ) ); $this->assertEquals( date( 'r', $result['start_date'] ), date( 'r', strtotime( '12-Mar-2017 12:00AM' ) ) ); $this->assertEquals( date( 'r', $result['end_date'] ), date( 'r', strtotime( '18-Mar-2017 11:59:59PM' ) ) ); $this->assertEquals( date( 'r', $result['due_date'] ), date( 'r', strtotime( '19-Mar-2017 12:00PM' ) ) ); $result = $praef->calculateNextDate( strtotime( '05-Nov-2017 01:59AM' ) ); $this->assertEquals( date( 'r', $result['start_date'] ), date( 'r', strtotime( '05-Nov-2017 12:00AM' ) ) ); $this->assertEquals( date( 'r', $result['end_date'] ), date( 'r', strtotime( '11-Nov-2017 11:59:59PM' ) ) ); $this->assertEquals( date( 'r', $result['due_date'] ), date( 'r', strtotime( '12-Nov-2017 12:00PM' ) ) ); $result = $praef->calculateNextDate( strtotime( '05-Nov-2017 02:01AM' ) ); $this->assertEquals( date( 'r', $result['start_date'] ), date( 'r', strtotime( '05-Nov-2017 12:00AM' ) ) ); $this->assertEquals( date( 'r', $result['end_date'] ), date( 'r', strtotime( '11-Nov-2017 11:59:59PM' ) ) ); $this->assertEquals( date( 'r', $result['due_date'] ), date( 'r', strtotime( '12-Nov-2017 12:00PM' ) ) ); $result = $praef->calculateNextDate( strtotime( '05-Nov-2017 11:59PM' ) ); $this->assertEquals( date( 'r', $result['start_date'] ), date( 'r', strtotime( '05-Nov-2017 12:00AM' ) ) ); $this->assertEquals( date( 'r', $result['end_date'] ), date( 'r', strtotime( '11-Nov-2017 11:59:59PM' ) ) ); $this->assertEquals( date( 'r', $result['due_date'] ), date( 'r', strtotime( '12-Nov-2017 12:00PM' ) ) ); //chaining test (like wizard) $result = $praef->calculateNextDate( strtotime( '01-Jan-2017 11:59PM' ) ); $this->assertEquals( date( 'r', $result['start_date'] ), date( 'r', strtotime( '01-Jan-2017 12:00AM' ) ) ); $this->assertEquals( date( 'r', $result['end_date'] ), date( 'r', strtotime( '07-Jan-2017 11:59:59PM' ) ) ); $this->assertEquals( date( 'r', $result['due_date'] ), date( 'r', strtotime( '08-Jan-2017 12:00PM' ) ) ); $result = $praef->calculateNextDate( $result['due_date'] );//08-Jan-2017 12:00PM $this->assertEquals( date( 'r', $result['start_date'] ), date( 'r', strtotime( '08-Jan-2017 12:00AM' ) ) ); $this->assertEquals( date( 'r', $result['end_date'] ), date( 'r', strtotime( '14-Jan-2017 11:59:59PM' ) ) ); $this->assertEquals( date( 'r', $result['due_date'] ), date( 'r', strtotime( '15-Jan-2017 12:00PM' ) ) ); $result = $praef->calculateNextDate( $result['due_date'] );//15-Jan-2017 12:00PM $this->assertEquals( date( 'r', $result['start_date'] ), date( 'r', strtotime( '15-Jan-2017 12:00AM' ) ) ); $this->assertEquals( date( 'r', $result['end_date'] ), date( 'r', strtotime( '21-Jan-2017 11:59:59PM' ) ) ); $this->assertEquals( date( 'r', $result['due_date'] ), date( 'r', strtotime( '22-Jan-2017 12:00PM' ) ) ); $result = $praef->calculateNextDate( $result['due_date'] );//22-Jan-2017 12:00PM $this->assertEquals( date( 'r', $result['start_date'] ), date( 'r', strtotime( '22-Jan-2017 12:00AM' ) ) ); $this->assertEquals( date( 'r', $result['end_date'] ), date( 'r', strtotime( '28-Jan-2017 11:59:59PM' ) ) ); $this->assertEquals( date( 'r', $result['due_date'] ), date( 'r', strtotime( '29-Jan-2017 12:00PM' ) ) ); $result = $praef->calculateNextDate( $result['due_date'] );//29-Jan-2017 12:00PM $this->assertEquals( date( 'r', $result['start_date'] ), date( 'r', strtotime( '29-Jan-2017 12:00AM' ) ) ); $this->assertEquals( date( 'r', $result['end_date'] ), date( 'r', strtotime( '04-Feb-2017 11:59:59PM' ) ) ); $this->assertEquals( date( 'r', $result['due_date'] ), date( 'r', strtotime( '05-Feb-2017 12:00PM' ) ) ); $result = $praef->calculateNextDate( strtotime( '28-Jan-2017 11:59PM' ) ); $this->assertEquals( date( 'r', $result['start_date'] ), date( 'r', strtotime( '29-Jan-2017 12:00AM' ) ) ); $this->assertEquals( date( 'r', $result['end_date'] ), date( 'r', strtotime( '04-Feb-2017 11:59:59PM' ) ) ); $this->assertEquals( date( 'r', $result['due_date'] ), date( 'r', strtotime( '05-Feb-2017 12:00PM' ) ) ); } /** * @group PayrollRemittanceAgencyEvent_testMonthly */ function testMonthly() { $praef = TTnew( 'PayrollRemittanceAgencyEventFactory' ); /** @var PayrollRemittanceAgencyEventFactory $praef */ $praef->setPayrollRemittanceAgencyId( $this->agency_id ); $praef->setFrequency( 4100 ); $praef->setPrimaryDayOfMonth( 10 ); $praef->setEffectiveDate( strtotime( '01-Nov-2016' ) ); //Testing minutes edge $result = $praef->calculateNextDate( strtotime( '20-Oct-2016 01:00PM' ) ); //Skips to effective date and goes from there no matter what. $this->assertEquals( date( 'r', $result['start_date'] ), date( 'r', strtotime( '01-Nov-2016 12:00AM' ) ) ); $this->assertEquals( date( 'r', $result['end_date'] ), date( 'r', strtotime( '30-Nov-2016 11:59:59PM' ) ) ); $this->assertEquals( date( 'r', $result['due_date'] ), date( 'r', strtotime( '10-Dec-2016 12:00PM' ) ) ); $result = $praef->calculateNextDate( strtotime( '23-Nov-2016 01:00PM' ) ); $this->assertEquals( date( 'r', $result['start_date'] ), date( 'r', strtotime( '01-Nov-2016 12:00AM' ) ) ); $this->assertEquals( date( 'r', $result['end_date'] ), date( 'r', strtotime( '30-Nov-2016 11:59:59PM' ) ) ); $this->assertEquals( date( 'r', $result['due_date'] ), date( 'r', strtotime( '10-Dec-2016 12:00PM' ) ) ); $result = $praef->calculateNextDate( strtotime( '25-Nov-2016 01:00PM' ) ); $this->assertEquals( date( 'r', $result['start_date'] ), date( 'r', strtotime( '01-Dec-2016 12:00AM' ) ) ); $this->assertEquals( date( 'r', $result['end_date'] ), date( 'r', strtotime( '31-Dec-2016 11:59:59PM' ) ) ); $this->assertEquals( date( 'r', $result['due_date'] ), date( 'r', strtotime( '10-Jan-2017 12:00PM' ) ) ); $result = $praef->calculateNextDate( strtotime( '01-Dec-2016 01:00PM' ) ); $this->assertEquals( date( 'r', $result['start_date'] ), date( 'r', strtotime( '01-Dec-2016 12:00AM' ) ) ); $this->assertEquals( date( 'r', $result['end_date'] ), date( 'r', strtotime( '31-Dec-2016 11:59:59PM' ) ) ); $this->assertEquals( date( 'r', $result['due_date'] ), date( 'r', strtotime( '10-Jan-2017 12:00PM' ) ) ); $result = $praef->calculateNextDate( strtotime( '02-Dec-2016 01:00PM' ) ); $this->assertEquals( date( 'r', $result['start_date'] ), date( 'r', strtotime( '01-Dec-2016 12:00AM' ) ) ); $this->assertEquals( date( 'r', $result['end_date'] ), date( 'r', strtotime( '31-Dec-2016 11:59:59PM' ) ) ); $this->assertEquals( date( 'r', $result['due_date'] ), date( 'r', strtotime( '10-Jan-2017 12:00PM' ) ) ); $result = $praef->calculateNextDate( strtotime( '08-Dec-2016 01:00PM' ) ); $this->assertEquals( date( 'r', $result['start_date'] ), date( 'r', strtotime( '01-Dec-2016 12:00AM' ) ) ); $this->assertEquals( date( 'r', $result['end_date'] ), date( 'r', strtotime( '31-Dec-2016 11:59:59PM' ) ) ); $this->assertEquals( date( 'r', $result['due_date'] ), date( 'r', strtotime( '10-Jan-2017 12:00PM' ) ) ); $result = $praef->calculateNextDate( strtotime( '09-Dec-2016 01:00PM' ) ); $this->assertEquals( date( 'r', $result['start_date'] ), date( 'r', strtotime( '01-Dec-2016 12:00AM' ) ) ); $this->assertEquals( date( 'r', $result['end_date'] ), date( 'r', strtotime( '31-Dec-2016 11:59:59PM' ) ) ); $this->assertEquals( date( 'r', $result['due_date'] ), date( 'r', strtotime( '10-Jan-2017 12:00PM' ) ) ); $result = $praef->calculateNextDate( strtotime( '10-Dec-2016 01:00PM' ) ); $this->assertEquals( date( 'r', $result['start_date'] ), date( 'r', strtotime( '01-Dec-2016 12:00AM' ) ) ); $this->assertEquals( date( 'r', $result['end_date'] ), date( 'r', strtotime( '31-Dec-2016 11:59:59PM' ) ) ); $this->assertEquals( date( 'r', $result['due_date'] ), date( 'r', strtotime( '10-Jan-2017 12:00PM' ) ) ); $result = $praef->calculateNextDate( strtotime( '11-Dec-2016 01:00PM' ) ); $this->assertEquals( date( 'r', $result['start_date'] ), date( 'r', strtotime( '01-Dec-2016 12:00AM' ) ) ); $this->assertEquals( date( 'r', $result['end_date'] ), date( 'r', strtotime( '31-Dec-2016 11:59:59PM' ) ) ); $this->assertEquals( date( 'r', $result['due_date'] ), date( 'r', strtotime( '10-Jan-2017 12:00PM' ) ) ); $result = $praef->calculateNextDate( strtotime( '11-Dec-2016 11:59PM' ) ); $this->assertEquals( date( 'r', $result['start_date'] ), date( 'r', strtotime( '01-Dec-2016 12:00AM' ) ) ); $this->assertEquals( date( 'r', $result['end_date'] ), date( 'r', strtotime( '31-Dec-2016 11:59:59PM' ) ) ); $this->assertEquals( date( 'r', $result['due_date'] ), date( 'r', strtotime( '10-Jan-2017 12:00PM' ) ) ); $result = $praef->calculateNextDate( strtotime( '12-Dec-2016 12:00AM' ) ); $this->assertEquals( date( 'r', $result['start_date'] ), date( 'r', strtotime( '01-Dec-2016 12:00AM' ) ) ); $this->assertEquals( date( 'r', $result['end_date'] ), date( 'r', strtotime( '31-Dec-2016 11:59:59PM' ) ) ); $this->assertEquals( date( 'r', $result['due_date'] ), date( 'r', strtotime( '10-Jan-2017 12:00PM' ) ) ); $result = $praef->calculateNextDate( strtotime( '12-Dec-2016 01:00PM' ) ); $this->assertEquals( date( 'r', $result['start_date'] ), date( 'r', strtotime( '01-Dec-2016 12:00AM' ) ) ); $this->assertEquals( date( 'r', $result['end_date'] ), date( 'r', strtotime( '31-Dec-2016 11:59:59PM' ) ) ); $this->assertEquals( date( 'r', $result['due_date'] ), date( 'r', strtotime( '10-Jan-2017 12:00PM' ) ) ); $result = $praef->calculateNextDate( strtotime( '13-Dec-2016 01:00PM' ) ); $this->assertEquals( date( 'r', $result['start_date'] ), date( 'r', strtotime( '01-Dec-2016 12:00AM' ) ) ); $this->assertEquals( date( 'r', $result['end_date'] ), date( 'r', strtotime( '31-Dec-2016 11:59:59PM' ) ) ); $this->assertEquals( date( 'r', $result['due_date'] ), date( 'r', strtotime( '10-Jan-2017 12:00PM' ) ) ); //Check that last day of the month is always in the next month. $praef->setPrimaryDayOfMonth( 31 ); $praef->setEffectiveDate( strtotime( '30-Dec-2019' ) ); $result = $praef->calculateNextDate( strtotime( '31-Dec-2019 12:00PM' ) ); $this->assertEquals( date( 'r', $result['start_date'] ), date( 'r', strtotime( '01-Dec-2019 12:00AM' ) ) ); $this->assertEquals( date( 'r', $result['end_date'] ), date( 'r', strtotime( '31-Dec-2019 11:59:59PM' ) ) ); $this->assertEquals( date( 'r', $result['due_date'] ), date( 'r', strtotime( '31-Jan-2020 12:00PM' ) ) ); //Next Weekday $result = $praef->calculateNextDate( strtotime( '31-Jan-2020 12:00PM' ) ); $this->assertEquals( date( 'r', $result['start_date'] ), date( 'r', strtotime( '01-Jan-2020 12:00AM' ) ) ); $this->assertEquals( date( 'r', $result['end_date'] ), date( 'r', strtotime( '31-Jan-2020 11:59:59PM' ) ) ); $this->assertEquals( date( 'r', $result['due_date'] ), date( 'r', strtotime( '29-Feb-2020 12:00PM' ) ) ); $result = $praef->calculateNextDate( strtotime( '29-Feb-2020 12:00PM' ) ); $this->assertEquals( date( 'r', $result['start_date'] ), date( 'r', strtotime( '01-Feb-2020 12:00AM' ) ) ); $this->assertEquals( date( 'r', $result['end_date'] ), date( 'r', strtotime( '29-Feb-2020 11:59:59PM' ) ) ); $this->assertEquals( date( 'r', $result['due_date'] ), date( 'r', strtotime( '31-Mar-2020 12:00PM' ) ) ); $praef->setPrimaryDayOfMonth( 31 ); $praef->setEffectiveDate( strtotime( '01-Jan-2020' ) ); $result = $praef->calculateNextDate( strtotime( '30-Nov-2020 12:00PM' ) ); $this->assertEquals( date( 'r', $result['start_date'] ), date( 'r', strtotime( '01-Nov-2020 12:00AM' ) ) ); $this->assertEquals( date( 'r', $result['end_date'] ), date( 'r', strtotime( '30-Nov-2020 11:59:59PM' ) ) ); $this->assertEquals( date( 'r', $result['due_date'] ), date( 'r', strtotime( '31-Dec-2020 12:00PM' ) ) ); $result = $praef->calculateNextDate( strtotime( '31-Dec-2020 12:00PM' ) ); $this->assertEquals( date( 'r', $result['start_date'] ), date( 'r', strtotime( '01-Dec-2020 12:00AM' ) ) ); $this->assertEquals( date( 'r', $result['end_date'] ), date( 'r', strtotime( '31-Dec-2020 11:59:59PM' ) ) ); $this->assertEquals( date( 'r', $result['due_date'] ), date( 'r', strtotime( '31-Jan-2021 12:00PM' ) ) ); $result = $praef->calculateNextDate( strtotime( '31-Jan-2021 12:00PM' ) ); $this->assertEquals( date( 'r', $result['start_date'] ), date( 'r', strtotime( '01-Jan-2021 12:00AM' ) ) ); $this->assertEquals( date( 'r', $result['end_date'] ), date( 'r', strtotime( '31-Jan-2021 11:59:59PM' ) ) ); $this->assertEquals( date( 'r', $result['due_date'] ), date( 'r', strtotime( '28-Feb-2021 12:00PM' ) ) ); $result = $praef->calculateNextDate( strtotime( '28-Feb-2021 12:00PM' ) ); $this->assertEquals( date( 'r', $result['start_date'] ), date( 'r', strtotime( '01-Feb-2021 12:00AM' ) ) ); $this->assertEquals( date( 'r', $result['end_date'] ), date( 'r', strtotime( '28-Feb-2021 11:59:59PM' ) ) ); $this->assertEquals( date( 'r', $result['due_date'] ), date( 'r', strtotime( '31-Mar-2021 12:00PM' ) ) ); $result = $praef->calculateNextDate( strtotime( '31-Mar-2021 12:00PM' ) ); $this->assertEquals( date( 'r', $result['start_date'] ), date( 'r', strtotime( '01-Mar-2021 12:00AM' ) ) ); $this->assertEquals( date( 'r', $result['end_date'] ), date( 'r', strtotime( '31-Mar-2021 11:59:59PM' ) ) ); $this->assertEquals( date( 'r', $result['due_date'] ), date( 'r', strtotime( '30-Apr-2021 12:00PM' ) ) ); $praef->setPrimaryDayOfMonth( '-1' ); //Should be the same as using 31 days. $praef->setEffectiveDate( strtotime( '01-Jan-2020' ) ); $result = $praef->calculateNextDate( strtotime( '08-Dec-2019 12:00PM' ) ); $this->assertEquals( date( 'r', $result['start_date'] ), date( 'r', strtotime( '01-Dec-2019 12:00AM' ) ) ); $this->assertEquals( date( 'r', $result['end_date'] ), date( 'r', strtotime( '31-Dec-2019 11:59:59PM' ) ) ); $this->assertEquals( date( 'r', $result['due_date'] ), date( 'r', strtotime( '31-Jan-2020 12:00PM' ) ) ); $result = $praef->calculateNextDate( strtotime( '31-Jan-2020 12:00PM' ) ); $this->assertEquals( date( 'r', $result['start_date'] ), date( 'r', strtotime( '01-Jan-2020 12:00AM' ) ) ); $this->assertEquals( date( 'r', $result['end_date'] ), date( 'r', strtotime( '31-Jan-2020 11:59:59PM' ) ) ); $this->assertEquals( date( 'r', $result['due_date'] ), date( 'r', strtotime( '29-Feb-2020 12:00PM' ) ) ); $result = $praef->calculateNextDate( strtotime( '01-Feb-2020 12:00PM' ) ); $this->assertEquals( date( 'r', $result['start_date'] ), date( 'r', strtotime( '01-Jan-2020 12:00AM' ) ) ); $this->assertEquals( date( 'r', $result['end_date'] ), date( 'r', strtotime( '31-Jan-2020 11:59:59PM' ) ) ); $this->assertEquals( date( 'r', $result['due_date'] ), date( 'r', strtotime( '29-Feb-2020 12:00PM' ) ) ); $result = $praef->calculateNextDate( strtotime( '31-Jan-2020 12:00PM' ) ); $this->assertEquals( date( 'r', $result['start_date'] ), date( 'r', strtotime( '01-Jan-2020 12:00AM' ) ) ); $this->assertEquals( date( 'r', $result['end_date'] ), date( 'r', strtotime( '31-Jan-2020 11:59:59PM' ) ) ); $this->assertEquals( date( 'r', $result['due_date'] ), date( 'r', strtotime( '29-Feb-2020 12:00PM' ) ) ); //Check that leap years don't overflow. $praef->setPrimaryDayOfMonth( 31 ); $praef->setEffectiveDate( strtotime( '01-Jan-2016' ) ); $result = $praef->calculateNextDate( strtotime( '01-Jan-2016 12:00PM' ) ); $this->assertEquals( date( 'r', $result['start_date'] ), date( 'r', strtotime( '01-Dec-2015 12:00AM' ) ) ); $this->assertEquals( date( 'r', $result['end_date'] ), date( 'r', strtotime( '31-Dec-2015 11:59:59PM' ) ) ); $this->assertEquals( date( 'r', $result['due_date'] ), date( 'r', strtotime( '31-Jan-2016 12:00PM' ) ) ); $result = $praef->calculateNextDate( strtotime( '01-Feb-2016 12:00PM' ) ); $this->assertEquals( date( 'r', $result['start_date'] ), date( 'r', strtotime( '01-Jan-2016 12:00AM' ) ) ); $this->assertEquals( date( 'r', $result['end_date'] ), date( 'r', strtotime( '31-Jan-2016 11:59:59PM' ) ) ); $this->assertEquals( date( 'r', $result['due_date'] ), date( 'r', strtotime( '29-Feb-2016 12:00PM' ) ) ); $result = $praef->calculateNextDate( strtotime( '31-Jan-2016 12:00PM' ) ); $this->assertEquals( date( 'r', $result['start_date'] ), date( 'r', strtotime( '01-Jan-2016 12:00AM' ) ) ); $this->assertEquals( date( 'r', $result['end_date'] ), date( 'r', strtotime( '31-Jan-2016 11:59:59PM' ) ) ); $this->assertEquals( date( 'r', $result['due_date'] ), date( 'r', strtotime( '29-Feb-2016 12:00PM' ) ) ); //Chained test (like wizard) $praef->setPrimaryDayOfMonth( 10 ); $praef->setEffectiveDate( strtotime( '01-Dec-2016' ) ); $result = $praef->calculateNextDate( strtotime( '20-Dec-2016 01:00PM' ) ); $this->assertEquals( date( 'r', $result['start_date'] ), date( 'r', strtotime( '01-Dec-2016 12:00AM' ) ) ); $this->assertEquals( date( 'r', $result['end_date'] ), date( 'r', strtotime( '31-Dec-2016 11:59:59PM' ) ) ); $this->assertEquals( date( 'r', $result['due_date'] ), date( 'r', strtotime( '10-Jan-2017 12:00PM' ) ) ); $result = $praef->calculateNextDate( $result['due_date'] );//10-Jan-2017 12:00PM $this->assertEquals( date( 'r', $result['start_date'] ), date( 'r', strtotime( '01-Jan-2017 12:00AM' ) ) ); $this->assertEquals( date( 'r', $result['end_date'] ), date( 'r', strtotime( '31-Jan-2017 11:59:59PM' ) ) ); $this->assertEquals( date( 'r', $result['due_date'] ), date( 'r', strtotime( '10-Feb-2017 12:00PM' ) ) ); $result = $praef->calculateNextDate( $result['due_date'] );//10-Feb-2017 12:00PM $this->assertEquals( date( 'r', $result['start_date'] ), date( 'r', strtotime( '01-Feb-2017 12:00AM' ) ) ); $this->assertEquals( date( 'r', $result['end_date'] ), date( 'r', strtotime( '28-Feb-2017 11:59:59PM' ) ) ); $this->assertEquals( date( 'r', $result['due_date'] ), date( 'r', strtotime( '10-Mar-2017 12:00PM' ) ) ); $result = $praef->calculateNextDate( $result['due_date'] );//10-Mar-2017 12:00PM $this->assertEquals( date( 'r', $result['start_date'] ), date( 'r', strtotime( '01-Mar-2017 12:00AM' ) ) ); $this->assertEquals( date( 'r', $result['end_date'] ), date( 'r', strtotime( '31-Mar-2017 11:59:59PM' ) ) ); $this->assertEquals( date( 'r', $result['due_date'] ), date( 'r', strtotime( '10-Apr-2017 12:00PM' ) ) ); $praef->setPrimaryDayOfMonth( 13 ); $seed_date = TTDate::getMiddleDayEpoch( strtotime( '13-Dec-' . ( date( 'Y' ) - 1 ) . ' 12:00PM' ) ); //Run current whole year for ( $x = 0; $x <= 365; $x++ ) { Debug::Text( 'testLoopMonthly '.$x.' seed_date: '. TTDate::getDate('DATE+TIME', $seed_date), __FILE__, __LINE__, __METHOD__, 10); $due_date = TTDate::getDateOfNextDayOfMonth( ( $seed_date + 86400 ), false, $praef->getPrimaryDayOfMonth() ); $month_before_due_date = TTDate::incrementDate( $due_date, -1, 'month' ); $start_date = TTDate::getBeginDayEpoch( TTDate::getBeginMonthEpoch( $month_before_due_date ) ); $end_date = TTDate::getEndDayEpoch( TTDate::getEndMonthEpoch( $month_before_due_date ) ); $due_date = TTDate::getMiddleDayEpoch( $due_date ); Debug::Text("compare start_date: ".date('r', $start_date), __FILE__, __LINE__, __METHOD__, 10); Debug::Text("compare end_date: ".date('r', $end_date), __FILE__, __LINE__, __METHOD__, 10); Debug::Text("compare due_date: ".date('r', $due_date), __FILE__, __LINE__, __METHOD__, 10); $result = $praef->calculateNextDate( $seed_date ); $this->assertEquals( date( 'r', $result['start_date'] ), date( 'r', $start_date ) ); $this->assertEquals( date( 'r', $result['end_date'] ), date( 'r', $end_date ) ); $this->assertEquals( date( 'r', $result['due_date'] ), date( 'r', $due_date ) ); $seed_date = $result['due_date']; } //Special case where 15-May-2021 falls on a Sat, gets back dated to 14-May, then keeps moving forward from there. $praef->getPayrollRemittanceAgencyObject()->setAlwaysOnWeekDay( 1 ); //Previous Business Day $praef->setPrimaryDayOfMonth( 15 ); $praef->setEffectiveDate( strtotime( '01-Feb-2021' ) ); $result = $praef->calculateNextDate( strtotime( '20-Feb-2021 01:00PM' ) ); $this->assertEquals( date( 'r', $result['start_date'] ), date( 'r', strtotime( '01-Feb-2021 12:00AM' ) ) ); $this->assertEquals( date( 'r', $result['end_date'] ), date( 'r', strtotime( '28-Feb-2021 11:59:59PM' ) ) ); $this->assertEquals( date( 'r', $result['due_date'] ), date( 'r', strtotime( '15-Mar-2021 12:00PM' ) ) ); $result = $praef->calculateNextDate( $result['due_date'] );//15-Mar-2021 12:00PM $this->assertEquals( date( 'r', $result['start_date'] ), date( 'r', strtotime( '01-Mar-2021 12:00AM' ) ) ); $this->assertEquals( date( 'r', $result['end_date'] ), date( 'r', strtotime( '31-Mar-2021 11:59:59PM' ) ) ); $this->assertEquals( date( 'r', $result['due_date'] ), date( 'r', strtotime( '15-Apr-2021 12:00PM' ) ) ); $result = $praef->calculateNextDate( $result['due_date'] );//15-Apr-2021 12:00PM $this->assertEquals( date( 'r', $result['start_date'] ), date( 'r', strtotime( '01-Apr-2021 12:00AM' ) ) ); $this->assertEquals( date( 'r', $result['end_date'] ), date( 'r', strtotime( '30-Apr-2021 11:59:59PM' ) ) ); $this->assertEquals( date( 'r', $result['due_date'] ), date( 'r', strtotime( '14-May-2021 12:00PM' ) ) ); //15th is a Sat, move back to Fri. $result = $praef->calculateNextDate( $result['due_date'] );//14-May-2021 12:00PM $this->assertEquals( date( 'r', $result['start_date'] ), date( 'r', strtotime( '01-May-2021 12:00AM' ) ) ); $this->assertEquals( date( 'r', $result['end_date'] ), date( 'r', strtotime( '31-May-2021 11:59:59PM' ) ) ); $this->assertEquals( date( 'r', $result['due_date'] ), date( 'r', strtotime( '15-Jun-2021 12:00PM' ) ) ); $result = $praef->calculateNextDate( $result['due_date'] );//15-Jun-2021 12:00PM $this->assertEquals( date( 'r', $result['start_date'] ), date( 'r', strtotime( '01-Jun-2021 12:00AM' ) ) ); $this->assertEquals( date( 'r', $result['end_date'] ), date( 'r', strtotime( '30-Jun-2021 11:59:59PM' ) ) ); $this->assertEquals( date( 'r', $result['due_date'] ), date( 'r', strtotime( '15-Jul-2021 12:00PM' ) ) ); //Test several days before the due date on the 15th. $result = $praef->calculateNextDate( strtotime( '14-Jun-2021 12:00PM' ) ); $this->assertEquals( date( 'r', $result['start_date'] ), date( 'r', strtotime( '01-Jun-2021 12:00AM' ) ) ); $this->assertEquals( date( 'r', $result['end_date'] ), date( 'r', strtotime( '30-Jun-2021 11:59:59PM' ) ) ); $this->assertEquals( date( 'r', $result['due_date'] ), date( 'r', strtotime( '15-Jul-2021 12:00PM' ) ) ); $result = $praef->calculateNextDate( strtotime( '13-Jun-2021 12:00PM' ) ); $this->assertEquals( date( 'r', $result['start_date'] ), date( 'r', strtotime( '01-Jun-2021 12:00AM' ) ) ); $this->assertEquals( date( 'r', $result['end_date'] ), date( 'r', strtotime( '30-Jun-2021 11:59:59PM' ) ) ); $this->assertEquals( date( 'r', $result['due_date'] ), date( 'r', strtotime( '15-Jul-2021 12:00PM' ) ) ); $result = $praef->calculateNextDate( strtotime( '12-Jun-2021 12:00PM' ) ); $this->assertEquals( date( 'r', $result['start_date'] ), date( 'r', strtotime( '01-Jun-2021 12:00AM' ) ) ); $this->assertEquals( date( 'r', $result['end_date'] ), date( 'r', strtotime( '30-Jun-2021 11:59:59PM' ) ) ); $this->assertEquals( date( 'r', $result['due_date'] ), date( 'r', strtotime( '15-Jul-2021 12:00PM' ) ) ); $result = $praef->calculateNextDate( strtotime( '11-Jun-2021 12:00PM' ) ); $this->assertEquals( date( 'r', $result['start_date'] ), date( 'r', strtotime( '01-Jun-2021 12:00AM' ) ) ); $this->assertEquals( date( 'r', $result['end_date'] ), date( 'r', strtotime( '30-Jun-2021 11:59:59PM' ) ) ); $this->assertEquals( date( 'r', $result['due_date'] ), date( 'r', strtotime( '15-Jul-2021 12:00PM' ) ) ); $result = $praef->calculateNextDate( strtotime( '10-Jun-2021 12:00PM' ) ); $this->assertEquals( date( 'r', $result['start_date'] ), date( 'r', strtotime( '01-Jun-2021 12:00AM' ) ) ); $this->assertEquals( date( 'r', $result['end_date'] ), date( 'r', strtotime( '30-Jun-2021 11:59:59PM' ) ) ); $this->assertEquals( date( 'r', $result['due_date'] ), date( 'r', strtotime( '15-Jul-2021 12:00PM' ) ) ); $result = $praef->calculateNextDate( strtotime( '09-Jun-2021 12:00PM' ) ); $this->assertEquals( date( 'r', $result['start_date'] ), date( 'r', strtotime( '01-Jun-2021 12:00AM' ) ) ); $this->assertEquals( date( 'r', $result['end_date'] ), date( 'r', strtotime( '30-Jun-2021 11:59:59PM' ) ) ); $this->assertEquals( date( 'r', $result['due_date'] ), date( 'r', strtotime( '15-Jul-2021 12:00PM' ) ) ); //Test several days after the due date on the 15th. $result = $praef->calculateNextDate( strtotime( '15-Jun-2021 12:00PM' ) ); $this->assertEquals( date( 'r', $result['start_date'] ), date( 'r', strtotime( '01-Jun-2021 12:00AM' ) ) ); $this->assertEquals( date( 'r', $result['end_date'] ), date( 'r', strtotime( '30-Jun-2021 11:59:59PM' ) ) ); $this->assertEquals( date( 'r', $result['due_date'] ), date( 'r', strtotime( '15-Jul-2021 12:00PM' ) ) ); $result = $praef->calculateNextDate( strtotime( '16-Jun-2021 12:00PM' ) ); $this->assertEquals( date( 'r', $result['start_date'] ), date( 'r', strtotime( '01-Jun-2021 12:00AM' ) ) ); $this->assertEquals( date( 'r', $result['end_date'] ), date( 'r', strtotime( '30-Jun-2021 11:59:59PM' ) ) ); $this->assertEquals( date( 'r', $result['due_date'] ), date( 'r', strtotime( '15-Jul-2021 12:00PM' ) ) ); $result = $praef->calculateNextDate( strtotime( '17-Jun-2021 12:00PM' ) ); $this->assertEquals( date( 'r', $result['start_date'] ), date( 'r', strtotime( '01-Jun-2021 12:00AM' ) ) ); $this->assertEquals( date( 'r', $result['end_date'] ), date( 'r', strtotime( '30-Jun-2021 11:59:59PM' ) ) ); $this->assertEquals( date( 'r', $result['due_date'] ), date( 'r', strtotime( '15-Jul-2021 12:00PM' ) ) ); $result = $praef->calculateNextDate( strtotime( '18-Jun-2021 12:00PM' ) ); $this->assertEquals( date( 'r', $result['start_date'] ), date( 'r', strtotime( '01-Jun-2021 12:00AM' ) ) ); $this->assertEquals( date( 'r', $result['end_date'] ), date( 'r', strtotime( '30-Jun-2021 11:59:59PM' ) ) ); $this->assertEquals( date( 'r', $result['due_date'] ), date( 'r', strtotime( '15-Jul-2021 12:00PM' ) ) ); $result = $praef->calculateNextDate( strtotime( '19-Jun-2021 12:00PM' ) ); $this->assertEquals( date( 'r', $result['start_date'] ), date( 'r', strtotime( '01-Jun-2021 12:00AM' ) ) ); $this->assertEquals( date( 'r', $result['end_date'] ), date( 'r', strtotime( '30-Jun-2021 11:59:59PM' ) ) ); $this->assertEquals( date( 'r', $result['due_date'] ), date( 'r', strtotime( '15-Jul-2021 12:00PM' ) ) ); $result = $praef->calculateNextDate( strtotime( '20-Jun-2021 12:00PM' ) ); $this->assertEquals( date( 'r', $result['start_date'] ), date( 'r', strtotime( '01-Jun-2021 12:00AM' ) ) ); $this->assertEquals( date( 'r', $result['end_date'] ), date( 'r', strtotime( '30-Jun-2021 11:59:59PM' ) ) ); $this->assertEquals( date( 'r', $result['due_date'] ), date( 'r', strtotime( '15-Jul-2021 12:00PM' ) ) ); } //biweekly frequency is commented out in the factory. // function testBiWeekly() { // $praef = TTnew('PayrollRemittanceAgencyEventFactory'); // $praef->setFrequency( 5000 ); // $praef->setDayOfWeek(1); // $praef->setEffectiveDate(strtotime('01-Dec-2015')); // // //time edge // $result = $praef->calculateNextDate( strtotime('01-Dec-2016') ); // $this->assertEquals( date('r', $result['start_date']), date('r', strtotime('27-nov-2016 12:00PM')) ); // $this->assertEquals( date('r', $result['end_date']), date('r', strtotime('11-Dec-2016 12:00PM')) ); // $this->assertEquals( date('r', $result['due_date']), date('r', strtotime('05-Dec-2016 12:00PM')) ); // // $praef->setDayOfWeek(2); // $this->assertEquals( date('r', $praef->calculateNextDate( strtotime('01-Dec-2016') )), date('r', strtotime('20-Dec-2016 12:00PM')) ); // $praef->setDayOfWeek(4); // $this->assertEquals( date('r', $praef->calculateNextDate( strtotime('23-Feb-2016') )), date('r', strtotime('10-Mar-2016 12:00PM')) ); // } /** * @group PayrollRemittanceAgencyEvent_testAnnual */ function testAnnual() { $praef = TTnew( 'PayrollRemittanceAgencyEventFactory' ); /** @var PayrollRemittanceAgencyEventFactory $praef */ $praef->setPayrollRemittanceAgencyId( $this->agency_id ); $praef->setFrequency( 2000 ); $praef->setPrimaryDayOfMonth( 1 ); $praef->setPrimaryMonth( 12 ); $praef->setEffectiveDate( strtotime( '01-Dec-2016' ) ); //testing time edges/variations $result = $praef->calculateNextDate( strtotime( '01-Dec-2016' ) ); $this->assertEquals( date( 'r', $result['start_date'] ), date( 'r', strtotime( '01-Jan-2016 12:00AM' ) ) ); $this->assertEquals( date( 'r', $result['end_date'] ), date( 'r', strtotime( '31-Dec-2016 11:59:59PM' ) ) ); $this->assertEquals( date( 'r', $result['due_date'] ), date( 'r', strtotime( '01-Dec-2017 12:00PM' ) ) ); $result = $praef->calculateNextDate( strtotime( '01-Dec-2016 12:01AM' ) ); $this->assertEquals( date( 'r', $result['start_date'] ), date( 'r', strtotime( '01-Jan-2016 12:00AM' ) ) ); $this->assertEquals( date( 'r', $result['end_date'] ), date( 'r', strtotime( '31-Dec-2016 11:59:59PM' ) ) ); $this->assertEquals( date( 'r', $result['due_date'] ), date( 'r', strtotime( '01-Dec-2017 12:00PM' ) ) ); $result = $praef->calculateNextDate( strtotime( '01-Dec-2016 12:00PM' ) ); $this->assertEquals( date( 'r', $result['start_date'] ), date( 'r', strtotime( '01-Jan-2016 12:00AM' ) ) ); $this->assertEquals( date( 'r', $result['end_date'] ), date( 'r', strtotime( '31-Dec-2016 11:59:59PM' ) ) ); $this->assertEquals( date( 'r', $result['due_date'] ), date( 'r', strtotime( '01-Dec-2017 12:00PM' ) ) ); $result = $praef->calculateNextDate( strtotime( '01-Dec-2016 11:59PM' ) ); $this->assertEquals( date( 'r', $result['start_date'] ), date( 'r', strtotime( '01-Jan-2016 12:00AM' ) ) ); $this->assertEquals( date( 'r', $result['end_date'] ), date( 'r', strtotime( '31-Dec-2016 11:59:59PM' ) ) ); $this->assertEquals( date( 'r', $result['due_date'] ), date( 'r', strtotime( '01-Dec-2017 12:00PM' ) ) ); $praef = TTnew( 'PayrollRemittanceAgencyEventFactory' ); /** @var PayrollRemittanceAgencyEventFactory $praef */ $praef->setPayrollRemittanceAgencyId( $this->agency_id ); $praef->setFrequency( 2000 ); $praef->setPrimaryDayOfMonth( 12 ); $praef->setPrimaryMonth( 2 ); $praef->setEffectiveDate( strtotime( '01-Dec-2012' ) ); $result = $praef->calculateNextDate( strtotime( '01-Dec-2014' ) ); $this->assertEquals( date( 'r', $result['start_date'] ), date( 'r', strtotime( '01-Jan-2014 12:00AM' ) ) ); $this->assertEquals( date( 'r', $result['end_date'] ), date( 'r', strtotime( '31-Dec-2014 11:59:59PM' ) ) ); $this->assertEquals( date( 'r', $result['due_date'] ), date( 'r', strtotime( '12-Feb-2015 12:00PM' ) ) ); $result = $praef->calculateNextDate( strtotime( '01-Jan-2014' ) ); $this->assertEquals( date( 'r', $result['start_date'] ), date( 'r', strtotime( '01-Jan-2013 12:00AM' ) ) ); $this->assertEquals( date( 'r', $result['end_date'] ), date( 'r', strtotime( '31-Dec-2013 11:59:59PM' ) ) ); $this->assertEquals( date( 'r', $result['due_date'] ), date( 'r', strtotime( '12-Feb-2014 12:00PM' ) ) ); //testing a few consecutive days ( like cron ) $result = $praef->calculateNextDate( strtotime( '10-Feb-2014' ) ); $this->assertEquals( date( 'r', $result['start_date'] ), date( 'r', strtotime( '01-Jan-2013 12:00AM' ) ) ); $this->assertEquals( date( 'r', $result['end_date'] ), date( 'r', strtotime( '31-Dec-2013 11:59:59PM' ) ) ); $this->assertEquals( date( 'r', $result['due_date'] ), date( 'r', strtotime( '12-Feb-2014 12:00PM' ) ) ); $result = $praef->calculateNextDate( strtotime( '11-Feb-2014' ) ); $this->assertEquals( date( 'r', $result['start_date'] ), date( 'r', strtotime( '01-Jan-2013 12:00AM' ) ) ); $this->assertEquals( date( 'r', $result['end_date'] ), date( 'r', strtotime( '31-Dec-2013 11:59:59PM' ) ) ); $this->assertEquals( date( 'r', $result['due_date'] ), date( 'r', strtotime( '12-Feb-2014 12:00PM' ) ) ); $result = $praef->calculateNextDate( strtotime( '12-Feb-2014' ) ); $this->assertEquals( date( 'r', $result['start_date'] ), date( 'r', strtotime( '01-Jan-2014 12:00AM' ) ) ); $this->assertEquals( date( 'r', $result['end_date'] ), date( 'r', strtotime( '31-Dec-2014 11:59:59PM' ) ) ); $this->assertEquals( date( 'r', $result['due_date'] ), date( 'r', strtotime( '12-Feb-2015 12:00PM' ) ) ); $result = $praef->calculateNextDate( strtotime( '13-Feb-2014' ) ); $this->assertEquals( date( 'r', $result['start_date'] ), date( 'r', strtotime( '01-Jan-2014 12:00AM' ) ) ); $this->assertEquals( date( 'r', $result['end_date'] ), date( 'r', strtotime( '31-Dec-2014 11:59:59PM' ) ) ); $this->assertEquals( date( 'r', $result['due_date'] ), date( 'r', strtotime( '12-Feb-2015 12:00PM' ) ) ); //chained test ( like wizard ) $praef = TTnew( 'PayrollRemittanceAgencyEventFactory' ); /** @var PayrollRemittanceAgencyEventFactory $praef */ $praef->setPayrollRemittanceAgencyId( $this->agency_id ); $praef->setFrequency( 2000 ); $praef->setPrimaryDayOfMonth( 12 ); $praef->setPrimaryMonth( 2 ); $praef->setEffectiveDate( strtotime( '01-Dec-2012' ) ); $result = $praef->calculateNextDate( strtotime( '01-Dec-2014' ) ); $this->assertEquals( date( 'r', $result['start_date'] ), date( 'r', strtotime( '01-Jan-2014 12:00AM' ) ) ); $this->assertEquals( date( 'r', $result['end_date'] ), date( 'r', strtotime( '31-Dec-2014 11:59:59PM' ) ) ); $this->assertEquals( date( 'r', $result['due_date'] ), date( 'r', strtotime( '12-Feb-2015 12:00PM' ) ) ); $result = $praef->calculateNextDate( $result['due_date'] );//12-Feb-2015 12:00PM $this->assertEquals( date( 'r', $result['start_date'] ), date( 'r', strtotime( '01-Jan-2015 12:00AM' ) ) ); $this->assertEquals( date( 'r', $result['end_date'] ), date( 'r', strtotime( '31-Dec-2015 11:59:59PM' ) ) ); $this->assertEquals( date( 'r', $result['due_date'] ), date( 'r', strtotime( '12-Feb-2016 12:00PM' ) ) ); $result = $praef->calculateNextDate( $result['due_date'] );//12-Feb-2016 12:00PM $this->assertEquals( date( 'r', $result['start_date'] ), date( 'r', strtotime( '01-Jan-2016 12:00AM' ) ) ); $this->assertEquals( date( 'r', $result['end_date'] ), date( 'r', strtotime( '31-Dec-2016 11:59:59PM' ) ) ); $this->assertEquals( date( 'r', $result['due_date'] ), date( 'r', strtotime( '12-Feb-2017 12:00PM' ) ) ); $result = $praef->calculateNextDate( $result['due_date'] );//12-Feb-2017 12:00PM $this->assertEquals( date( 'r', $result['start_date'] ), date( 'r', strtotime( '01-Jan-2017 12:00AM' ) ) ); $this->assertEquals( date( 'r', $result['end_date'] ), date( 'r', strtotime( '31-Dec-2017 11:59:59PM' ) ) ); $this->assertEquals( date( 'r', $result['due_date'] ), date( 'r', strtotime( '12-Feb-2018 12:00PM' ) ) ); //chained loop test. $praef->setPrimaryDayOfMonth( 10 ); $praef->setPrimaryMonth( 2 ); $praef->setEffectiveDate( time() ); $epoch = TTDate::getMiddleDayEpoch( $praef->getEffectiveDate() ); for ( $i = 0; $i < 25; $i++ ) { $artificial_match_value = mktime( 0, 0, 0, $praef->getPrimaryMonth(), $praef->getPrimaryDayOfMonth(), date( 'Y', $epoch ) ); $artificial_match_value = TTDate::getMiddleDayEpoch( $artificial_match_value ); if ( $artificial_match_value <= $epoch ) { $artificial_match_value = TTDate::incrementDate( $artificial_match_value, 1, 'year' ); } $year_before_match = TTDate::incrementDate( $artificial_match_value, -1, 'year' ); $result = $praef->calculateNextDate( $epoch ); $epoch = $result['due_date']; $start_date = TTDate::getBeginDayEpoch( TTDate::getBeginYearEpoch( $year_before_match ) ); $end_date = TTDate::getEndDayEpoch( TTDate::getEndYearEpoch( $year_before_match ) ); $this->assertEquals( date( 'r', $result['start_date'] ), date( 'r', $start_date ) ); $this->assertEquals( date( 'r', $result['end_date'] ), date( 'r', $end_date ) ); $this->assertEquals( date( 'r', $epoch ), date( 'r', $artificial_match_value ) ); } } /** * @group PayrollRemittanceAgencyEvent_testQuarterlyA */ function testQuarterlyA() { Debug::Text( 'testQuarterly', __FILE__, __LINE__, __METHOD__, 10 ); $praef = TTnew( 'PayrollRemittanceAgencyEventFactory' ); /** @var PayrollRemittanceAgencyEventFactory $praef */ $praef->setPayrollRemittanceAgencyId( $this->agency_id ); $praef->setFrequency( 3000 ); $praef->setPrimaryDayOfMonth( 1 ); $praef->setQuarterMonth( 1 ); $praef->setEffectiveDate( strtotime( '01-Jan-2015' ) ); //chained test (like wizard) $result = $praef->calculateNextDate( strtotime( '01-Oct-2015 12:00PM' ) ); $this->assertEquals( date( 'r', $result['start_date'] ), date( 'r', strtotime( '01-Oct-2015 12:00AM' ) ) ); $this->assertEquals( date( 'r', $result['end_date'] ), date( 'r', strtotime( '31-Dec-2015 11:59:59PM' ) ) ); $this->assertEquals( date( 'r', $result['due_date'] ), date( 'r', strtotime( '01-Jan-2016 12:00PM' ) ) ); $result = $praef->calculateNextDate( $result['due_date'] ); //01-Jan-2016 12:00PM $this->assertEquals( date( 'r', $result['start_date'] ), date( 'r', strtotime( '01-Jan-2016 12:00AM' ) ) ); $this->assertEquals( date( 'r', $result['end_date'] ), date( 'r', strtotime( '31-Mar-2016 11:59:59PM' ) ) ); $this->assertEquals( date( 'r', $result['due_date'] ), date( 'r', strtotime( '01-Apr-2016 12:00PM' ) ) ); $result = $praef->calculateNextDate( $result['due_date'] ); //01-Apr-2016 12:00PM $this->assertEquals( date( 'r', $result['start_date'] ), date( 'r', strtotime( '01-Apr-2016 12:00AM' ) ) ); $this->assertEquals( date( 'r', $result['end_date'] ), date( 'r', strtotime( '30-Jun-2016 11:59:59PM' ) ) ); $this->assertEquals( date( 'r', $result['due_date'] ), date( 'r', strtotime( '01-Jul-2016 12:00PM' ) ) ); $result = $praef->calculateNextDate( $result['due_date'] ); //01-Jul-2016 12:00PM $this->assertEquals( date( 'r', $result['start_date'] ), date( 'r', strtotime( '01-Jul-2016 12:00AM' ) ) ); $this->assertEquals( date( 'r', $result['end_date'] ), date( 'r', strtotime( '30-Sep-2016 11:59:59PM' ) ) ); $this->assertEquals( date( 'r', $result['due_date'] ), date( 'r', strtotime( '01-Oct-2016 12:00PM' ) ) ); $result = $praef->calculateNextDate( $result['due_date'] ); //01-Oct-2016 12:00PM $this->assertEquals( date( 'r', $result['start_date'] ), date( 'r', strtotime( '01-Oct-2016 12:00AM' ) ) ); $this->assertEquals( date( 'r', $result['end_date'] ), date( 'r', strtotime( '31-Dec-2016 11:59:59PM' ) ) ); $this->assertEquals( date( 'r', $result['due_date'] ), date( 'r', strtotime( '01-Jan-2017 12:00PM' ) ) ); //Simulate adjusting for a weekend/holiday $result = $praef->calculateNextDate( strtotime( '04-Oct-2015 12:00PM' ) ); $this->assertEquals( date( 'r', $result['start_date'] ), date( 'r', strtotime( '01-Oct-2015 12:00AM' ) ) ); $this->assertEquals( date( 'r', $result['end_date'] ), date( 'r', strtotime( '31-Dec-2015 11:59:59PM' ) ) ); $this->assertEquals( date( 'r', $result['due_date'] ), date( 'r', strtotime( '01-Jan-2016 12:00PM' ) ) ); $result = $praef->calculateNextDate( strtotime( '03-Oct-2015 12:00PM' ) ); $this->assertEquals( date( 'r', $result['start_date'] ), date( 'r', strtotime( '01-Oct-2015 12:00AM' ) ) ); $this->assertEquals( date( 'r', $result['end_date'] ), date( 'r', strtotime( '31-Dec-2015 11:59:59PM' ) ) ); $this->assertEquals( date( 'r', $result['due_date'] ), date( 'r', strtotime( '01-Jan-2016 12:00PM' ) ) ); $result = $praef->calculateNextDate( strtotime( '02-Oct-2015 12:00PM' ) ); $this->assertEquals( date( 'r', $result['start_date'] ), date( 'r', strtotime( '01-Oct-2015 12:00AM' ) ) ); $this->assertEquals( date( 'r', $result['end_date'] ), date( 'r', strtotime( '31-Dec-2015 11:59:59PM' ) ) ); $this->assertEquals( date( 'r', $result['due_date'] ), date( 'r', strtotime( '01-Jan-2016 12:00PM' ) ) ); $result = $praef->calculateNextDate( strtotime( '01-Oct-2015 12:00PM' ) ); $this->assertEquals( date( 'r', $result['start_date'] ), date( 'r', strtotime( '01-Oct-2015 12:00AM' ) ) ); $this->assertEquals( date( 'r', $result['end_date'] ), date( 'r', strtotime( '31-Dec-2015 11:59:59PM' ) ) ); $this->assertEquals( date( 'r', $result['due_date'] ), date( 'r', strtotime( '01-Jan-2016 12:00PM' ) ) ); $result = $praef->calculateNextDate( strtotime( '30-Nov-2015 12:00PM' ) ); $this->assertEquals( date( 'r', $result['start_date'] ), date( 'r', strtotime( '01-Oct-2015 12:00AM' ) ) ); $this->assertEquals( date( 'r', $result['end_date'] ), date( 'r', strtotime( '31-Dec-2015 11:59:59PM' ) ) ); $this->assertEquals( date( 'r', $result['due_date'] ), date( 'r', strtotime( '01-Jan-2016 12:00PM' ) ) ); $result = $praef->calculateNextDate( strtotime( '29-Nov-2015 12:00PM' ) ); $this->assertEquals( date( 'r', $result['start_date'] ), date( 'r', strtotime( '01-Oct-2015 12:00AM' ) ) ); $this->assertEquals( date( 'r', $result['end_date'] ), date( 'r', strtotime( '31-Dec-2015 11:59:59PM' ) ) ); $this->assertEquals( date( 'r', $result['due_date'] ), date( 'r', strtotime( '01-Jan-2016 12:00PM' ) ) ); $result = $praef->calculateNextDate( strtotime( '28-Nov-2015 12:00PM' ) ); $this->assertEquals( date( 'r', $result['start_date'] ), date( 'r', strtotime( '01-Oct-2015 12:00AM' ) ) ); $this->assertEquals( date( 'r', $result['end_date'] ), date( 'r', strtotime( '31-Dec-2015 11:59:59PM' ) ) ); $this->assertEquals( date( 'r', $result['due_date'] ), date( 'r', strtotime( '01-Jan-2016 12:00PM' ) ) ); $result = $praef->calculateNextDate( strtotime( '27-Nov-2015 12:00PM' ) ); $this->assertEquals( date( 'r', $result['start_date'] ), date( 'r', strtotime( '01-Oct-2015 12:00AM' ) ) ); $this->assertEquals( date( 'r', $result['end_date'] ), date( 'r', strtotime( '31-Dec-2015 11:59:59PM' ) ) ); $this->assertEquals( date( 'r', $result['due_date'] ), date( 'r', strtotime( '01-Jan-2016 12:00PM' ) ) ); $praef = TTnew( 'PayrollRemittanceAgencyEventFactory' ); /** @var PayrollRemittanceAgencyEventFactory $praef */ $praef->setPayrollRemittanceAgencyId( $this->agency_id ); $praef->setFrequency( 3000 ); $praef->setPrimaryDayOfMonth( 1 ); $praef->setQuarterMonth( 1 ); $praef->setEffectiveDate( strtotime( '01-Jan-2016' ) ); //change quarter month $praef->setQuarterMonth( 2 ); $result = $praef->calculateNextDate( strtotime( '11-Sep-2016 12:00PM' ) ); $this->assertEquals( date( 'r', $result['start_date'] ), date( 'r', strtotime( '01-Jul-2016 12:00AM' ) ) ); $this->assertEquals( date( 'r', $result['end_date'] ), date( 'r', strtotime( '30-Sep-2016 11:59:59PM' ) ) ); $this->assertEquals( date( 'r', $result['due_date'] ), date( 'r', strtotime( '01-Nov-2016 12:00PM' ) ) ); $praef->setQuarterMonth( 1 ); $praef->setPrimaryDayOfMonth( 3 ); //based off effective date $result = $praef->calculateNextDate( strtotime( '11-Sep-1981 12:00PM' ) ); //Before effective date, so it gets set to that instead: '01-Jan-2016' $this->assertEquals( date( 'r', $result['start_date'] ), date( 'r', strtotime( '01-Jan-2016 12:00AM' ) ) ); $this->assertEquals( date( 'r', $result['end_date'] ), date( 'r', strtotime( '31-Mar-2016 11:59:59PM' ) ) ); $this->assertEquals( date( 'r', $result['due_date'] ), date( 'r', strtotime( '03-Apr-2016 12:00PM' ) ) ); //try a really old one $praef->setEffectiveDate( strtotime( '01-Jan-1981' ) ); $result = $praef->calculateNextDate( strtotime( '11-Sep-1981 12:00PM' ) ); $this->assertEquals( date( 'r', $result['start_date'] ), date( 'r', strtotime( '01-Jul-1981 12:00AM' ) ) ); $this->assertEquals( date( 'r', $result['end_date'] ), date( 'r', strtotime( '30-Sep-1981 11:59:59PM' ) ) ); $this->assertEquals( date( 'r', $result['due_date'] ), date( 'r', strtotime( '03-Oct-1981 12:00PM' ) ) ); //try a far future one $praef->setEffectiveDate( strtotime( '01-Jan-2025' ) ); $result = $praef->calculateNextDate( strtotime( '11-Sep-1981 12:00PM' ) ); //Before effective date, so it gets set to that instead: '01-Jan-2016' $this->assertEquals( date( 'r', $result['start_date'] ), date( 'r', strtotime( '01-Jan-2025 12:00AM' ) ) ); $this->assertEquals( date( 'r', $result['end_date'] ), date( 'r', strtotime( '31-Mar-2025 11:59:59PM' ) ) ); $this->assertEquals( date( 'r', $result['due_date'] ), date( 'r', strtotime( '03-Apr-2025 12:00PM' ) ) ); //leap year hitting the extra day with an overshot last day of month //31st and month = 2 (feb) $praef->setPrimaryDayOfMonth( 31 ); $praef->setQuarterMonth( 2 ); $praef->setEffectiveDate( strtotime( '01-Jan-2015' ) ); //checking for leap year overflow $result = $praef->calculateNextDate( strtotime( '01-Dec-2015 12:00PM' ) ); $this->assertEquals( date( 'r', $result['start_date'] ), date( 'r', strtotime( '01-Oct-2015 12:00AM' ) ) ); $this->assertEquals( date( 'r', $result['end_date'] ), date( 'r', strtotime( '31-Dec-2015 11:59:59PM' ) ) ); $this->assertEquals( date( 'r', $result['due_date'] ), date( 'r', strtotime( '29-Feb-2016 12:00PM' ) ) ); $praef->setPrimaryDayOfMonth( 28 ); $praef->setEffectiveDate( strtotime( '01-Jan-2015' ) ); $result = $praef->calculateNextDate( strtotime( '01-Dec-2015 12:00PM' ) ); $this->assertEquals( date( 'r', $result['start_date'] ), date( 'r', strtotime( '01-Oct-2015 12:00AM' ) ) ); $this->assertEquals( date( 'r', $result['end_date'] ), date( 'r', strtotime( '31-Dec-2015 11:59:59PM' ) ) ); $this->assertEquals( date( 'r', $result['due_date'] ), date( 'r', strtotime( '28-Feb-2016 12:00PM' ) ) ); $praef->setPrimaryDayOfMonth( 29 ); $praef->setEffectiveDate( strtotime( '01-Jan-2015' ) ); $result = $praef->calculateNextDate( strtotime( '01-Dec-2015 12:00PM' ) ); $this->assertEquals( date( 'r', $result['start_date'] ), date( 'r', strtotime( '01-Oct-2015 12:00AM' ) ) ); $this->assertEquals( date( 'r', $result['end_date'] ), date( 'r', strtotime( '31-Dec-2015 11:59:59PM' ) ) ); $this->assertEquals( date( 'r', $result['due_date'] ), date( 'r', strtotime( '29-Feb-2016 12:00PM' ) ) ); $praef->setPrimaryDayOfMonth( 30 ); $praef->setEffectiveDate( strtotime( '01-Jan-2015' ) ); $result = $praef->calculateNextDate( strtotime( '01-Dec-2015 12:00PM' ) ); $this->assertEquals( date( 'r', $result['start_date'] ), date( 'r', strtotime( '01-Oct-2015 12:00AM' ) ) ); $this->assertEquals( date( 'r', $result['end_date'] ), date( 'r', strtotime( '31-Dec-2015 11:59:59PM' ) ) ); $this->assertEquals( date( 'r', $result['due_date'] ), date( 'r', strtotime( '29-Feb-2016 12:00PM' ) ) ); } /** * @group PayrollRemittanceAgencyEvent_testQuarterlyB */ function testQuarterlyB() { Debug::Text( 'testQuarterly', __FILE__, __LINE__, __METHOD__, 10 ); $praef = TTnew( 'PayrollRemittanceAgencyEventFactory' ); /** @var PayrollRemittanceAgencyEventFactory $praef */ $praef->setPayrollRemittanceAgencyId( $this->agency_id ); $praef->setFrequency( 3000 ); $praef->setPrimaryDayOfMonth( 31 ); $praef->setQuarterMonth( 1 ); $praef->setEffectiveDate( strtotime( '01-Jan-2015' ) ); //chained test (like wizard) $result = $praef->calculateNextDate( strtotime( '01-Oct-2015 12:00PM' ) ); $this->assertEquals( date( 'r', $result['start_date'] ), date( 'r', strtotime( '01-Oct-2015 12:00AM' ) ) ); $this->assertEquals( date( 'r', $result['end_date'] ), date( 'r', strtotime( '31-Dec-2015 11:59:59PM' ) ) ); $this->assertEquals( date( 'r', $result['due_date'] ), date( 'r', strtotime( '31-Jan-2016 12:00PM' ) ) ); $result = $praef->calculateNextDate( $result['due_date'] ); //01-Jan-2016 12:00PM $this->assertEquals( date( 'r', $result['start_date'] ), date( 'r', strtotime( '01-Jan-2016 12:00AM' ) ) ); $this->assertEquals( date( 'r', $result['end_date'] ), date( 'r', strtotime( '31-Mar-2016 11:59:59PM' ) ) ); $this->assertEquals( date( 'r', $result['due_date'] ), date( 'r', strtotime( '30-Apr-2016 12:00PM' ) ) ); $result = $praef->calculateNextDate( $result['due_date'] ); //01-Apr-2016 12:00PM $this->assertEquals( date( 'r', $result['start_date'] ), date( 'r', strtotime( '01-Apr-2016 12:00AM' ) ) ); $this->assertEquals( date( 'r', $result['end_date'] ), date( 'r', strtotime( '30-Jun-2016 11:59:59PM' ) ) ); $this->assertEquals( date( 'r', $result['due_date'] ), date( 'r', strtotime( '31-Jul-2016 12:00PM' ) ) ); $result = $praef->calculateNextDate( $result['due_date'] ); //01-Jul-2016 12:00PM $this->assertEquals( date( 'r', $result['start_date'] ), date( 'r', strtotime( '01-Jul-2016 12:00AM' ) ) ); $this->assertEquals( date( 'r', $result['end_date'] ), date( 'r', strtotime( '30-Sep-2016 11:59:59PM' ) ) ); $this->assertEquals( date( 'r', $result['due_date'] ), date( 'r', strtotime( '31-Oct-2016 12:00PM' ) ) ); $result = $praef->calculateNextDate( $result['due_date'] ); //01-Oct-2016 12:00PM $this->assertEquals( date( 'r', $result['start_date'] ), date( 'r', strtotime( '01-Oct-2016 12:00AM' ) ) ); $this->assertEquals( date( 'r', $result['end_date'] ), date( 'r', strtotime( '31-Dec-2016 11:59:59PM' ) ) ); $this->assertEquals( date( 'r', $result['due_date'] ), date( 'r', strtotime( '31-Jan-2017 12:00PM' ) ) ); $praef->setPrimaryDayOfMonth( 31 ); $praef->setQuarterMonth( 2 ); $praef->setEffectiveDate( strtotime( '01-Jan-2015' ) ); //chained test (like wizard) $result = $praef->calculateNextDate( strtotime( '01-Oct-2015 12:00PM' ) ); $this->assertEquals( date( 'r', $result['start_date'] ), date( 'r', strtotime( '01-Oct-2015 12:00AM' ) ) ); $this->assertEquals( date( 'r', $result['end_date'] ), date( 'r', strtotime( '31-Dec-2015 11:59:59PM' ) ) ); $this->assertEquals( date( 'r', $result['due_date'] ), date( 'r', strtotime( '29-Feb-2016 12:00PM' ) ) ); $result = $praef->calculateNextDate( $result['due_date'] ); //01-Jan-2016 12:00PM $this->assertEquals( date( 'r', $result['start_date'] ), date( 'r', strtotime( '01-Jan-2016 12:00AM' ) ) ); $this->assertEquals( date( 'r', $result['end_date'] ), date( 'r', strtotime( '31-Mar-2016 11:59:59PM' ) ) ); $this->assertEquals( date( 'r', $result['due_date'] ), date( 'r', strtotime( '31-May-2016 12:00PM' ) ) ); $result = $praef->calculateNextDate( $result['due_date'] ); //01-Apr-2016 12:00PM $this->assertEquals( date( 'r', $result['start_date'] ), date( 'r', strtotime( '01-Apr-2016 12:00AM' ) ) ); $this->assertEquals( date( 'r', $result['end_date'] ), date( 'r', strtotime( '30-Jun-2016 11:59:59PM' ) ) ); $this->assertEquals( date( 'r', $result['due_date'] ), date( 'r', strtotime( '31-Aug-2016 12:00PM' ) ) ); $result = $praef->calculateNextDate( $result['due_date'] ); //01-Jul-2016 12:00PM $this->assertEquals( date( 'r', $result['start_date'] ), date( 'r', strtotime( '01-Jul-2016 12:00AM' ) ) ); $this->assertEquals( date( 'r', $result['end_date'] ), date( 'r', strtotime( '30-Sep-2016 11:59:59PM' ) ) ); $this->assertEquals( date( 'r', $result['due_date'] ), date( 'r', strtotime( '30-Nov-2016 12:00PM' ) ) ); $result = $praef->calculateNextDate( $result['due_date'] ); //01-Oct-2016 12:00PM $this->assertEquals( date( 'r', $result['start_date'] ), date( 'r', strtotime( '01-Oct-2016 12:00AM' ) ) ); $this->assertEquals( date( 'r', $result['end_date'] ), date( 'r', strtotime( '31-Dec-2016 11:59:59PM' ) ) ); $this->assertEquals( date( 'r', $result['due_date'] ), date( 'r', strtotime( '28-Feb-2017 12:00PM' ) ) ); } /** * @group PayrollRemittanceAgencyEvent_testSemiWeekly */ function testSemiWeekly() { //Wednesday, Thursday, Friday = Wednesday. Saturday, Sunday, Monday, Tuesday = Friday $praef = TTnew( 'PayrollRemittanceAgencyEventFactory' ); /** @var PayrollRemittanceAgencyEventFactory $praef */ $praef->setPayrollRemittanceAgencyId( $this->agency_id ); $praef->setFrequency( 64000 ); $praef->setEffectiveDate( strtotime( '01-Jan-2017' ) ); //test consecutive days (like cron) $result = $praef->calculateNextDate( strtotime( '01-Sep-2017 12:00PM' ) ); $this->assertEquals( date( 'r', $result['start_date'] ), date( 'r', strtotime( '30-Aug-2017 12:00AM' ) ) ); $this->assertEquals( date( 'r', $result['end_date'] ), date( 'r', strtotime( '01-Sep-2017 11:59:59PM' ) ) ); $this->assertEquals( date( 'r', $result['due_date'] ), date( 'r', strtotime( '06-Sep-2017 12:00PM' ) ) ); $result = $praef->calculateNextDate( strtotime( '02-Sep-2017 12:00PM' ) ); $this->assertEquals( date( 'r', $result['start_date'] ), date( 'r', strtotime( '30-Aug-2017 12:00AM' ) ) ); $this->assertEquals( date( 'r', $result['end_date'] ), date( 'r', strtotime( '01-Sep-2017 11:59:59PM' ) ) ); $this->assertEquals( date( 'r', $result['due_date'] ), date( 'r', strtotime( '06-Sep-2017 12:00PM' ) ) ); $result = $praef->calculateNextDate( strtotime( '03-Sep-2017 12:00PM' ) ); $this->assertEquals( date( 'r', $result['start_date'] ), date( 'r', strtotime( '30-Aug-2017 12:00AM' ) ) ); $this->assertEquals( date( 'r', $result['end_date'] ), date( 'r', strtotime( '01-Sep-2017 11:59:59PM' ) ) ); $this->assertEquals( date( 'r', $result['due_date'] ), date( 'r', strtotime( '06-Sep-2017 12:00PM' ) ) ); $result = $praef->calculateNextDate( strtotime( '04-Sep-2017 12:00PM' ) ); $this->assertEquals( date( 'r', $result['start_date'] ), date( 'r', strtotime( '30-Aug-2017 12:00AM' ) ) ); $this->assertEquals( date( 'r', $result['end_date'] ), date( 'r', strtotime( '01-Sep-2017 11:59:59PM' ) ) ); $this->assertEquals( date( 'r', $result['due_date'] ), date( 'r', strtotime( '06-Sep-2017 12:00PM' ) ) ); $result = $praef->calculateNextDate( strtotime( '05-Sep-2017 12:00PM' ) ); $this->assertEquals( date( 'r', $result['start_date'] ), date( 'r', strtotime( '30-Aug-2017 12:00AM' ) ) ); $this->assertEquals( date( 'r', $result['end_date'] ), date( 'r', strtotime( '01-Sep-2017 11:59:59PM' ) ) ); $this->assertEquals( date( 'r', $result['due_date'] ), date( 'r', strtotime( '06-Sep-2017 12:00PM' ) ) ); $result = $praef->calculateNextDate( strtotime( '06-Sep-2017 12:00PM' ) ); $this->assertEquals( date( 'r', $result['start_date'] ), date( 'r', strtotime( '02-Sep-2017 12:00AM' ) ) ); $this->assertEquals( date( 'r', $result['end_date'] ), date( 'r', strtotime( '05-Sep-2017 11:59:59PM' ) ) ); $this->assertEquals( date( 'r', $result['due_date'] ), date( 'r', strtotime( '08-Sep-2017 12:00PM' ) ) ); $result = $praef->calculateNextDate( strtotime( '07-Sep-2017 12:00PM' ) ); $this->assertEquals( date( 'r', $result['start_date'] ), date( 'r', strtotime( '02-Sep-2017 12:00AM' ) ) ); $this->assertEquals( date( 'r', $result['end_date'] ), date( 'r', strtotime( '05-Sep-2017 11:59:59PM' ) ) ); $this->assertEquals( date( 'r', $result['due_date'] ), date( 'r', strtotime( '08-Sep-2017 12:00PM' ) ) ); $result = $praef->calculateNextDate( strtotime( '08-Sep-2017 12:00PM' ) ); $this->assertEquals( date( 'r', $result['start_date'] ), date( 'r', strtotime( '06-Sep-2017 12:00AM' ) ) ); $this->assertEquals( date( 'r', $result['end_date'] ), date( 'r', strtotime( '08-Sep-2017 11:59:59PM' ) ) ); $this->assertEquals( date( 'r', $result['due_date'] ), date( 'r', strtotime( '13-Sep-2017 12:00PM' ) ) ); $result = $praef->calculateNextDate( strtotime( '09-Sep-2017 12:00PM' ) ); $this->assertEquals( date( 'r', $result['start_date'] ), date( 'r', strtotime( '06-Sep-2017 12:00AM' ) ) ); $this->assertEquals( date( 'r', $result['end_date'] ), date( 'r', strtotime( '08-Sep-2017 11:59:59PM' ) ) ); $this->assertEquals( date( 'r', $result['due_date'] ), date( 'r', strtotime( '13-Sep-2017 12:00PM' ) ) ); $result = $praef->calculateNextDate( strtotime( '10-Sep-2017 12:00PM' ) ); $this->assertEquals( date( 'r', $result['start_date'] ), date( 'r', strtotime( '06-Sep-2017 12:00AM' ) ) ); $this->assertEquals( date( 'r', $result['end_date'] ), date( 'r', strtotime( '08-Sep-2017 11:59:59PM' ) ) ); $this->assertEquals( date( 'r', $result['due_date'] ), date( 'r', strtotime( '13-Sep-2017 12:00PM' ) ) ); $result = $praef->calculateNextDate( strtotime( '11-Sep-2017 12:00PM' ) ); $this->assertEquals( date( 'r', $result['start_date'] ), date( 'r', strtotime( '06-Sep-2017 12:00AM' ) ) ); $this->assertEquals( date( 'r', $result['end_date'] ), date( 'r', strtotime( '08-Sep-2017 11:59:59PM' ) ) ); $this->assertEquals( date( 'r', $result['due_date'] ), date( 'r', strtotime( '13-Sep-2017 12:00PM' ) ) ); $result = $praef->calculateNextDate( strtotime( '12-Sep-2017 12:00PM' ) ); $this->assertEquals( date( 'r', $result['start_date'] ), date( 'r', strtotime( '06-Sep-2017 12:00AM' ) ) ); $this->assertEquals( date( 'r', $result['end_date'] ), date( 'r', strtotime( '08-Sep-2017 11:59:59PM' ) ) ); $this->assertEquals( date( 'r', $result['due_date'] ), date( 'r', strtotime( '13-Sep-2017 12:00PM' ) ) ); $result = $praef->calculateNextDate( strtotime( '13-Sep-2017 12:00PM' ) ); $this->assertEquals( date( 'r', $result['start_date'] ), date( 'r', strtotime( '09-Sep-2017 12:00AM' ) ) ); $this->assertEquals( date( 'r', $result['end_date'] ), date( 'r', strtotime( '12-Sep-2017 11:59:59PM' ) ) ); $this->assertEquals( date( 'r', $result['due_date'] ), date( 'r', strtotime( '15-Sep-2017 12:00PM' ) ) ); //chained test (like wizard) $result = $praef->calculateNextDate( strtotime( '01-Sep-2017 12:00PM' ) ); //Fri $this->assertEquals( date( 'r', $result['start_date'] ), date( 'r', strtotime( '30-Aug-2017 12:00AM' ) ) ); $this->assertEquals( date( 'r', $result['end_date'] ), date( 'r', strtotime( '01-Sep-2017 11:59:59PM' ) ) ); $this->assertEquals( date( 'r', $result['due_date'] ), date( 'r', strtotime( '06-Sep-2017 12:00PM' ) ) ); $result = $praef->calculateNextDate( $result['due_date'] ); //06-Sep-2017 12:00PM -- Wed //$result = $praef->calculateNextDate( strtotime( '06-Sep-2017 12:00PM' ) ); //06-Sep-2017 12:00PM $this->assertEquals( date( 'r', $result['start_date'] ), date( 'r', strtotime( '02-Sep-2017 12:00AM' ) ) ); $this->assertEquals( date( 'r', $result['end_date'] ), date( 'r', strtotime( '05-Sep-2017 11:59:59PM' ) ) ); $this->assertEquals( date( 'r', $result['due_date'] ), date( 'r', strtotime( '08-Sep-2017 12:00PM' ) ) ); $result = $praef->calculateNextDate( $result['due_date'] ); //08-Sep-2017 12:00PM $this->assertEquals( date( 'r', $result['start_date'] ), date( 'r', strtotime( '06-Sep-2017 12:00AM' ) ) ); $this->assertEquals( date( 'r', $result['end_date'] ), date( 'r', strtotime( '08-Sep-2017 11:59:59PM' ) ) ); $this->assertEquals( date( 'r', $result['due_date'] ), date( 'r', strtotime( '13-Sep-2017 12:00PM' ) ) ); $result = $praef->calculateNextDate( $result['due_date'] ); //13-Sep-2017 12:00PM $this->assertEquals( date( 'r', $result['start_date'] ), date( 'r', strtotime( '09-Sep-2017 12:00AM' ) ) ); $this->assertEquals( date( 'r', $result['end_date'] ), date( 'r', strtotime( '12-Sep-2017 11:59:59PM' ) ) ); $this->assertEquals( date( 'r', $result['due_date'] ), date( 'r', strtotime( '15-Sep-2017 12:00PM' ) ) ); $result = $praef->calculateNextDate( $result['due_date'] ); //15-Sep-2017 12:00PM $this->assertEquals( date( 'r', $result['start_date'] ), date( 'r', strtotime( '13-Sep-2017 12:00AM' ) ) ); $this->assertEquals( date( 'r', $result['end_date'] ), date( 'r', strtotime( '15-Sep-2017 11:59:59PM' ) ) ); $this->assertEquals( date( 'r', $result['due_date'] ), date( 'r', strtotime( '20-Sep-2017 12:00PM' ) ) ); $result = $praef->calculateNextDate( $result['due_date'] ); //20-Sep-2017 12:00PM $this->assertEquals( date( 'r', $result['start_date'] ), date( 'r', strtotime( '16-Sep-2017 12:00AM' ) ) ); $this->assertEquals( date( 'r', $result['end_date'] ), date( 'r', strtotime( '19-Sep-2017 11:59:59PM' ) ) ); $this->assertEquals( date( 'r', $result['due_date'] ), date( 'r', strtotime( '22-Sep-2017 12:00PM' ) ) ); // //Test spanning quarter/year. Should be broken down into two separate periods. // $result = $praef->calculateNextDate( strtotime( '30-Sep-2020 12:00PM' ) ); //30-Sep-2020 12:00PM $this->assertEquals( date( 'r', $result['start_date'] ), date( 'r', strtotime( '26-Sep-2020 12:00AM' ) ) ); $this->assertEquals( date( 'r', $result['end_date'] ), date( 'r', strtotime( '29-Sep-2020 11:59:59PM' ) ) ); $this->assertEquals( date( 'r', $result['due_date'] ), date( 'r', strtotime( '02-Oct-2020 12:00PM' ) ) ); $result = $praef->calculateNextDate( $result['due_date'] ); //30-Sep-2020 12:00PM $this->assertEquals( date( 'r', $result['start_date'] ), date( 'r', strtotime( '30-Sep-2020 12:00AM' ) ) ); $this->assertEquals( date( 'r', $result['end_date'] ), date( 'r', strtotime( '30-Sep-2020 11:59:59PM' ) ) ); $this->assertEquals( date( 'r', $result['due_date'] ), date( 'r', strtotime( '07-Oct-2020 11:59:00AM' ) ) ); //Since this is the 1st deposit for this period, due date is 60 second before noon. $result = $praef->calculateNextDate( $result['due_date'] ); //Due Date: 07-Oct-2020 11:59:59AM $this->assertEquals( date( 'r', $result['start_date'] ), date( 'r', strtotime( '01-Oct-2020 12:00AM' ) ) ); $this->assertEquals( date( 'r', $result['end_date'] ), date( 'r', strtotime( '02-Oct-2020 11:59:59PM' ) ) ); $this->assertEquals( date( 'r', $result['due_date'] ), date( 'r', strtotime( '07-Oct-2020 12:00PM' ) ) ); //This is the 2nd deposit for this period, so due date is right at noon. $result = $praef->calculateNextDate( $result['due_date'] ); //Due Date: 07-Oct-2020 12:00PM $this->assertEquals( date( 'r', $result['start_date'] ), date( 'r', strtotime( '03-Oct-2020 12:00AM' ) ) ); $this->assertEquals( date( 'r', $result['end_date'] ), date( 'r', strtotime( '06-Oct-2020 11:59:59PM' ) ) ); $this->assertEquals( date( 'r', $result['due_date'] ), date( 'r', strtotime( '09-Oct-2020 12:00PM' ) ) ); $result = $praef->calculateNextDate( strtotime( '27-Mar-2019 12:00PM' ) ); $this->assertEquals( date( 'r', $result['start_date'] ), date( 'r', strtotime( '23-Mar-2019 12:00AM' ) ) ); $this->assertEquals( date( 'r', $result['end_date'] ), date( 'r', strtotime( '26-Mar-2019 11:59:59PM' ) ) ); $this->assertEquals( date( 'r', $result['due_date'] ), date( 'r', strtotime( '29-Mar-2019 12:00PM' ) ) ); $result = $praef->calculateNextDate( $result['due_date'] ); //Due Date: 29-Mar-2019 12:00PM $this->assertEquals( date( 'r', $result['start_date'] ), date( 'r', strtotime( '27-Mar-2019 12:00AM' ) ) ); $this->assertEquals( date( 'r', $result['end_date'] ), date( 'r', strtotime( '29-Mar-2019 11:59:59PM' ) ) ); $this->assertEquals( date( 'r', $result['due_date'] ), date( 'r', strtotime( '03-Apr-2019 12:00PM' ) ) ); $result = $praef->calculateNextDate( $result['due_date'] ); //Due Date: 03-Apr-2019 12:00PM $this->assertEquals( date( 'r', $result['start_date'] ), date( 'r', strtotime( '30-Mar-2019 12:00AM' ) ) ); $this->assertEquals( date( 'r', $result['end_date'] ), date( 'r', strtotime( '31-Mar-2019 11:59:59PM' ) ) ); $this->assertEquals( date( 'r', $result['due_date'] ), date( 'r', strtotime( '05-Apr-2019 11:59:00AM' ) ) ); //Since this is the 1st deposit for this period, due date is 60 second before noon. $result = $praef->calculateNextDate( $result['due_date'] ); //Due Date: 05-Apr-2019 11:59:00AM $this->assertEquals( date( 'r', $result['start_date'] ), date( 'r', strtotime( '01-Apr-2019 12:00AM' ) ) ); $this->assertEquals( date( 'r', $result['end_date'] ), date( 'r', strtotime( '02-Apr-2019 11:59:59PM' ) ) ); $this->assertEquals( date( 'r', $result['due_date'] ), date( 'r', strtotime( '05-Apr-2019 12:00PM' ) ) ); //This is the 2nd deposit for this period, so due date is right at noon. $result = $praef->calculateNextDate( $result['due_date'] ); //Due Date: 05-Apr-2019 12:00PM $this->assertEquals( date( 'r', $result['start_date'] ), date( 'r', strtotime( '03-Apr-2019 12:00AM' ) ) ); $this->assertEquals( date( 'r', $result['end_date'] ), date( 'r', strtotime( '05-Apr-2019 11:59:59PM' ) ) ); $this->assertEquals( date( 'r', $result['due_date'] ), date( 'r', strtotime( '10-Apr-2019 12:00PM' ) ) ); //This is the 2nd deposit for this period, so due date is right at noon. $result = $praef->calculateNextDate( strtotime( '23-Dec-2020 12:00PM' ) ); $this->assertEquals( date( 'r', $result['start_date'] ), date( 'r', strtotime( '19-Dec-2020 12:00AM' ) ) ); $this->assertEquals( date( 'r', $result['end_date'] ), date( 'r', strtotime( '22-Dec-2020 11:59:59PM' ) ) ); $this->assertEquals( date( 'r', $result['due_date'] ), date( 'r', strtotime( '25-Dec-2020 12:00PM' ) ) ); $result = $praef->calculateNextDate( $result['due_date'] ); //Due Date: 25-Dec-2020 12:00PM $this->assertEquals( date( 'r', $result['start_date'] ), date( 'r', strtotime( '23-Dec-2020 12:00AM' ) ) ); $this->assertEquals( date( 'r', $result['end_date'] ), date( 'r', strtotime( '25-Dec-2020 11:59:59PM' ) ) ); $this->assertEquals( date( 'r', $result['due_date'] ), date( 'r', strtotime( '30-Dec-2020 12:00PM' ) ) ); $result = $praef->calculateNextDate( $result['due_date'] ); //Due Date: 30-Dec-2020 12:00PM $this->assertEquals( date( 'r', $result['start_date'] ), date( 'r', strtotime( '26-Dec-2020 12:00AM' ) ) ); $this->assertEquals( date( 'r', $result['end_date'] ), date( 'r', strtotime( '29-Dec-2020 11:59:59PM' ) ) ); $this->assertEquals( date( 'r', $result['due_date'] ), date( 'r', strtotime( '01-Jan-2021 12:00PM' ) ) ); $result = $praef->calculateNextDate( $result['due_date'] ); //Due Date: 01-Jan-2021 12:00PM $this->assertEquals( date( 'r', $result['start_date'] ), date( 'r', strtotime( '30-Dec-2020 12:00AM' ) ) ); $this->assertEquals( date( 'r', $result['end_date'] ), date( 'r', strtotime( '31-Dec-2020 11:59:59PM' ) ) ); $this->assertEquals( date( 'r', $result['due_date'] ), date( 'r', strtotime( '06-Jan-2021 11:59AM' ) ) ); //Since this is the 1st deposit for this period, due date is 60 second before noon. $result = $praef->calculateNextDate( $result['due_date'] ); //Due Date: 06-Jan-2021 11:59PM $this->assertEquals( date( 'r', $result['start_date'] ), date( 'r', strtotime( '01-Jan-2021 12:00AM' ) ) ); $this->assertEquals( date( 'r', $result['end_date'] ), date( 'r', strtotime( '01-Jan-2021 11:59:59PM' ) ) ); $this->assertEquals( date( 'r', $result['due_date'] ), date( 'r', strtotime( '06-Jan-2021 12:00PM' ) ) ); //This is the 2nd deposit for this period, so due date is right at noon. $result = $praef->calculateNextDate( $result['due_date'] ); //Due Date: 06-Jan-2021 12:00PM $this->assertEquals( date( 'r', $result['start_date'] ), date( 'r', strtotime( '02-Jan-2021 12:00AM' ) ) ); $this->assertEquals( date( 'r', $result['end_date'] ), date( 'r', strtotime( '05-Jan-2021 11:59:59PM' ) ) ); $this->assertEquals( date( 'r', $result['due_date'] ), date( 'r', strtotime( '08-Jan-2021 12:00PM' ) ) ); } /** * @group PayrollRemittanceAgencyEvent_testAcceleratedThreshold1 */ function testAcceleratedThreshold1() { // 10th and 25th of each month. If transaction date falls between 1-15th of the month, pay by 25th. If it falls between 16th and last day, pay on the 10th of the next month. $praef = TTnew( 'PayrollRemittanceAgencyEventFactory' ); /** @var PayrollRemittanceAgencyEventFactory $praef */ $praef->setPayrollRemittanceAgencyId( $this->agency_id ); $praef->setFrequency( 50000 ); $praef->setEffectiveDate( strtotime( '01-Jul-2017' ) ); //tets consecutive days (like cron) $result = $praef->calculateNextDate( strtotime( '01-Jul-2017 12:00PM' ) ); $this->assertEquals( date( 'r', $result['start_date'] ), date( 'r', strtotime( '01-Jul-2017 12:00AM' ) ) ); $this->assertEquals( date( 'r', $result['end_date'] ), date( 'r', strtotime( '15-Jul-2017 11:59:59PM' ) ) ); $this->assertEquals( date( 'r', $result['due_date'] ), date( 'r', strtotime( '25-Jul-2017 12:00PM' ) ) ); $result = $praef->calculateNextDate( strtotime( '02-Jul-2017 12:00PM' ) ); $this->assertEquals( date( 'r', $result['start_date'] ), date( 'r', strtotime( '01-Jul-2017 12:00AM' ) ) ); $this->assertEquals( date( 'r', $result['end_date'] ), date( 'r', strtotime( '15-Jul-2017 11:59:59PM' ) ) ); $this->assertEquals( date( 'r', $result['due_date'] ), date( 'r', strtotime( '25-Jul-2017 12:00PM' ) ) ); $result = $praef->calculateNextDate( strtotime( '03-Jul-2017 12:00PM' ) ); $this->assertEquals( date( 'r', $result['start_date'] ), date( 'r', strtotime( '01-Jul-2017 12:00AM' ) ) ); $this->assertEquals( date( 'r', $result['end_date'] ), date( 'r', strtotime( '15-Jul-2017 11:59:59PM' ) ) ); $this->assertEquals( date( 'r', $result['due_date'] ), date( 'r', strtotime( '25-Jul-2017 12:00PM' ) ) ); $result = $praef->calculateNextDate( strtotime( '04-Jul-2017 12:00PM' ) ); $this->assertEquals( date( 'r', $result['start_date'] ), date( 'r', strtotime( '01-Jul-2017 12:00AM' ) ) ); $this->assertEquals( date( 'r', $result['end_date'] ), date( 'r', strtotime( '15-Jul-2017 11:59:59PM' ) ) ); $this->assertEquals( date( 'r', $result['due_date'] ), date( 'r', strtotime( '25-Jul-2017 12:00PM' ) ) ); $result = $praef->calculateNextDate( strtotime( '13-Jul-2017 12:00PM' ) ); $this->assertEquals( date( 'r', $result['start_date'] ), date( 'r', strtotime( '01-Jul-2017 12:00AM' ) ) ); $this->assertEquals( date( 'r', $result['end_date'] ), date( 'r', strtotime( '15-Jul-2017 11:59:59PM' ) ) ); $this->assertEquals( date( 'r', $result['due_date'] ), date( 'r', strtotime( '25-Jul-2017 12:00PM' ) ) ); $result = $praef->calculateNextDate( strtotime( '14-Jul-2017 12:00PM' ) ); $this->assertEquals( date( 'r', $result['start_date'] ), date( 'r', strtotime( '01-Jul-2017 12:00AM' ) ) ); $this->assertEquals( date( 'r', $result['end_date'] ), date( 'r', strtotime( '15-Jul-2017 11:59:59PM' ) ) ); $this->assertEquals( date( 'r', $result['due_date'] ), date( 'r', strtotime( '25-Jul-2017 12:00PM' ) ) ); $result = $praef->calculateNextDate( strtotime( '15-Jul-2017 12:00PM' ) ); $this->assertEquals( date( 'r', $result['start_date'] ), date( 'r', strtotime( '01-Jul-2017 12:00AM' ) ) ); $this->assertEquals( date( 'r', $result['end_date'] ), date( 'r', strtotime( '15-Jul-2017 11:59:59PM' ) ) ); $this->assertEquals( date( 'r', $result['due_date'] ), date( 'r', strtotime( '25-Jul-2017 12:00PM' ) ) ); $result = $praef->calculateNextDate( strtotime( '16-Jul-2017 12:00PM' ) ); $this->assertEquals( date( 'r', $result['start_date'] ), date( 'r', strtotime( '16-Jul-2017 12:00AM' ) ) ); $this->assertEquals( date( 'r', $result['end_date'] ), date( 'r', strtotime( '31-Jul-2017 11:59:59PM' ) ) ); $this->assertEquals( date( 'r', $result['due_date'] ), date( 'r', strtotime( '10-Aug-2017 12:00PM' ) ) ); $result = $praef->calculateNextDate( strtotime( '17-Jul-2017 12:00PM' ) ); $this->assertEquals( date( 'r', $result['start_date'] ), date( 'r', strtotime( '16-Jul-2017 12:00AM' ) ) ); $this->assertEquals( date( 'r', $result['end_date'] ), date( 'r', strtotime( '31-Jul-2017 11:59:59PM' ) ) ); $this->assertEquals( date( 'r', $result['due_date'] ), date( 'r', strtotime( '10-Aug-2017 12:00PM' ) ) ); $result = $praef->calculateNextDate( strtotime( '18-Jul-2017 12:00PM' ) ); $this->assertEquals( date( 'r', $result['start_date'] ), date( 'r', strtotime( '16-Jul-2017 12:00AM' ) ) ); $this->assertEquals( date( 'r', $result['end_date'] ), date( 'r', strtotime( '31-Jul-2017 11:59:59PM' ) ) ); $this->assertEquals( date( 'r', $result['due_date'] ), date( 'r', strtotime( '10-Aug-2017 12:00PM' ) ) ); $result = $praef->calculateNextDate( strtotime( '19-Jul-2017 12:00PM' ) ); $this->assertEquals( date( 'r', $result['start_date'] ), date( 'r', strtotime( '16-Jul-2017 12:00AM' ) ) ); $this->assertEquals( date( 'r', $result['end_date'] ), date( 'r', strtotime( '31-Jul-2017 11:59:59PM' ) ) ); $this->assertEquals( date( 'r', $result['due_date'] ), date( 'r', strtotime( '10-Aug-2017 12:00PM' ) ) ); $result = $praef->calculateNextDate( strtotime( '30-Jul-2017 12:00PM' ) ); $this->assertEquals( date( 'r', $result['start_date'] ), date( 'r', strtotime( '16-Jul-2017 12:00AM' ) ) ); $this->assertEquals( date( 'r', $result['end_date'] ), date( 'r', strtotime( '31-Jul-2017 11:59:59PM' ) ) ); $this->assertEquals( date( 'r', $result['due_date'] ), date( 'r', strtotime( '10-Aug-2017 12:00PM' ) ) ); $result = $praef->calculateNextDate( strtotime( '31-Jul-2017 12:00PM' ) ); $this->assertEquals( date( 'r', $result['start_date'] ), date( 'r', strtotime( '16-Jul-2017 12:00AM' ) ) ); $this->assertEquals( date( 'r', $result['end_date'] ), date( 'r', strtotime( '31-Jul-2017 11:59:59PM' ) ) ); $this->assertEquals( date( 'r', $result['due_date'] ), date( 'r', strtotime( '10-Aug-2017 12:00PM' ) ) ); //chained test(like wizard) $result = $praef->calculateNextDate( $result['due_date'] ); //10-Aug-2017 12:00PM $this->assertEquals( date( 'r', $result['start_date'] ), date( 'r', strtotime( '01-Aug-2017 12:00AM' ) ) ); $this->assertEquals( date( 'r', $result['end_date'] ), date( 'r', strtotime( '15-Aug-2017 11:59:59PM' ) ) ); $this->assertEquals( date( 'r', $result['due_date'] ), date( 'r', strtotime( '25-Aug-2017 12:00PM' ) ) ); $result = $praef->calculateNextDate( $result['due_date'] ); //25-Aug-2017 12:00PM $this->assertEquals( date( 'r', $result['start_date'] ), date( 'r', strtotime( '16-Aug-2017 12:00AM' ) ) ); $this->assertEquals( date( 'r', $result['end_date'] ), date( 'r', strtotime( '31-Aug-2017 11:59:59PM' ) ) ); $this->assertEquals( date( 'r', $result['due_date'] ), date( 'r', strtotime( '10-Sep-2017 12:00PM' ) ) ); $result = $praef->calculateNextDate( $result['due_date'] ); //10-Sep-2017 12:00PM $this->assertEquals( date( 'r', $result['start_date'] ), date( 'r', strtotime( '01-Sep-2017 12:00AM' ) ) ); $this->assertEquals( date( 'r', $result['end_date'] ), date( 'r', strtotime( '15-Sep-2017 11:59:59PM' ) ) ); $this->assertEquals( date( 'r', $result['due_date'] ), date( 'r', strtotime( '25-Sep-2017 12:00PM' ) ) ); $result = $praef->calculateNextDate( $result['due_date'] ); //25-Sep-2017 12:00PM $this->assertEquals( date( 'r', $result['start_date'] ), date( 'r', strtotime( '16-Sep-2017 12:00AM' ) ) ); $this->assertEquals( date( 'r', $result['end_date'] ), date( 'r', strtotime( '30-Sep-2017 11:59:59PM' ) ) ); $this->assertEquals( date( 'r', $result['due_date'] ), date( 'r', strtotime( '10-Oct-2017 12:00PM' ) ) ); $result = $praef->calculateNextDate( $result['due_date'] ); //10-Oct-2017 12:00PM $this->assertEquals( date( 'r', $result['start_date'] ), date( 'r', strtotime( '01-Oct-2017 12:00AM' ) ) ); $this->assertEquals( date( 'r', $result['end_date'] ), date( 'r', strtotime( '15-Oct-2017 11:59:59PM' ) ) ); $this->assertEquals( date( 'r', $result['due_date'] ), date( 'r', strtotime( '25-Oct-2017 12:00PM' ) ) ); $result = $praef->calculateNextDate( $result['due_date'] ); //25-Oct-2017 12:00PM $this->assertEquals( date( 'r', $result['start_date'] ), date( 'r', strtotime( '16-Oct-2017 12:00AM' ) ) ); $this->assertEquals( date( 'r', $result['end_date'] ), date( 'r', strtotime( '31-Oct-2017 11:59:59PM' ) ) ); $this->assertEquals( date( 'r', $result['due_date'] ), date( 'r', strtotime( '10-Nov-2017 12:00PM' ) ) ); $result = $praef->calculateNextDate( $result['due_date'] ); //10-Nov-2017 12:00PM $this->assertEquals( date( 'r', $result['start_date'] ), date( 'r', strtotime( '01-Nov-2017 12:00AM' ) ) ); $this->assertEquals( date( 'r', $result['end_date'] ), date( 'r', strtotime( '15-Nov-2017 11:59:59PM' ) ) ); $this->assertEquals( date( 'r', $result['due_date'] ), date( 'r', strtotime( '25-Nov-2017 12:00PM' ) ) ); $result = $praef->calculateNextDate( $result['due_date'] ); //10-Nov-2017 12:00PM $this->assertEquals( date( 'r', $result['start_date'] ), date( 'r', strtotime( '16-Nov-2017 12:00AM' ) ) ); $this->assertEquals( date( 'r', $result['end_date'] ), date( 'r', strtotime( '30-Nov-2017 11:59:59PM' ) ) ); $this->assertEquals( date( 'r', $result['due_date'] ), date( 'r', strtotime( '10-Dec-2017 12:00PM' ) ) ); } /** * @group PayrollRemittanceAgencyEvent_testAcceleratedThreshold2A */ function testAcceleratedThreshold2A() { $praef = TTnew( 'PayrollRemittanceAgencyEventFactory' ); /** @var PayrollRemittanceAgencyEventFactory $praef */ $praef->setPayrollRemittanceAgencyId( $this->agency_id ); $praef->setFrequency( 51000 ); $praef->setEffectiveDate( strtotime( '01-Jul-2017' ) ); $result = $praef->calculateNextDate( strtotime( '01-Jul-2017 12:00PM' ) ); $this->assertEquals( date( 'r', $result['start_date'] ), date( 'r', strtotime( '01-Jul-2017 12:00AM' ) ) ); $this->assertEquals( date( 'r', $result['end_date'] ), date( 'r', strtotime( '07-Jul-2017 11:59:59PM' ) ) ); $this->assertEquals( date( 'r', $result['due_date'] ), date( 'r', strtotime( '12-Jul-2017 12:00PM' ) ) ); $result = $praef->calculateNextDate( strtotime( '22-Dec-2017 12:00PM' ) ); $this->assertEquals( date( 'r', $result['start_date'] ), date( 'r', strtotime( '22-Dec-2017 12:00AM' ) ) ); $this->assertEquals( date( 'r', $result['end_date'] ), date( 'r', strtotime( '31-Dec-2017 11:59:59PM' ) ) ); $this->assertEquals( date( 'r', $result['due_date'] ), date( 'r', strtotime( '03-Jan-2018 12:00PM' ) ) ); $result = $praef->calculateNextDate( strtotime( '01-Jan-2021 12:00PM' ) ); $this->assertEquals( date( 'r', $result['start_date'] ), date( 'r', strtotime( '01-Jan-2021 12:00AM' ) ) ); $this->assertEquals( date( 'r', $result['end_date'] ), date( 'r', strtotime( '07-Jan-2021 11:59:59PM' ) ) ); $this->assertEquals( date( 'r', $result['due_date'] ), date( 'r', strtotime( '12-Jan-2021 12:00PM' ) ) ); $result = $praef->calculateNextDate( strtotime( '02-Jan-2021 12:00PM' ) ); $this->assertEquals( date( 'r', $result['start_date'] ), date( 'r', strtotime( '01-Jan-2021 12:00AM' ) ) ); $this->assertEquals( date( 'r', $result['end_date'] ), date( 'r', strtotime( '07-Jan-2021 11:59:59PM' ) ) ); $this->assertEquals( date( 'r', $result['due_date'] ), date( 'r', strtotime( '12-Jan-2021 12:00PM' ) ) ); $result = $praef->calculateNextDate( strtotime( '03-Jan-2021 12:00PM' ) ); $this->assertEquals( date( 'r', $result['start_date'] ), date( 'r', strtotime( '01-Jan-2021 12:00AM' ) ) ); $this->assertEquals( date( 'r', $result['end_date'] ), date( 'r', strtotime( '07-Jan-2021 11:59:59PM' ) ) ); $this->assertEquals( date( 'r', $result['due_date'] ), date( 'r', strtotime( '12-Jan-2021 12:00PM' ) ) ); $result = $praef->calculateNextDate( strtotime( '04-Jan-2021 12:00PM' ) ); $this->assertEquals( date( 'r', $result['start_date'] ), date( 'r', strtotime( '01-Jan-2021 12:00AM' ) ) ); $this->assertEquals( date( 'r', $result['end_date'] ), date( 'r', strtotime( '07-Jan-2021 11:59:59PM' ) ) ); $this->assertEquals( date( 'r', $result['due_date'] ), date( 'r', strtotime( '12-Jan-2021 12:00PM' ) ) ); $result = $praef->calculateNextDate( strtotime( '05-Jan-2021 12:00PM' ) ); $this->assertEquals( date( 'r', $result['start_date'] ), date( 'r', strtotime( '01-Jan-2021 12:00AM' ) ) ); $this->assertEquals( date( 'r', $result['end_date'] ), date( 'r', strtotime( '07-Jan-2021 11:59:59PM' ) ) ); $this->assertEquals( date( 'r', $result['due_date'] ), date( 'r', strtotime( '12-Jan-2021 12:00PM' ) ) ); $result = $praef->calculateNextDate( strtotime( '06-Jan-2021 12:00PM' ) ); $this->assertEquals( date( 'r', $result['start_date'] ), date( 'r', strtotime( '01-Jan-2021 12:00AM' ) ) ); $this->assertEquals( date( 'r', $result['end_date'] ), date( 'r', strtotime( '07-Jan-2021 11:59:59PM' ) ) ); $this->assertEquals( date( 'r', $result['due_date'] ), date( 'r', strtotime( '12-Jan-2021 12:00PM' ) ) ); $result = $praef->calculateNextDate( strtotime( '07-Jan-2021 12:00PM' ) ); $this->assertEquals( date( 'r', $result['start_date'] ), date( 'r', strtotime( '01-Jan-2021 12:00AM' ) ) ); $this->assertEquals( date( 'r', $result['end_date'] ), date( 'r', strtotime( '07-Jan-2021 11:59:59PM' ) ) ); $this->assertEquals( date( 'r', $result['due_date'] ), date( 'r', strtotime( '12-Jan-2021 12:00PM' ) ) ); $result = $praef->calculateNextDate( strtotime( '08-Jan-2021 12:00PM' ) ); $this->assertEquals( date( 'r', $result['start_date'] ), date( 'r', strtotime( '08-Jan-2021 12:00AM' ) ) ); $this->assertEquals( date( 'r', $result['end_date'] ), date( 'r', strtotime( '14-Jan-2021 11:59:59PM' ) ) ); $this->assertEquals( date( 'r', $result['due_date'] ), date( 'r', strtotime( '19-Jan-2021 12:00PM' ) ) ); $result = $praef->calculateNextDate( strtotime( '09-Jan-2021 12:00PM' ) ); $this->assertEquals( date( 'r', $result['start_date'] ), date( 'r', strtotime( '08-Jan-2021 12:00AM' ) ) ); $this->assertEquals( date( 'r', $result['end_date'] ), date( 'r', strtotime( '14-Jan-2021 11:59:59PM' ) ) ); $this->assertEquals( date( 'r', $result['due_date'] ), date( 'r', strtotime( '19-Jan-2021 12:00PM' ) ) ); $result = $praef->calculateNextDate( strtotime( '10-Jan-2021 12:00PM' ) ); $this->assertEquals( date( 'r', $result['start_date'] ), date( 'r', strtotime( '08-Jan-2021 12:00AM' ) ) ); $this->assertEquals( date( 'r', $result['end_date'] ), date( 'r', strtotime( '14-Jan-2021 11:59:59PM' ) ) ); $this->assertEquals( date( 'r', $result['due_date'] ), date( 'r', strtotime( '19-Jan-2021 12:00PM' ) ) ); $result = $praef->calculateNextDate( strtotime( '11-Jan-2021 12:00PM' ) ); $this->assertEquals( date( 'r', $result['start_date'] ), date( 'r', strtotime( '08-Jan-2021 12:00AM' ) ) ); $this->assertEquals( date( 'r', $result['end_date'] ), date( 'r', strtotime( '14-Jan-2021 11:59:59PM' ) ) ); $this->assertEquals( date( 'r', $result['due_date'] ), date( 'r', strtotime( '19-Jan-2021 12:00PM' ) ) ); $result = $praef->calculateNextDate( strtotime( '12-Jan-2021 12:00PM' ) ); $this->assertEquals( date( 'r', $result['start_date'] ), date( 'r', strtotime( '08-Jan-2021 12:00AM' ) ) ); $this->assertEquals( date( 'r', $result['end_date'] ), date( 'r', strtotime( '14-Jan-2021 11:59:59PM' ) ) ); $this->assertEquals( date( 'r', $result['due_date'] ), date( 'r', strtotime( '19-Jan-2021 12:00PM' ) ) ); $result = $praef->calculateNextDate( strtotime( '13-Jan-2021 12:00PM' ) ); $this->assertEquals( date( 'r', $result['start_date'] ), date( 'r', strtotime( '08-Jan-2021 12:00AM' ) ) ); $this->assertEquals( date( 'r', $result['end_date'] ), date( 'r', strtotime( '14-Jan-2021 11:59:59PM' ) ) ); $this->assertEquals( date( 'r', $result['due_date'] ), date( 'r', strtotime( '19-Jan-2021 12:00PM' ) ) ); $result = $praef->calculateNextDate( strtotime( '14-Jan-2021 12:00PM' ) ); $this->assertEquals( date( 'r', $result['start_date'] ), date( 'r', strtotime( '08-Jan-2021 12:00AM' ) ) ); $this->assertEquals( date( 'r', $result['end_date'] ), date( 'r', strtotime( '14-Jan-2021 11:59:59PM' ) ) ); $this->assertEquals( date( 'r', $result['due_date'] ), date( 'r', strtotime( '19-Jan-2021 12:00PM' ) ) ); $result = $praef->calculateNextDate( strtotime( '15-Jan-2021 12:00PM' ) ); $this->assertEquals( date( 'r', $result['start_date'] ), date( 'r', strtotime( '15-Jan-2021 12:00AM' ) ) ); $this->assertEquals( date( 'r', $result['end_date'] ), date( 'r', strtotime( '21-Jan-2021 11:59:59PM' ) ) ); $this->assertEquals( date( 'r', $result['due_date'] ), date( 'r', strtotime( '26-Jan-2021 12:00PM' ) ) ); $result = $praef->calculateNextDate( strtotime( '16-Jan-2021 12:00PM' ) ); $this->assertEquals( date( 'r', $result['start_date'] ), date( 'r', strtotime( '15-Jan-2021 12:00AM' ) ) ); $this->assertEquals( date( 'r', $result['end_date'] ), date( 'r', strtotime( '21-Jan-2021 11:59:59PM' ) ) ); $this->assertEquals( date( 'r', $result['due_date'] ), date( 'r', strtotime( '26-Jan-2021 12:00PM' ) ) ); $result = $praef->calculateNextDate( strtotime( '17-Jan-2021 12:00PM' ) ); $this->assertEquals( date( 'r', $result['start_date'] ), date( 'r', strtotime( '15-Jan-2021 12:00AM' ) ) ); $this->assertEquals( date( 'r', $result['end_date'] ), date( 'r', strtotime( '21-Jan-2021 11:59:59PM' ) ) ); $this->assertEquals( date( 'r', $result['due_date'] ), date( 'r', strtotime( '26-Jan-2021 12:00PM' ) ) ); $result = $praef->calculateNextDate( strtotime( '18-Jan-2021 12:00PM' ) ); $this->assertEquals( date( 'r', $result['start_date'] ), date( 'r', strtotime( '15-Jan-2021 12:00AM' ) ) ); $this->assertEquals( date( 'r', $result['end_date'] ), date( 'r', strtotime( '21-Jan-2021 11:59:59PM' ) ) ); $this->assertEquals( date( 'r', $result['due_date'] ), date( 'r', strtotime( '26-Jan-2021 12:00PM' ) ) ); $result = $praef->calculateNextDate( strtotime( '19-Jan-2021 12:00PM' ) ); $this->assertEquals( date( 'r', $result['start_date'] ), date( 'r', strtotime( '15-Jan-2021 12:00AM' ) ) ); $this->assertEquals( date( 'r', $result['end_date'] ), date( 'r', strtotime( '21-Jan-2021 11:59:59PM' ) ) ); $this->assertEquals( date( 'r', $result['due_date'] ), date( 'r', strtotime( '26-Jan-2021 12:00PM' ) ) ); $result = $praef->calculateNextDate( strtotime( '20-Jan-2021 12:00PM' ) ); $this->assertEquals( date( 'r', $result['start_date'] ), date( 'r', strtotime( '15-Jan-2021 12:00AM' ) ) ); $this->assertEquals( date( 'r', $result['end_date'] ), date( 'r', strtotime( '21-Jan-2021 11:59:59PM' ) ) ); $this->assertEquals( date( 'r', $result['due_date'] ), date( 'r', strtotime( '26-Jan-2021 12:00PM' ) ) ); $result = $praef->calculateNextDate( strtotime( '21-Jan-2021 12:00PM' ) ); $this->assertEquals( date( 'r', $result['start_date'] ), date( 'r', strtotime( '15-Jan-2021 12:00AM' ) ) ); $this->assertEquals( date( 'r', $result['end_date'] ), date( 'r', strtotime( '21-Jan-2021 11:59:59PM' ) ) ); $this->assertEquals( date( 'r', $result['due_date'] ), date( 'r', strtotime( '26-Jan-2021 12:00PM' ) ) ); $result = $praef->calculateNextDate( strtotime( '22-Jan-2021 12:00PM' ) ); $this->assertEquals( date( 'r', $result['start_date'] ), date( 'r', strtotime( '22-Jan-2021 12:00AM' ) ) ); $this->assertEquals( date( 'r', $result['end_date'] ), date( 'r', strtotime( '31-Jan-2021 11:59:59PM' ) ) ); $this->assertEquals( date( 'r', $result['due_date'] ), date( 'r', strtotime( '03-Feb-2021 12:00PM' ) ) ); $result = $praef->calculateNextDate( strtotime( '23-Jan-2021 12:00PM' ) ); $this->assertEquals( date( 'r', $result['start_date'] ), date( 'r', strtotime( '22-Jan-2021 12:00AM' ) ) ); $this->assertEquals( date( 'r', $result['end_date'] ), date( 'r', strtotime( '31-Jan-2021 11:59:59PM' ) ) ); $this->assertEquals( date( 'r', $result['due_date'] ), date( 'r', strtotime( '03-Feb-2021 12:00PM' ) ) ); $result = $praef->calculateNextDate( strtotime( '24-Jan-2021 12:00PM' ) ); $this->assertEquals( date( 'r', $result['start_date'] ), date( 'r', strtotime( '22-Jan-2021 12:00AM' ) ) ); $this->assertEquals( date( 'r', $result['end_date'] ), date( 'r', strtotime( '31-Jan-2021 11:59:59PM' ) ) ); $this->assertEquals( date( 'r', $result['due_date'] ), date( 'r', strtotime( '03-Feb-2021 12:00PM' ) ) ); $result = $praef->calculateNextDate( strtotime( '25-Jan-2021 12:00PM' ) ); $this->assertEquals( date( 'r', $result['start_date'] ), date( 'r', strtotime( '22-Jan-2021 12:00AM' ) ) ); $this->assertEquals( date( 'r', $result['end_date'] ), date( 'r', strtotime( '31-Jan-2021 11:59:59PM' ) ) ); $this->assertEquals( date( 'r', $result['due_date'] ), date( 'r', strtotime( '03-Feb-2021 12:00PM' ) ) ); $result = $praef->calculateNextDate( strtotime( '26-Jan-2021 12:00PM' ) ); $this->assertEquals( date( 'r', $result['start_date'] ), date( 'r', strtotime( '22-Jan-2021 12:00AM' ) ) ); $this->assertEquals( date( 'r', $result['end_date'] ), date( 'r', strtotime( '31-Jan-2021 11:59:59PM' ) ) ); $this->assertEquals( date( 'r', $result['due_date'] ), date( 'r', strtotime( '03-Feb-2021 12:00PM' ) ) ); $result = $praef->calculateNextDate( strtotime( '27-Jan-2021 12:00PM' ) ); $this->assertEquals( date( 'r', $result['start_date'] ), date( 'r', strtotime( '22-Jan-2021 12:00AM' ) ) ); $this->assertEquals( date( 'r', $result['end_date'] ), date( 'r', strtotime( '31-Jan-2021 11:59:59PM' ) ) ); $this->assertEquals( date( 'r', $result['due_date'] ), date( 'r', strtotime( '03-Feb-2021 12:00PM' ) ) ); $result = $praef->calculateNextDate( strtotime( '28-Jan-2021 12:00PM' ) ); $this->assertEquals( date( 'r', $result['start_date'] ), date( 'r', strtotime( '22-Jan-2021 12:00AM' ) ) ); $this->assertEquals( date( 'r', $result['end_date'] ), date( 'r', strtotime( '31-Jan-2021 11:59:59PM' ) ) ); $this->assertEquals( date( 'r', $result['due_date'] ), date( 'r', strtotime( '03-Feb-2021 12:00PM' ) ) ); $result = $praef->calculateNextDate( strtotime( '29-Jan-2021 12:00PM' ) ); $this->assertEquals( date( 'r', $result['start_date'] ), date( 'r', strtotime( '22-Jan-2021 12:00AM' ) ) ); $this->assertEquals( date( 'r', $result['end_date'] ), date( 'r', strtotime( '31-Jan-2021 11:59:59PM' ) ) ); $this->assertEquals( date( 'r', $result['due_date'] ), date( 'r', strtotime( '03-Feb-2021 12:00PM' ) ) ); $result = $praef->calculateNextDate( strtotime( '30-Jan-2021 12:00PM' ) ); $this->assertEquals( date( 'r', $result['start_date'] ), date( 'r', strtotime( '22-Jan-2021 12:00AM' ) ) ); $this->assertEquals( date( 'r', $result['end_date'] ), date( 'r', strtotime( '31-Jan-2021 11:59:59PM' ) ) ); $this->assertEquals( date( 'r', $result['due_date'] ), date( 'r', strtotime( '03-Feb-2021 12:00PM' ) ) ); $result = $praef->calculateNextDate( strtotime( '31-Jan-2021 12:00PM' ) ); $this->assertEquals( date( 'r', $result['start_date'] ), date( 'r', strtotime( '22-Jan-2021 12:00AM' ) ) ); $this->assertEquals( date( 'r', $result['end_date'] ), date( 'r', strtotime( '31-Jan-2021 11:59:59PM' ) ) ); $this->assertEquals( date( 'r', $result['due_date'] ), date( 'r', strtotime( '03-Feb-2021 12:00PM' ) ) ); $result = $praef->calculateNextDate( strtotime( '01-Feb-2021 12:00PM' ) ); $this->assertEquals( date( 'r', $result['start_date'] ), date( 'r', strtotime( '01-Feb-2021 12:00AM' ) ) ); $this->assertEquals( date( 'r', $result['end_date'] ), date( 'r', strtotime( '07-Feb-2021 11:59:59PM' ) ) ); $this->assertEquals( date( 'r', $result['due_date'] ), date( 'r', strtotime( '10-Feb-2021 12:00PM' ) ) ); $result = $praef->calculateNextDate( strtotime( '07-Feb-2021 12:00PM' ) ); $this->assertEquals( date( 'r', $result['start_date'] ), date( 'r', strtotime( '01-Feb-2021 12:00AM' ) ) ); $this->assertEquals( date( 'r', $result['end_date'] ), date( 'r', strtotime( '07-Feb-2021 11:59:59PM' ) ) ); $this->assertEquals( date( 'r', $result['due_date'] ), date( 'r', strtotime( '10-Feb-2021 12:00PM' ) ) ); $result = $praef->calculateNextDate( strtotime( '08-Feb-2021 12:00PM' ) ); $this->assertEquals( date( 'r', $result['start_date'] ), date( 'r', strtotime( '08-Feb-2021 12:00AM' ) ) ); $this->assertEquals( date( 'r', $result['end_date'] ), date( 'r', strtotime( '14-Feb-2021 11:59:59PM' ) ) ); $this->assertEquals( date( 'r', $result['due_date'] ), date( 'r', strtotime( '17-Feb-2021 12:00PM' ) ) ); $result = $praef->calculateNextDate( strtotime( '14-Feb-2021 12:00PM' ) ); $this->assertEquals( date( 'r', $result['start_date'] ), date( 'r', strtotime( '08-Feb-2021 12:00AM' ) ) ); $this->assertEquals( date( 'r', $result['end_date'] ), date( 'r', strtotime( '14-Feb-2021 11:59:59PM' ) ) ); $this->assertEquals( date( 'r', $result['due_date'] ), date( 'r', strtotime( '17-Feb-2021 12:00PM' ) ) ); $result = $praef->calculateNextDate( strtotime( '15-Feb-2021 12:00PM' ) ); $this->assertEquals( date( 'r', $result['start_date'] ), date( 'r', strtotime( '15-Feb-2021 12:00AM' ) ) ); $this->assertEquals( date( 'r', $result['end_date'] ), date( 'r', strtotime( '21-Feb-2021 11:59:59PM' ) ) ); $this->assertEquals( date( 'r', $result['due_date'] ), date( 'r', strtotime( '24-Feb-2021 12:00PM' ) ) ); $result = $praef->calculateNextDate( strtotime( '21-Feb-2021 12:00PM' ) ); $this->assertEquals( date( 'r', $result['start_date'] ), date( 'r', strtotime( '15-Feb-2021 12:00AM' ) ) ); $this->assertEquals( date( 'r', $result['end_date'] ), date( 'r', strtotime( '21-Feb-2021 11:59:59PM' ) ) ); $this->assertEquals( date( 'r', $result['due_date'] ), date( 'r', strtotime( '24-Feb-2021 12:00PM' ) ) ); $result = $praef->calculateNextDate( strtotime( '22-Feb-2021 12:00PM' ) ); $this->assertEquals( date( 'r', $result['start_date'] ), date( 'r', strtotime( '22-Feb-2021 12:00AM' ) ) ); $this->assertEquals( date( 'r', $result['end_date'] ), date( 'r', strtotime( '28-Feb-2021 11:59:59PM' ) ) ); $this->assertEquals( date( 'r', $result['due_date'] ), date( 'r', strtotime( '03-Mar-2021 12:00PM' ) ) ); $result = $praef->calculateNextDate( strtotime( '28-Feb-2021 12:00PM' ) ); $this->assertEquals( date( 'r', $result['start_date'] ), date( 'r', strtotime( '22-Feb-2021 12:00AM' ) ) ); $this->assertEquals( date( 'r', $result['end_date'] ), date( 'r', strtotime( '28-Feb-2021 11:59:59PM' ) ) ); $this->assertEquals( date( 'r', $result['due_date'] ), date( 'r', strtotime( '03-Mar-2021 12:00PM' ) ) ); //consecutive days (like cron) $result = $praef->calculateNextDate( strtotime( '05-Jul-2017 12:00PM' ) ); $this->assertEquals( date( 'r', $result['start_date'] ), date( 'r', strtotime( '01-Jul-2017 12:00AM' ) ) ); $this->assertEquals( date( 'r', $result['end_date'] ), date( 'r', strtotime( '07-Jul-2017 11:59:59PM' ) ) ); $this->assertEquals( date( 'r', $result['due_date'] ), date( 'r', strtotime( '12-Jul-2017 12:00PM' ) ) ); $result = $praef->calculateNextDate( strtotime( '06-Jul-2017 12:00PM' ) ); $this->assertEquals( date( 'r', $result['start_date'] ), date( 'r', strtotime( '01-Jul-2017 12:00AM' ) ) ); $this->assertEquals( date( 'r', $result['end_date'] ), date( 'r', strtotime( '07-Jul-2017 11:59:59PM' ) ) ); $this->assertEquals( date( 'r', $result['due_date'] ), date( 'r', strtotime( '12-Jul-2017 12:00PM' ) ) ); $result = $praef->calculateNextDate( strtotime( '07-Jul-2017 12:00PM' ) ); $this->assertEquals( date( 'r', $result['start_date'] ), date( 'r', strtotime( '01-Jul-2017 12:00AM' ) ) ); $this->assertEquals( date( 'r', $result['end_date'] ), date( 'r', strtotime( '07-Jul-2017 11:59:59PM' ) ) ); $this->assertEquals( date( 'r', $result['due_date'] ), date( 'r', strtotime( '12-Jul-2017 12:00PM' ) ) ); //chained tests (like wizard) $result = $praef->calculateNextDate( $result['due_date'] ); //10-Jul-2017 12:00PM $this->assertEquals( date( 'r', $result['start_date'] ), date( 'r', strtotime( '08-Jul-2017 12:00AM' ) ) ); $this->assertEquals( date( 'r', $result['end_date'] ), date( 'r', strtotime( '14-Jul-2017 11:59:59PM' ) ) ); $this->assertEquals( date( 'r', $result['due_date'] ), date( 'r', strtotime( '19-Jul-2017 12:00PM' ) ) ); $result = $praef->calculateNextDate( $result['due_date'] ); //17-Jul-2017 12:00PM $this->assertEquals( date( 'r', $result['start_date'] ), date( 'r', strtotime( '15-Jul-2017 12:00AM' ) ) ); $this->assertEquals( date( 'r', $result['end_date'] ), date( 'r', strtotime( '21-Jul-2017 11:59:59PM' ) ) ); $this->assertEquals( date( 'r', $result['due_date'] ), date( 'r', strtotime( '26-Jul-2017 12:00PM' ) ) ); $result = $praef->calculateNextDate( $result['due_date'] ); //24-Jul-2017 12:00PM $this->assertEquals( date( 'r', $result['start_date'] ), date( 'r', strtotime( '22-Jul-2017 12:00AM' ) ) ); $this->assertEquals( date( 'r', $result['end_date'] ), date( 'r', strtotime( '31-Jul-2017 11:59:59PM' ) ) ); $this->assertEquals( date( 'r', $result['due_date'] ), date( 'r', strtotime( '03-Aug-2017 12:00PM' ) ) ); $result = $praef->calculateNextDate( $result['due_date'] ); //03-Aug-2017 12:00PM $this->assertEquals( date( 'r', $result['start_date'] ), date( 'r', strtotime( '01-Aug-2017 12:00AM' ) ) ); $this->assertEquals( date( 'r', $result['end_date'] ), date( 'r', strtotime( '07-Aug-2017 11:59:59PM' ) ) ); $this->assertEquals( date( 'r', $result['due_date'] ), date( 'r', strtotime( '10-Aug-2017 12:00PM' ) ) ); $result = $praef->calculateNextDate( $result['due_date'] ); //10-Aug-2017 12:00PM $this->assertEquals( date( 'r', $result['start_date'] ), date( 'r', strtotime( '08-Aug-2017 12:00AM' ) ) ); $this->assertEquals( date( 'r', $result['end_date'] ), date( 'r', strtotime( '14-Aug-2017 11:59:59PM' ) ) ); $this->assertEquals( date( 'r', $result['due_date'] ), date( 'r', strtotime( '17-Aug-2017 12:00PM' ) ) ); $result = $praef->calculateNextDate( $result['due_date'] ); //17-Aug-2017 12:00PM $this->assertEquals( date( 'r', $result['start_date'] ), date( 'r', strtotime( '15-Aug-2017 12:00AM' ) ) ); $this->assertEquals( date( 'r', $result['end_date'] ), date( 'r', strtotime( '21-Aug-2017 11:59:59PM' ) ) ); $this->assertEquals( date( 'r', $result['due_date'] ), date( 'r', strtotime( '24-Aug-2017 12:00PM' ) ) ); $result = $praef->calculateNextDate( $result['due_date'] ); //24-Aug-2017 12:00PM $this->assertEquals( date( 'r', $result['start_date'] ), date( 'r', strtotime( '22-Aug-2017 12:00AM' ) ) ); $this->assertEquals( date( 'r', $result['end_date'] ), date( 'r', strtotime( '31-Aug-2017 11:59:59PM' ) ) ); $this->assertEquals( date( 'r', $result['due_date'] ), date( 'r', strtotime( '05-Sep-2017 12:00PM' ) ) ); } /** * @group PayrollRemittanceAgencyEvent_testAcceleratedThreshold2B */ function testAcceleratedThreshold2B() { $praef = TTnew( 'PayrollRemittanceAgencyEventFactory' ); /** @var PayrollRemittanceAgencyEventFactory $praef */ $praef->setPayrollRemittanceAgencyId( $this->agency_id ); $pra_obj = $praef->getPayrollRemittanceAgencyObject(); $praef->setFrequency( 51000 ); $praef->setEffectiveDate( strtotime( '01-Jul-2017' ) ); $rhf_xmas = TTNew( 'RecurringHolidayFactory' ); /** @var RecurringHolidayFactory $rhf_xmas */ $rhf_xmas->setCompany( $this->company_id ); $rhf_xmas->setName( 'Test - Xmas' ); $rhf_xmas->setType( 10 ); $rhf_xmas->setDayOfMonth( 25 ); $rhf_xmas->setMonth( 12 ); $holiday_policy_ids[] = $rhf_xmas->save(); $rhf_box = TTNew( 'RecurringHolidayFactory' ); /** @var RecurringHolidayFactory $rhf_box */ $rhf_box->setCompany( $this->company_id ); $rhf_box->setName( 'Test - Boxing Day' ); $rhf_box->setType( 10 ); $rhf_box->setDayOfMonth( 26 ); $rhf_box->setMonth( 12 ); $holiday_policy_ids[] = $rhf_box->save(); $rhf_box = TTNew( 'RecurringHolidayFactory' ); /** @var RecurringHolidayFactory $rhf_box */ $rhf_box->setCompany( $this->company_id ); $rhf_box->setName( 'Test - NewYear' ); $rhf_box->setType( 10 ); $rhf_box->setDayOfMonth( 1 ); $rhf_box->setMonth( 1 ); $holiday_policy_ids[] = $rhf_box->save(); $pra_obj->setRecurringHoliday( $holiday_policy_ids ); $holidays = $pra_obj->getRecurringHoliday(); $this->assertEquals( 3, count( $holidays ), 'Holiday Count is wrong' ); $holidates = $praef->getRecurringHolidayDates( strtotime( '05-Dec-2017 12:00AM' ) ); $this->assertEquals( 3, count( $holidates ), 'Holiday date Count is wrong: ' . count( $holidates ) ); $result = $praef->calculateNextDate( strtotime( '15-Dec-2017 12:00PM' ) ); $this->assertEquals( date( 'r', $result['start_date'] ), date( 'r', strtotime( '15-Dec-2017 12:00AM' ) ) ); $this->assertEquals( date( 'r', $result['end_date'] ), date( 'r', strtotime( '21-Dec-2017 11:59:59PM' ) ) ); $this->assertEquals( date( 'r', $result['due_date'] ), date( 'r', strtotime( '28-Dec-2017 12:00PM' ) ) ); $result = $praef->calculateNextDate( strtotime( '22-Dec-2017 12:00PM' ) ); $this->assertEquals( date( 'r', $result['start_date'] ), date( 'r', strtotime( '22-Dec-2017 12:00AM' ) ) ); $this->assertEquals( date( 'r', $result['end_date'] ), date( 'r', strtotime( '31-Dec-2017 11:59:59PM' ) ) ); $this->assertEquals( date( 'r', $result['due_date'] ), date( 'r', strtotime( '04-Jan-2018 12:00PM' ) ) ); } /** * @group PayrollRemittanceAgencyEvent_testWeekendAvoidance */ function testWeekendAvoidance() { $praf = TTnew( 'PayrollRemittanceAgencyListFactory' ); /** @var PayrollRemittanceAgencyListFactory $praf */ $praf->getById( $this->agency_id ); $pra_obj = $praf->getCurrent(); $this->assertEquals( true, is_object( $pra_obj ), 'agency is not an object' ); /** * 0 => TTi18n::gettext('No'), * 1 => TTi18n::gettext('Yes - Previous Business Day'), * 2 => TTi18n::gettext('Yes - Next Business Day'), * 3 => TTi18n::gettext('Yes - Closest Business Day'), */ // $pra_obj->setAlwaysOnWeekDay( 0 ); //no weekend check. $pra_obj->save( false ); $praef = TTnew( 'PayrollRemittanceAgencyEventFactory' ); /** @var PayrollRemittanceAgencyEventFactory $praef */ $praef->setPayrollRemittanceAgencyId( $this->agency_id ); $praef->setFrequency( 5100 ); $praef->setDayOfWeek( 0 ); $result = $praef->calculateNextDate( strtotime( '29-Nov-2016 12:01AM' ) ); $this->assertEquals( date( 'r', $result['due_date'] ), date( 'r', strtotime( '04-Dec-2016 12:00PM' ) ) ); // // $pra_obj->setAlwaysOnWeekDay( 2 ); //2=Forward $pra_obj->save( false ); $praef = TTnew( 'PayrollRemittanceAgencyEventFactory' ); /** @var PayrollRemittanceAgencyEventFactory $praef */ $praef->setPayrollRemittanceAgencyId( $this->agency_id ); $praef->setFrequency( 5100 ); $praef->setDayOfWeek( 0 ); $result = $praef->calculateNextDate( strtotime( '29-Nov-2016 12:01AM' ) ); $this->assertEquals( date( 'r', $result['due_date'] ), date( 'r', strtotime( '05-Dec-2016 12:00PM' ) ) ); $pra_obj->setAlwaysOnWeekDay( 3 ); //3=closest business day $pra_obj->save( false ); $praef = TTnew( 'PayrollRemittanceAgencyEventFactory' ); /** @var PayrollRemittanceAgencyEventFactory $praef */ $praef->setPayrollRemittanceAgencyId( $this->agency_id ); $praef->setFrequency( 5100 ); $praef->setDayOfWeek( 0 ); $result = $praef->calculateNextDate( strtotime( '29-Nov-2016 12:01AM' ) ); $this->assertEquals( date( 'r', $result['due_date'] ), date( 'r', strtotime( '05-Dec-2016 12:00PM' ) ) ); $pra_obj->setAlwaysOnWeekDay( 1 ); //1=Backwards $pra_obj->save( false ); $praef = TTnew( 'PayrollRemittanceAgencyEventFactory' ); /** @var PayrollRemittanceAgencyEventFactory $praef */ $praef->setPayrollRemittanceAgencyId( $this->agency_id ); $praef->setFrequency( 5100 ); $praef->setDayOfWeek( 0 ); $result = $praef->calculateNextDate( strtotime( '29-Nov-2016 12:01AM' ) ); $this->assertEquals( date( 'r', $result['due_date'] ), date( 'r', strtotime( '02-Dec-2016 12:00PM' ) ) ); unset( $pra_obj, $praef ); } /** * @group PayrollRemittanceAgencyEvent_testHolidayAvoidance */ function testHolidayAvoidance() { $praf = TTnew( 'PayrollRemittanceAgencyListFactory' ); /** @var PayrollRemittanceAgencyListFactory $praf */ $praf->getById( $this->agency_id ); $pra_obj = $praf->getCurrent(); $this->assertEquals( true, is_object( $pra_obj ), 'agency is not an object' ); $holiday_policy_ids = []; $praef = TTnew( 'PayrollRemittanceAgencyEventFactory' ); /** @var PayrollRemittanceAgencyEventFactory $praef */ $praef->setId( $praef->getNextInsertId() ); $praef->setPayrollRemittanceAgencyId( $this->agency_id ); $praef->setType( 'T4' ); $praef->setReminderDays( 2 ); $praef->setFrequency( 4100 ); $praef->setPrimaryDayOfMonth( 25 ); $praef->setStatus( 10 ); $praef->setEffectiveDate( strtotime( '05-Dec-2017 12:00AM' ) ); $praef->save( false ); $rhf_xmas = TTNew( 'RecurringHolidayFactory' ); /** @var RecurringHolidayFactory $rhf_xmas */ $rhf_xmas->setCompany( $this->company_id ); $rhf_xmas->setName( 'Test - xmas' ); $rhf_xmas->setType( 10 ); $rhf_xmas->setDayOfMonth( 25 ); $rhf_xmas->setMonth( 12 ); $holiday_policy_ids[] = $rhf_xmas->save(); $rhf_box = TTNew( 'RecurringHolidayFactory' ); /** @var RecurringHolidayFactory $rhf_box */ $rhf_box->setCompany( $this->company_id ); $rhf_box->setName( 'Test - boxerday' ); $rhf_box->setType( 10 ); $rhf_box->setDayOfMonth( 26 ); $rhf_box->setMonth( 12 ); $holiday_policy_ids[] = $rhf_box->save(); $pra_obj->setRecurringHoliday( $holiday_policy_ids ); $holidays = $pra_obj->getRecurringHoliday(); $this->assertGreaterThanOrEqual( 2, count( $holidays ), 'Holiday Count is wrong' ); $holidates = $praef->getRecurringHolidayDates( strtotime( '05-Dec-2017 12:00AM' ) ); $this->assertGreaterThanOrEqual( 2, count( $holidates ), 'Holiday date Count is wrong: ' . count( $holidates ) ); $pra_obj->setAlwaysOnWeekDay( 0 ); //1=Backwards $pra_obj->save( false ); $praef = TTnew( 'PayrollRemittanceAgencyEventFactory' ); /** @var PayrollRemittanceAgencyEventFactory $praef */ $praef->setPayrollRemittanceAgencyId( $this->agency_id ); $praef->setType( 10 ); $praef->setReminderDays( 2 ); $praef->setFrequency( 4100 ); $praef->setPrimaryDayOfMonth( 25 ); $praef->setStatus( 10 ); $result = $praef->calculateNextDate( strtotime( '05-Dec-2017 12:01AM' ) ); $this->assertEquals( date( 'r', $result['due_date'] ), date( 'r', strtotime( '25-Dec-2017 12:00PM' ) ) ); $pra_obj->setAlwaysOnWeekDay( 1 ); //1=Backwards $pra_obj->save( false ); $praef = TTnew( 'PayrollRemittanceAgencyEventFactory' ); /** @var PayrollRemittanceAgencyEventFactory $praef */ $praef->setPayrollRemittanceAgencyId( $this->agency_id ); $praef->setType( 10 ); $praef->setReminderDays( 2 ); $praef->setFrequency( 4100 ); $praef->setPrimaryDayOfMonth( 25 ); $praef->setStatus( 10 ); $result = $praef->calculateNextDate( strtotime( '05-Dec-2017 12:01AM' ) ); $this->assertEquals( date( 'r', $result['due_date'] ), date( 'r', strtotime( '22-Dec-2017 12:00PM' ) ) ); $pra_obj->setAlwaysOnWeekDay( 2 ); //1=Backwards $pra_obj->save( false ); $praef = TTnew( 'PayrollRemittanceAgencyEventFactory' ); /** @var PayrollRemittanceAgencyEventFactory $praef */ $praef->setPayrollRemittanceAgencyId( $this->agency_id ); $praef->setType( 10 ); $praef->setReminderDays( 2 ); $praef->setFrequency( 4100 ); $praef->setPrimaryDayOfMonth( 25 ); $praef->setStatus( 10 ); $result = $praef->calculateNextDate( strtotime( '05-Dec-2017 12:00AM' ) ); $this->assertEquals( date( 'r', $result['due_date'] ), date( 'r', strtotime( '27-Dec-2017 12:00PM' ) ) ); $pra_obj->setAlwaysOnWeekDay( 3 ); //1=Backwards $pra_obj->save( false ); $praef = TTnew( 'PayrollRemittanceAgencyEventFactory' ); /** @var PayrollRemittanceAgencyEventFactory $praef */ $praef->setPayrollRemittanceAgencyId( $this->agency_id ); $praef->setType( 10 ); $praef->setReminderDays( 2 ); $praef->setFrequency( 4100 ); $praef->setPrimaryDayOfMonth( 25 ); $praef->setStatus( 10 ); $result = $praef->calculateNextDate( strtotime( '05-Dec-2017 12:01AM' ) ); $this->assertEquals( date( 'r', $result['due_date'] ), date( 'r', strtotime( '27-Dec-2017 12:00PM' ) ) ); } /** * @group PayrollRemittanceAgencyEvent_testWeekLongHolidayAvoidance */ function testWeekLongHolidayAvoidance() { $holiday_policy_ids = []; $praf = TTnew( 'PayrollRemittanceAgencyListFactory' ); /** @var PayrollRemittanceAgencyListFactory $praf */ $praf->getById( $this->agency_id ); $pra_obj = $praf->getCurrent(); // $praef = TTnew( 'PayrollRemittanceAgencyEventFactory' ); // $praef->setId( FALSE ); // $praef->setPayrollRemittanceAgencyId( $this->agency_id ); // $praef->setType( 10 ); // $praef->setReminderDays( 2 ); // $praef->setFrequency( 4100 ); // $praef->setPrimaryDayOfMonth( 25 ); // $praef->setStatus( 10 ); // $praef->setEffectiveDate( strtotime( '05-Dec-2017 12:00AM' ) ); $rhf_xmas = TTNew( 'RecurringHolidayFactory' ); /** @var RecurringHolidayFactory $rhf_xmas */ $rhf_xmas->setCompany( $this->company_id ); $rhf_xmas->setName( 'Test - xmas' ); $rhf_xmas->setType( 10 ); $rhf_xmas->setDayOfMonth( 25 ); $rhf_xmas->setMonth( 12 ); $rhf_xmas->setAlwaysOnWeekDay( 2 ); $holiday_policy_ids[] = $rhf_xmas->save(); $rhf_box = TTNew( 'RecurringHolidayFactory' ); /** @var RecurringHolidayFactory $rhf_box */ $rhf_box->setCompany( $this->company_id ); $rhf_box->setName( 'Test - boxerday' ); $rhf_box->setType( 10 ); $rhf_box->setDayOfMonth( 26 ); $rhf_box->setMonth( 12 ); $rhf_box->setAlwaysOnWeekDay( 2 ); $holiday_policy_ids[] = $rhf_box->save(); $rhf_box = TTNew( 'RecurringHolidayFactory' ); /** @var RecurringHolidayFactory $rhf_box */ $rhf_box->setCompany( $this->company_id ); $rhf_box->setName( 'Test - 27th dec' ); $rhf_box->setType( 10 ); $rhf_box->setDayOfMonth( 27 ); $rhf_box->setMonth( 12 ); $rhf_box->setAlwaysOnWeekDay( 2 ); $holiday_policy_ids[] = $rhf_box->save(); $rhf_box = TTNew( 'RecurringHolidayFactory' ); /** @var RecurringHolidayFactory $rhf_box */ $rhf_box->setCompany( $this->company_id ); $rhf_box->setName( 'Test - 28th dec' ); $rhf_box->setType( 10 ); $rhf_box->setDayOfMonth( 28 ); $rhf_box->setMonth( 12 ); $rhf_box->setAlwaysOnWeekDay( 2 ); $holiday_policy_ids[] = $rhf_box->save(); $rhf_box = TTNew( 'RecurringHolidayFactory' ); /** @var RecurringHolidayFactory $rhf_box */ $rhf_box->setCompany( $this->company_id ); $rhf_box->setName( 'Test - 29th dec' ); $rhf_box->setType( 10 ); $rhf_box->setDayOfMonth( 29 ); $rhf_box->setMonth( 12 ); $rhf_box->setAlwaysOnWeekDay( 2 ); $holiday_policy_ids[] = $rhf_box->save(); $pra_obj->setRecurringHoliday( $holiday_policy_ids ); $holidays = $pra_obj->getRecurringHoliday(); $this->assertGreaterThanOrEqual( 2, count( $holidays ), 'Holiday Count is wrong' ); /** * 0 => TTi18n::gettext('No'), * 1 => TTi18n::gettext('Yes - Previous Business Day'), * 2 => TTi18n::gettext('Yes - Next Business Day'), * 3 => TTi18n::gettext('Yes - Closest Business Day'), */ $pra_obj->setAlwaysOnWeekDay( 0 ); //1=none $pra_obj->save( false ); $praef = TTnew( 'PayrollRemittanceAgencyEventFactory' ); /** @var PayrollRemittanceAgencyEventFactory $praef */ $praef->setPayrollRemittanceAgencyId( $this->agency_id ); $praef->setEffectiveDate( strtotime( '05-Nov-2017 12:00AM' ) ); $praef->setLastDueDate( strtotime( '05-Nov-2017 12:00AM' ) ); $praef->setType( 10 ); $praef->setReminderDays( 2 ); $praef->setFrequency( 4100 ); $praef->setPrimaryDayOfMonth( 25 ); $praef->setStatus( 10 ); $holidates = $praef->getRecurringHolidayDates( strtotime( '05-Dec-2017 12:00AM' ) ); $this->assertGreaterThanOrEqual( 2, count( $holidates ), 'Holiday date Count is wrong: ' . count( $holidates ) ); $result = $praef->calculateNextDate( strtotime( '05-Dec-2017 12:01AM' ) ); $this->assertEquals( date( 'r', $result['due_date'] ), date( 'r', strtotime( '25-Dec-2017 12:00PM' ) ) ); $pra_obj->setAlwaysOnWeekDay( 1 ); //1=Backwards $pra_obj->save( false ); $praef = TTnew( 'PayrollRemittanceAgencyEventFactory' ); /** @var PayrollRemittanceAgencyEventFactory $praef */ $praef->setPayrollRemittanceAgencyId( $this->agency_id ); $praef->setEffectiveDate( strtotime( '05-Dec-2017 12:00AM' ) ); $praef->setLastDueDate( strtotime( '05-Dec-2017 12:00AM' ) ); $praef->setType( 10 ); $praef->setReminderDays( 2 ); $praef->setFrequency( 4100 ); $praef->setPrimaryDayOfMonth( 25 ); $praef->setStatus( 10 ); $result = $praef->calculateNextDate( strtotime( '05-Dec-2017 12:01AM' ) ); $this->assertEquals( date( 'r', $praef->getEffectiveDate() ), date( 'r', strtotime( '05-Dec-2017 12:00AM' ) ) ); $this->assertEquals( date( 'r', $praef->getLastDueDate() ), date( 'r', strtotime( '05-Dec-2017 12:00AM' ) ) ); $this->assertEquals( date( 'r', $result['due_date'] ), date( 'r', strtotime( '22-Dec-2017 12:00PM' ) ) ); $pra_obj->setAlwaysOnWeekDay( 2 ); //2=next $pra_obj->save( false ); $praef = TTnew( 'PayrollRemittanceAgencyEventFactory' ); /** @var PayrollRemittanceAgencyEventFactory $praef */ $praef->setPayrollRemittanceAgencyId( $this->agency_id ); $praef->setEffectiveDate( strtotime( '05-Dec-2017 12:00AM' ) ); $praef->setLastDueDate( strtotime( '05-Dec-2017 12:00AM' ) ); $praef->setType( 10 ); $praef->setFrequency( 4100 ); $praef->setPrimaryDayOfMonth( 25 ); $praef->setStatus( 10 ); $result = $praef->calculateNextDate( strtotime( '05-Dec-2017 12:01AM' ) ); $this->assertEquals( date( 'r', $praef->getEffectiveDate() ), date( 'r', strtotime( '05-Dec-2017 12:00AM' ) ), 'getEffectiveDate does not match' ); $this->assertEquals( date( 'r', $praef->getLastDueDate() ), date( 'r', strtotime( '05-Dec-2017 12:00AM' ) ), 'getLastDueDate does not match' ); $this->assertEquals( date( 'r', $result['due_date'] ), date( 'r', strtotime( '01-Jan-2018 12:00PM' ) ) ); $pra_obj->setAlwaysOnWeekDay( 3 ); //closest $pra_obj->save( false ); $praef = TTnew( 'PayrollRemittanceAgencyEventFactory' ); /** @var PayrollRemittanceAgencyEventFactory $praef */ $praef->setPayrollRemittanceAgencyId( $this->agency_id ); $praef->setEffectiveDate( strtotime( '05-Dec-2017 12:00AM' ) ); $praef->setLastDueDate( strtotime( '05-Dec-2017 12:00AM' ) ); $praef->setType( 10 ); $praef->setFrequency( 4100 ); $praef->setPrimaryDayOfMonth( 25 ); $praef->setStatus( 10 ); $result = $praef->calculateNextDate( strtotime( '05-Dec-2017 12:01AM' ) ); $this->assertEquals( date( 'r', $praef->getEffectiveDate() ), date( 'r', strtotime( '05-Dec-2017 12:00AM' ) ), 'getEffectiveDate does not match' ); $this->assertEquals( date( 'r', $praef->getLastDueDate() ), date( 'r', strtotime( '05-Dec-2017 12:00AM' ) ), 'getLastDueDate does not match' ); $this->assertEquals( date( 'r', $result['due_date'] ), date( 'r', strtotime( '22-Dec-2017 12:00PM' ) ) ); } /** * @group PayrollRemittanceAgencyEvent_testSemiMonthlyFrequency */ function testSemiMonthlyFrequency() { $praef = TTnew( 'PayrollRemittanceAgencyEventFactory' ); /** @var PayrollRemittanceAgencyEventFactory $praef */ $praef->setPayrollRemittanceAgencyId( $this->agency_id ); $praef->setFrequency( 4200 ); $praef->setPrimaryDayOfMonth( 7 ); $praef->setSecondaryDayOfMonth( 22 ); $praef->setDueDateDelayDays( 3 ); $praef->setEffectiveDate( strtotime( '01-Jul-2017' ) ); $result = $praef->calculateNextDate( strtotime( '01-Jul-2017 12:00PM' ) ); $this->assertEquals( date( 'r', $result['start_date'] ), date( 'r', strtotime( '23-Jun-2017 12:00AM' ) ) ); $this->assertEquals( date( 'r', $result['end_date'] ), date( 'r', strtotime( '07-Jul-2017 11:59:59PM' ) ) ); $this->assertEquals( date( 'r', $result['due_date'] ), date( 'r', strtotime( '10-Jul-2017 12:00PM' ) ) ); $result = $praef->calculateNextDate( strtotime( '05-Jul-2017 12:00PM' ) ); $this->assertEquals( date( 'r', $result['start_date'] ), date( 'r', strtotime( '23-Jun-2017 12:00AM' ) ) ); $this->assertEquals( date( 'r', $result['end_date'] ), date( 'r', strtotime( '07-Jul-2017 11:59:59PM' ) ) ); $this->assertEquals( date( 'r', $result['due_date'] ), date( 'r', strtotime( '10-Jul-2017 12:00PM' ) ) ); $result = $praef->calculateNextDate( strtotime( '06-Jul-2017 12:00PM' ) ); $this->assertEquals( date( 'r', $result['start_date'] ), date( 'r', strtotime( '23-Jun-2017 12:00AM' ) ) ); $this->assertEquals( date( 'r', $result['end_date'] ), date( 'r', strtotime( '07-Jul-2017 11:59:59PM' ) ) ); $this->assertEquals( date( 'r', $result['due_date'] ), date( 'r', strtotime( '10-Jul-2017 12:00PM' ) ) ); $result = $praef->calculateNextDate( strtotime( '07-Jul-2017 12:00PM' ) ); $this->assertEquals( date( 'r', $result['start_date'] ), date( 'r', strtotime( '23-Jun-2017 12:00AM' ) ) ); $this->assertEquals( date( 'r', $result['end_date'] ), date( 'r', strtotime( '07-Jul-2017 11:59:59PM' ) ) ); $this->assertEquals( date( 'r', $result['due_date'] ), date( 'r', strtotime( '10-Jul-2017 12:00PM' ) ) ); $result = $praef->calculateNextDate( strtotime( '08-Jul-2017 12:00PM' ) ); $this->assertEquals( date( 'r', $result['start_date'] ), date( 'r', strtotime( '08-Jul-2017 12:00AM' ) ) ); $this->assertEquals( date( 'r', $result['end_date'] ), date( 'r', strtotime( '22-Jul-2017 11:59:59PM' ) ) ); $this->assertEquals( date( 'r', $result['due_date'] ), date( 'r', strtotime( '25-Jul-2017 12:00PM' ) ) ); $result = $praef->calculateNextDate( strtotime( '09-Jul-2017 12:00PM' ) ); $this->assertEquals( date( 'r', $result['start_date'] ), date( 'r', strtotime( '08-Jul-2017 12:00AM' ) ) ); $this->assertEquals( date( 'r', $result['end_date'] ), date( 'r', strtotime( '22-Jul-2017 11:59:59PM' ) ) ); $this->assertEquals( date( 'r', $result['due_date'] ), date( 'r', strtotime( '25-Jul-2017 12:00PM' ) ) ); $result = $praef->calculateNextDate( strtotime( '21-Jul-2017 12:00PM' ) ); $this->assertEquals( date( 'r', $result['start_date'] ), date( 'r', strtotime( '08-Jul-2017 12:00AM' ) ) ); $this->assertEquals( date( 'r', $result['end_date'] ), date( 'r', strtotime( '22-Jul-2017 11:59:59PM' ) ) ); $this->assertEquals( date( 'r', $result['due_date'] ), date( 'r', strtotime( '25-Jul-2017 12:00PM' ) ) ); $result = $praef->calculateNextDate( strtotime( '22-Jul-2017 12:00PM' ) ); $this->assertEquals( date( 'r', $result['start_date'] ), date( 'r', strtotime( '08-Jul-2017 12:00AM' ) ) ); $this->assertEquals( date( 'r', $result['end_date'] ), date( 'r', strtotime( '22-Jul-2017 11:59:59PM' ) ) ); $this->assertEquals( date( 'r', $result['due_date'] ), date( 'r', strtotime( '25-Jul-2017 12:00PM' ) ) ); $result = $praef->calculateNextDate( strtotime( '23-Jul-2017 12:00PM' ) ); $this->assertEquals( date( 'r', $result['start_date'] ), date( 'r', strtotime( '23-Jul-2017 12:00AM' ) ) ); $this->assertEquals( date( 'r', $result['end_date'] ), date( 'r', strtotime( '07-Aug-2017 11:59:59PM' ) ) ); $this->assertEquals( date( 'r', $result['due_date'] ), date( 'r', strtotime( '10-Aug-2017 12:00PM' ) ) ); $result = $praef->calculateNextDate( strtotime( '30-Jul-2017 12:00PM' ) ); $this->assertEquals( date( 'r', $result['start_date'] ), date( 'r', strtotime( '23-Jul-2017 12:00AM' ) ) ); $this->assertEquals( date( 'r', $result['end_date'] ), date( 'r', strtotime( '07-Aug-2017 11:59:59PM' ) ) ); $this->assertEquals( date( 'r', $result['due_date'] ), date( 'r', strtotime( '10-Aug-2017 12:00PM' ) ) ); $result = $praef->calculateNextDate( strtotime( '1-Aug-2017 12:00PM' ) ); $this->assertEquals( date( 'r', $result['start_date'] ), date( 'r', strtotime( '23-Jul-2017 12:00AM' ) ) ); $this->assertEquals( date( 'r', $result['end_date'] ), date( 'r', strtotime( '07-Aug-2017 11:59:59PM' ) ) ); $this->assertEquals( date( 'r', $result['due_date'] ), date( 'r', strtotime( '10-Aug-2017 12:00PM' ) ) ); $praef->setPrimaryDayOfMonth( 10 ); $praef->setSecondaryDayOfMonth( 25 ); $praef->setDueDateDelayDays( 6 ); $praef->setEffectiveDate( strtotime( '01-Jul-2017' ) ); $result = $praef->calculateNextDate( strtotime( '01-Jul-2017 12:00PM' ) ); $this->assertEquals( date( 'r', $result['start_date'] ), date( 'r', strtotime( '26-Jun-2017 12:00AM' ) ) ); $this->assertEquals( date( 'r', $result['end_date'] ), date( 'r', strtotime( '10-Jul-2017 11:59:59PM' ) ) ); $this->assertEquals( date( 'r', $result['due_date'] ), date( 'r', strtotime( '16-Jul-2017 12:00PM' ) ) ); $result = $praef->calculateNextDate( strtotime( '06-Jul-2017 12:00PM' ) ); $this->assertEquals( date( 'r', $result['start_date'] ), date( 'r', strtotime( '26-Jun-2017 12:00AM' ) ) ); $this->assertEquals( date( 'r', $result['end_date'] ), date( 'r', strtotime( '10-Jul-2017 11:59:59PM' ) ) ); $this->assertEquals( date( 'r', $result['due_date'] ), date( 'r', strtotime( '16-Jul-2017 12:00PM' ) ) ); $result = $praef->calculateNextDate( strtotime( '09-Jul-2017 12:00PM' ) ); $this->assertEquals( date( 'r', $result['start_date'] ), date( 'r', strtotime( '26-Jun-2017 12:00AM' ) ) ); $this->assertEquals( date( 'r', $result['end_date'] ), date( 'r', strtotime( '10-Jul-2017 11:59:59PM' ) ) ); $this->assertEquals( date( 'r', $result['due_date'] ), date( 'r', strtotime( '16-Jul-2017 12:00PM' ) ) ); $result = $praef->calculateNextDate( strtotime( '10-Jul-2017 12:00PM' ) ); $this->assertEquals( date( 'r', $result['start_date'] ), date( 'r', strtotime( '26-Jun-2017 12:00AM' ) ) ); $this->assertEquals( date( 'r', $result['end_date'] ), date( 'r', strtotime( '10-Jul-2017 11:59:59PM' ) ) ); $this->assertEquals( date( 'r', $result['due_date'] ), date( 'r', strtotime( '16-Jul-2017 12:00PM' ) ) ); $result = $praef->calculateNextDate( strtotime( '11-Jul-2017 12:00PM' ) ); $this->assertEquals( date( 'r', $result['start_date'] ), date( 'r', strtotime( '11-Jul-2017 12:00AM' ) ) ); $this->assertEquals( date( 'r', $result['end_date'] ), date( 'r', strtotime( '25-Jul-2017 11:59:59PM' ) ) ); $this->assertEquals( date( 'r', $result['due_date'] ), date( 'r', strtotime( '31-Jul-2017 12:00PM' ) ) ); $result = $praef->calculateNextDate( strtotime( '12-Jul-2017 12:00PM' ) ); $this->assertEquals( date( 'r', $result['start_date'] ), date( 'r', strtotime( '11-Jul-2017 12:00AM' ) ) ); $this->assertEquals( date( 'r', $result['end_date'] ), date( 'r', strtotime( '25-Jul-2017 11:59:59PM' ) ) ); $this->assertEquals( date( 'r', $result['due_date'] ), date( 'r', strtotime( '31-Jul-2017 12:00PM' ) ) ); $result = $praef->calculateNextDate( strtotime( '24-Jul-2017 12:00PM' ) ); $this->assertEquals( date( 'r', $result['start_date'] ), date( 'r', strtotime( '11-Jul-2017 12:00AM' ) ) ); $this->assertEquals( date( 'r', $result['end_date'] ), date( 'r', strtotime( '25-Jul-2017 11:59:59PM' ) ) ); $this->assertEquals( date( 'r', $result['due_date'] ), date( 'r', strtotime( '31-Jul-2017 12:00PM' ) ) ); $result = $praef->calculateNextDate( strtotime( '25-Jul-2017 12:00PM' ) ); $this->assertEquals( date( 'r', $result['start_date'] ), date( 'r', strtotime( '11-Jul-2017 12:00AM' ) ) ); $this->assertEquals( date( 'r', $result['end_date'] ), date( 'r', strtotime( '25-Jul-2017 11:59:59PM' ) ) ); $this->assertEquals( date( 'r', $result['due_date'] ), date( 'r', strtotime( '31-Jul-2017 12:00PM' ) ) ); $result = $praef->calculateNextDate( strtotime( '26-Jul-2017 12:00PM' ) ); $this->assertEquals( date( 'r', $result['start_date'] ), date( 'r', strtotime( '26-Jul-2017 12:00AM' ) ) ); $this->assertEquals( date( 'r', $result['end_date'] ), date( 'r', strtotime( '10-Aug-2017 11:59:59PM' ) ) ); $this->assertEquals( date( 'r', $result['due_date'] ), date( 'r', strtotime( '16-Aug-2017 12:00PM' ) ) ); //ca threshold1 // 10th and 25th of each month. If transaction date falls between 1-15th of the month, pay by 25th. If it falls between 16th and last day, pay on the 10th of the next month. $praef->setPrimaryDayOfMonth( 15 ); $praef->setSecondaryDayOfMonth( 31 ); $praef->setDueDateDelayDays( 10 ); $praef->setEffectiveDate( strtotime( '01-Jul-2017' ) ); $result = $praef->calculateNextDate( strtotime( '01-Jul-2017 12:00PM' ) ); $this->assertEquals( date( 'r', $result['start_date'] ), date( 'r', strtotime( '01-Jul-2017 12:00AM' ) ) ); $this->assertEquals( date( 'r', $result['end_date'] ), date( 'r', strtotime( '15-Jul-2017 11:59:59PM' ) ) ); $this->assertEquals( date( 'r', $result['due_date'] ), date( 'r', strtotime( '25-Jul-2017 12:00PM' ) ) ); $result = $praef->calculateNextDate( strtotime( '02-Jul-2017 12:00PM' ) ); $this->assertEquals( date( 'r', $result['start_date'] ), date( 'r', strtotime( '01-Jul-2017 12:00AM' ) ) ); $this->assertEquals( date( 'r', $result['end_date'] ), date( 'r', strtotime( '15-Jul-2017 11:59:59PM' ) ) ); $this->assertEquals( date( 'r', $result['due_date'] ), date( 'r', strtotime( '25-Jul-2017 12:00PM' ) ) ); $result = $praef->calculateNextDate( strtotime( '03-Jul-2017 12:00PM' ) ); $this->assertEquals( date( 'r', $result['start_date'] ), date( 'r', strtotime( '01-Jul-2017 12:00AM' ) ) ); $this->assertEquals( date( 'r', $result['end_date'] ), date( 'r', strtotime( '15-Jul-2017 11:59:59PM' ) ) ); $this->assertEquals( date( 'r', $result['due_date'] ), date( 'r', strtotime( '25-Jul-2017 12:00PM' ) ) ); $result = $praef->calculateNextDate( strtotime( '04-Jul-2017 12:00PM' ) ); $this->assertEquals( date( 'r', $result['start_date'] ), date( 'r', strtotime( '01-Jul-2017 12:00AM' ) ) ); $this->assertEquals( date( 'r', $result['end_date'] ), date( 'r', strtotime( '15-Jul-2017 11:59:59PM' ) ) ); $this->assertEquals( date( 'r', $result['due_date'] ), date( 'r', strtotime( '25-Jul-2017 12:00PM' ) ) ); $result = $praef->calculateNextDate( strtotime( '13-Jul-2017 12:00PM' ) ); $this->assertEquals( date( 'r', $result['start_date'] ), date( 'r', strtotime( '01-Jul-2017 12:00AM' ) ) ); $this->assertEquals( date( 'r', $result['end_date'] ), date( 'r', strtotime( '15-Jul-2017 11:59:59PM' ) ) ); $this->assertEquals( date( 'r', $result['due_date'] ), date( 'r', strtotime( '25-Jul-2017 12:00PM' ) ) ); $result = $praef->calculateNextDate( strtotime( '14-Jul-2017 12:00PM' ) ); $this->assertEquals( date( 'r', $result['start_date'] ), date( 'r', strtotime( '01-Jul-2017 12:00AM' ) ) ); $this->assertEquals( date( 'r', $result['end_date'] ), date( 'r', strtotime( '15-Jul-2017 11:59:59PM' ) ) ); $this->assertEquals( date( 'r', $result['due_date'] ), date( 'r', strtotime( '25-Jul-2017 12:00PM' ) ) ); $result = $praef->calculateNextDate( strtotime( '15-Jul-2017 12:00PM' ) ); $this->assertEquals( date( 'r', $result['start_date'] ), date( 'r', strtotime( '01-Jul-2017 12:00AM' ) ) ); $this->assertEquals( date( 'r', $result['end_date'] ), date( 'r', strtotime( '15-Jul-2017 11:59:59PM' ) ) ); $this->assertEquals( date( 'r', $result['due_date'] ), date( 'r', strtotime( '25-Jul-2017 12:00PM' ) ) ); $result = $praef->calculateNextDate( strtotime( '16-Jul-2017 12:00PM' ) ); $this->assertEquals( date( 'r', $result['start_date'] ), date( 'r', strtotime( '16-Jul-2017 12:00AM' ) ) ); $this->assertEquals( date( 'r', $result['end_date'] ), date( 'r', strtotime( '31-Jul-2017 11:59:59PM' ) ) ); $this->assertEquals( date( 'r', $result['due_date'] ), date( 'r', strtotime( '10-Aug-2017 12:00PM' ) ) ); $result = $praef->calculateNextDate( strtotime( '17-Jul-2017 12:00PM' ) ); $this->assertEquals( date( 'r', $result['start_date'] ), date( 'r', strtotime( '16-Jul-2017 12:00AM' ) ) ); $this->assertEquals( date( 'r', $result['end_date'] ), date( 'r', strtotime( '31-Jul-2017 11:59:59PM' ) ) ); $this->assertEquals( date( 'r', $result['due_date'] ), date( 'r', strtotime( '10-Aug-2017 12:00PM' ) ) ); $result = $praef->calculateNextDate( strtotime( '18-Jul-2017 12:00PM' ) ); $this->assertEquals( date( 'r', $result['start_date'] ), date( 'r', strtotime( '16-Jul-2017 12:00AM' ) ) ); $this->assertEquals( date( 'r', $result['end_date'] ), date( 'r', strtotime( '31-Jul-2017 11:59:59PM' ) ) ); $this->assertEquals( date( 'r', $result['due_date'] ), date( 'r', strtotime( '10-Aug-2017 12:00PM' ) ) ); $result = $praef->calculateNextDate( strtotime( '19-Jul-2017 12:00PM' ) ); $this->assertEquals( date( 'r', $result['start_date'] ), date( 'r', strtotime( '16-Jul-2017 12:00AM' ) ) ); $this->assertEquals( date( 'r', $result['end_date'] ), date( 'r', strtotime( '31-Jul-2017 11:59:59PM' ) ) ); $this->assertEquals( date( 'r', $result['due_date'] ), date( 'r', strtotime( '10-Aug-2017 12:00PM' ) ) ); $result = $praef->calculateNextDate( strtotime( '30-Jul-2017 12:00PM' ) ); $this->assertEquals( date( 'r', $result['start_date'] ), date( 'r', strtotime( '16-Jul-2017 12:00AM' ) ) ); $this->assertEquals( date( 'r', $result['end_date'] ), date( 'r', strtotime( '31-Jul-2017 11:59:59PM' ) ) ); $this->assertEquals( date( 'r', $result['due_date'] ), date( 'r', strtotime( '10-Aug-2017 12:00PM' ) ) ); $result = $praef->calculateNextDate( strtotime( '31-Jul-2017 12:00PM' ) ); $this->assertEquals( date( 'r', $result['start_date'] ), date( 'r', strtotime( '16-Jul-2017 12:00AM' ) ) ); $this->assertEquals( date( 'r', $result['end_date'] ), date( 'r', strtotime( '31-Jul-2017 11:59:59PM' ) ) ); $this->assertEquals( date( 'r', $result['due_date'] ), date( 'r', strtotime( '10-Aug-2017 12:00PM' ) ) ); //chained tests (like wizard) $result = $praef->calculateNextDate( $result['due_date'] ); //10-Aug-2017 12:00P $this->assertEquals( date( 'r', $result['start_date'] ), date( 'r', strtotime( '01-Aug-2017 12:00AM' ) ) ); $this->assertEquals( date( 'r', $result['end_date'] ), date( 'r', strtotime( '15-Aug-2017 11:59:59PM' ) ) ); $this->assertEquals( date( 'r', $result['due_date'] ), date( 'r', strtotime( '25-Aug-2017 12:00PM' ) ) ); $result = $praef->calculateNextDate( $result['due_date'] ); //25-Aug-2017 12:00P $this->assertEquals( date( 'r', $result['start_date'] ), date( 'r', strtotime( '16-Aug-2017 12:00AM' ) ) ); $this->assertEquals( date( 'r', $result['end_date'] ), date( 'r', strtotime( '31-Aug-2017 11:59:59PM' ) ) ); $this->assertEquals( date( 'r', $result['due_date'] ), date( 'r', strtotime( '10-Sep-2017 12:00PM' ) ) ); $result = $praef->calculateNextDate( $result['due_date'] ); //10-Sep-2017 12:00P $this->assertEquals( date( 'r', $result['start_date'] ), date( 'r', strtotime( '01-Sep-2017 12:00AM' ) ) ); $this->assertEquals( date( 'r', $result['end_date'] ), date( 'r', strtotime( '15-Sep-2017 11:59:59PM' ) ) ); $this->assertEquals( date( 'r', $result['due_date'] ), date( 'r', strtotime( '25-Sep-2017 12:00PM' ) ) ); $result = $praef->calculateNextDate( $result['due_date'] ); //25-Sep-2017 12:00P $this->assertEquals( date( 'r', $result['start_date'] ), date( 'r', strtotime( '16-Sep-2017 12:00AM' ) ) ); $this->assertEquals( date( 'r', $result['end_date'] ), date( 'r', strtotime( '30-Sep-2017 11:59:59PM' ) ) ); $this->assertEquals( date( 'r', $result['due_date'] ), date( 'r', strtotime( '10-Oct-2017 12:00PM' ) ) ); $result = $praef->calculateNextDate( $result['due_date'] ); //10-Oct-2017 12:00P $this->assertEquals( date( 'r', $result['start_date'] ), date( 'r', strtotime( '01-Oct-2017 12:00AM' ) ) ); $this->assertEquals( date( 'r', $result['end_date'] ), date( 'r', strtotime( '15-Oct-2017 11:59:59PM' ) ) ); $this->assertEquals( date( 'r', $result['due_date'] ), date( 'r', strtotime( '25-Oct-2017 12:00PM' ) ) ); $result = $praef->calculateNextDate( $result['due_date'] ); //25-Oct-2017 12:00P $this->assertEquals( date( 'r', $result['start_date'] ), date( 'r', strtotime( '16-Oct-2017 12:00AM' ) ) ); $this->assertEquals( date( 'r', $result['end_date'] ), date( 'r', strtotime( '31-Oct-2017 11:59:59PM' ) ) ); $this->assertEquals( date( 'r', $result['due_date'] ), date( 'r', strtotime( '10-Nov-2017 12:00PM' ) ) ); } /** * @group PayrollRemittanceAgencyEvent_testSemiAnnual */ function testSemiAnnual() { $praef = TTnew( 'PayrollRemittanceAgencyEventFactory' ); /** @var PayrollRemittanceAgencyEventFactory $praef */ $praef->setPayrollRemittanceAgencyId( $this->agency_id ); $praef->setFrequency( 2200 ); $praef->setPrimaryMonth( 1 ); $praef->setPrimaryDayOfMonth( 10 ); $praef->setSecondaryMonth( 6 ); $praef->setSecondaryDayOfMonth( 15 ); $praef->setDueDateDelayDays( 5 ); $praef->setEffectiveDate( strtotime( '01-Jan-2015' ) ); $result = $praef->calculateNextDate( strtotime( '01-Jul-2017 12:00PM' ) ); $this->assertEquals( date( 'r', $result['start_date'] ), date( 'r', strtotime( '16-Jun-2017 12:00AM' ) ) ); $this->assertEquals( date( 'r', $result['end_date'] ), date( 'r', strtotime( '10-Jan-2018 11:59:59PM' ) ) ); $this->assertEquals( date( 'r', $result['due_date'] ), date( 'r', strtotime( '15-Jan-2018 12:00PM' ) ) ); $result = $praef->calculateNextDate( strtotime( '01-Mar-2017 12:00PM' ) ); $this->assertEquals( date( 'r', $result['start_date'] ), date( 'r', strtotime( '11-Jan-2017 12:00AM' ) ) ); $this->assertEquals( date( 'r', $result['end_date'] ), date( 'r', strtotime( '15-Jun-2017 11:59:59PM' ) ) ); $this->assertEquals( date( 'r', $result['due_date'] ), date( 'r', strtotime( '20-Jun-2017 12:00PM' ) ) ); $result = $praef->calculateNextDate( strtotime( '05-Jan-2017 12:00PM' ) ); $this->assertEquals( date( 'r', $result['start_date'] ), date( 'r', strtotime( '16-Jun-2016 12:00AM' ) ) ); $this->assertEquals( date( 'r', $result['end_date'] ), date( 'r', strtotime( '10-Jan-2017 11:59:59PM' ) ) ); $this->assertEquals( date( 'r', $result['due_date'] ), date( 'r', strtotime( '15-Jan-2017 12:00PM' ) ) ); $result = $praef->calculateNextDate( strtotime( '05-Dec-2017 12:00PM' ) ); $this->assertEquals( date( 'r', $result['start_date'] ), date( 'r', strtotime( '16-Jun-2017 12:00AM' ) ) ); $this->assertEquals( date( 'r', $result['end_date'] ), date( 'r', strtotime( '10-Jan-2018 11:59:59PM' ) ) ); $this->assertEquals( date( 'r', $result['due_date'] ), date( 'r', strtotime( '15-Jan-2018 12:00PM' ) ) ); $result = $praef->calculateNextDate( strtotime( '09-Jan-2017 12:00PM' ) ); $this->assertEquals( date( 'r', $result['start_date'] ), date( 'r', strtotime( '16-Jun-2016 12:00AM' ) ) ); $this->assertEquals( date( 'r', $result['end_date'] ), date( 'r', strtotime( '10-Jan-2017 11:59:59PM' ) ) ); $this->assertEquals( date( 'r', $result['due_date'] ), date( 'r', strtotime( '15-Jan-2017 12:00PM' ) ) ); $result = $praef->calculateNextDate( strtotime( '10-Jan-2017 12:00PM' ) ); $this->assertEquals( date( 'r', $result['start_date'] ), date( 'r', strtotime( '11-Jan-2017 12:00AM' ) ) ); $this->assertEquals( date( 'r', $result['end_date'] ), date( 'r', strtotime( '15-Jun-2017 11:59:59PM' ) ) ); $this->assertEquals( date( 'r', $result['due_date'] ), date( 'r', strtotime( '20-Jun-2017 12:00PM' ) ) ); $result = $praef->calculateNextDate( strtotime( '11-Jan-2017 12:00PM' ) ); $this->assertEquals( date( 'r', $result['start_date'] ), date( 'r', strtotime( '11-Jan-2017 12:00AM' ) ) ); $this->assertEquals( date( 'r', $result['end_date'] ), date( 'r', strtotime( '15-Jun-2017 11:59:59PM' ) ) ); $this->assertEquals( date( 'r', $result['due_date'] ), date( 'r', strtotime( '20-Jun-2017 12:00PM' ) ) ); $result = $praef->calculateNextDate( strtotime( '12-Jan-2017 12:00PM' ) ); $this->assertEquals( date( 'r', $result['start_date'] ), date( 'r', strtotime( '11-Jan-2017 12:00AM' ) ) ); $this->assertEquals( date( 'r', $result['end_date'] ), date( 'r', strtotime( '15-Jun-2017 11:59:59PM' ) ) ); $this->assertEquals( date( 'r', $result['due_date'] ), date( 'r', strtotime( '20-Jun-2017 12:00PM' ) ) ); //chained tests (like wizard) $result = $praef->calculateNextDate( $result['due_date'] );//20-Jun-2017 12:00PM $this->assertEquals( date( 'r', $result['start_date'] ), date( 'r', strtotime( '16-Jun-2017 12:00AM' ) ) ); $this->assertEquals( date( 'r', $result['end_date'] ), date( 'r', strtotime( '10-Jan-2018 11:59:59PM' ) ) ); $this->assertEquals( date( 'r', $result['due_date'] ), date( 'r', strtotime( '15-Jan-2018 12:00PM' ) ) ); $result = $praef->calculateNextDate( $result['due_date'] );//15-Jan-2018 12:00PM $this->assertEquals( date( 'r', $result['start_date'] ), date( 'r', strtotime( '11-Jan-2018 12:00AM' ) ) ); $this->assertEquals( date( 'r', $result['end_date'] ), date( 'r', strtotime( '15-Jun-2018 11:59:59PM' ) ) ); $this->assertEquals( date( 'r', $result['due_date'] ), date( 'r', strtotime( '20-Jun-2018 12:00PM' ) ) ); $result = $praef->calculateNextDate( $result['due_date'] );//20-Jun-2018 12:00PM $this->assertEquals( date( 'r', $result['start_date'] ), date( 'r', strtotime( '16-Jun-2018 12:00AM' ) ) ); $this->assertEquals( date( 'r', $result['end_date'] ), date( 'r', strtotime( '10-Jan-2019 11:59:59PM' ) ) ); $this->assertEquals( date( 'r', $result['due_date'] ), date( 'r', strtotime( '15-Jan-2019 12:00PM' ) ) ); $result = $praef->calculateNextDate( $result['due_date'] );//15-Jan-2019 12:00PM $this->assertEquals( date( 'r', $result['start_date'] ), date( 'r', strtotime( '11-Jan-2019 12:00AM' ) ) ); $this->assertEquals( date( 'r', $result['end_date'] ), date( 'r', strtotime( '15-Jun-2019 11:59:59PM' ) ) ); $this->assertEquals( date( 'r', $result['due_date'] ), date( 'r', strtotime( '20-Jun-2019 12:00PM' ) ) ); } /** * @group PayrollRemittanceAgencyEvent_testYearToDate */ function testYearToDate() { $praef = TTnew( 'PayrollRemittanceAgencyEventFactory' ); /** @var PayrollRemittanceAgencyEventFactory $praef */ $praef->setPayrollRemittanceAgencyId( $this->agency_id ); $praef->setFrequency( 2100 ); $praef->setPrimaryMonth( 6 ); //Jun $praef->setPrimaryDayOfMonth( 20 ); $praef->setDueDateDelayDays( 5 ); $result = $praef->calculateNextDate( strtotime( '01-Feb-2017 12:00PM' ) ); $this->assertEquals( date( 'r', $result['start_date'] ), date( 'r', strtotime( '01-Jan-2017 12:00AM' ) ) ); $this->assertEquals( date( 'r', $result['end_date'] ), date( 'r', strtotime( '20-Jun-2017 11:59:59PM' ) ) ); $this->assertEquals( date( 'r', $result['due_date'] ), date( 'r', strtotime( '25-Jun-2017 12:00PM' ) ) ); $result = $praef->calculateNextDate( strtotime( '19-Jun-2017 12:00PM' ) ); $this->assertEquals( date( 'r', $result['start_date'] ), date( 'r', strtotime( '01-Jan-2017 12:00AM' ) ) ); $this->assertEquals( date( 'r', $result['end_date'] ), date( 'r', strtotime( '20-Jun-2017 11:59:59PM' ) ) ); $this->assertEquals( date( 'r', $result['due_date'] ), date( 'r', strtotime( '25-Jun-2017 12:00PM' ) ) ); $result = $praef->calculateNextDate( strtotime( '19-Jun-2017 11:59PM' ) ); $this->assertEquals( date( 'r', $result['start_date'] ), date( 'r', strtotime( '01-Jan-2017 12:00AM' ) ) ); $this->assertEquals( date( 'r', $result['end_date'] ), date( 'r', strtotime( '20-Jun-2017 11:59:59PM' ) ) ); $this->assertEquals( date( 'r', $result['due_date'] ), date( 'r', strtotime( '25-Jun-2017 12:00PM' ) ) ); $result = $praef->calculateNextDate( strtotime( '20-Jun-2017 12:00PM' ) ); $this->assertEquals( date( 'r', $result['start_date'] ), date( 'r', strtotime( '01-Jan-2018 12:00AM' ) ) ); $this->assertEquals( date( 'r', $result['end_date'] ), date( 'r', strtotime( '20-Jun-2018 11:59:59PM' ) ) ); $this->assertEquals( date( 'r', $result['due_date'] ), date( 'r', strtotime( '25-Jun-2018 12:00PM' ) ) ); $result = $praef->calculateNextDate( strtotime( '21-Jun-2017 12:00PM' ) ); $this->assertEquals( date( 'r', $result['start_date'] ), date( 'r', strtotime( '01-Jan-2018 12:00AM' ) ) ); $this->assertEquals( date( 'r', $result['end_date'] ), date( 'r', strtotime( '20-Jun-2018 11:59:59PM' ) ) ); $this->assertEquals( date( 'r', $result['due_date'] ), date( 'r', strtotime( '25-Jun-2018 12:00PM' ) ) ); $result = $praef->calculateNextDate( strtotime( '22-Jun-2017 12:00PM' ) ); $this->assertEquals( date( 'r', $result['start_date'] ), date( 'r', strtotime( '01-Jan-2018 12:00AM' ) ) ); $this->assertEquals( date( 'r', $result['end_date'] ), date( 'r', strtotime( '20-Jun-2018 11:59:59PM' ) ) ); $this->assertEquals( date( 'r', $result['due_date'] ), date( 'r', strtotime( '25-Jun-2018 12:00PM' ) ) ); $result = $praef->calculateNextDate( strtotime( '23-Jun-2017 12:00PM' ) ); $this->assertEquals( date( 'r', $result['start_date'] ), date( 'r', strtotime( '01-Jan-2018 12:00AM' ) ) ); $this->assertEquals( date( 'r', $result['end_date'] ), date( 'r', strtotime( '20-Jun-2018 11:59:59PM' ) ) ); $this->assertEquals( date( 'r', $result['due_date'] ), date( 'r', strtotime( '25-Jun-2018 12:00PM' ) ) ); $result = $praef->calculateNextDate( strtotime( '24-Jun-2017 12:00PM' ) ); $this->assertEquals( date( 'r', $result['start_date'] ), date( 'r', strtotime( '01-Jan-2018 12:00AM' ) ) ); $this->assertEquals( date( 'r', $result['end_date'] ), date( 'r', strtotime( '20-Jun-2018 11:59:59PM' ) ) ); $this->assertEquals( date( 'r', $result['due_date'] ), date( 'r', strtotime( '25-Jun-2018 12:00PM' ) ) ); $result = $praef->calculateNextDate( strtotime( '25-Jun-2017 12:00PM' ) ); $this->assertEquals( date( 'r', $result['start_date'] ), date( 'r', strtotime( '01-Jan-2018 12:00AM' ) ) ); $this->assertEquals( date( 'r', $result['end_date'] ), date( 'r', strtotime( '20-Jun-2018 11:59:59PM' ) ) ); $this->assertEquals( date( 'r', $result['due_date'] ), date( 'r', strtotime( '25-Jun-2018 12:00PM' ) ) ); $result = $praef->calculateNextDate( strtotime( '26-Jun-2017 12:00PM' ) ); $this->assertEquals( date( 'r', $result['start_date'] ), date( 'r', strtotime( '01-Jan-2018 12:00AM' ) ) ); $this->assertEquals( date( 'r', $result['end_date'] ), date( 'r', strtotime( '20-Jun-2018 11:59:59PM' ) ) ); $this->assertEquals( date( 'r', $result['due_date'] ), date( 'r', strtotime( '25-Jun-2018 12:00PM' ) ) ); $result = $praef->calculateNextDate( strtotime( '01-Aug-2017 12:00PM' ) ); $this->assertEquals( date( 'r', $result['start_date'] ), date( 'r', strtotime( '01-Jan-2018 12:00AM' ) ) ); $this->assertEquals( date( 'r', $result['end_date'] ), date( 'r', strtotime( '20-Jun-2018 11:59:59PM' ) ) ); $this->assertEquals( date( 'r', $result['due_date'] ), date( 'r', strtotime( '25-Jun-2018 12:00PM' ) ) ); //chained testing (like wizard) $result = $praef->calculateNextDate( $result['due_date'] ); //25-Jun-2018 12:00PM $this->assertEquals( date( 'r', $result['start_date'] ), date( 'r', strtotime( '01-Jan-2019 12:00AM' ) ) ); $this->assertEquals( date( 'r', $result['end_date'] ), date( 'r', strtotime( '20-Jun-2019 11:59:59PM' ) ) ); $this->assertEquals( date( 'r', $result['due_date'] ), date( 'r', strtotime( '25-Jun-2019 12:00PM' ) ) ); $result = $praef->calculateNextDate( $result['due_date'] ); //25-Jun-2019 12:00PM $this->assertEquals( date( 'r', $result['start_date'] ), date( 'r', strtotime( '01-Jan-2020 12:00AM' ) ) ); $this->assertEquals( date( 'r', $result['end_date'] ), date( 'r', strtotime( '20-Jun-2020 11:59:59PM' ) ) ); $this->assertEquals( date( 'r', $result['due_date'] ), date( 'r', strtotime( '25-Jun-2020 12:00PM' ) ) ); $result = $praef->calculateNextDate( $result['due_date'] ); //25-Jun-2020 12:00PM $this->assertEquals( date( 'r', $result['start_date'] ), date( 'r', strtotime( '01-Jan-2021 12:00AM' ) ) ); $this->assertEquals( date( 'r', $result['end_date'] ), date( 'r', strtotime( '20-Jun-2021 11:59:59PM' ) ) ); $this->assertEquals( date( 'r', $result['due_date'] ), date( 'r', strtotime( '25-Jun-2021 12:00PM' ) ) ); $result = $praef->calculateNextDate( $result['due_date'] ); //25-Jun-2021 12:00PM $this->assertEquals( date( 'r', $result['start_date'] ), date( 'r', strtotime( '01-Jan-2022 12:00AM' ) ) ); $this->assertEquals( date( 'r', $result['end_date'] ), date( 'r', strtotime( '20-Jun-2022 11:59:59PM' ) ) ); $this->assertEquals( date( 'r', $result['due_date'] ), date( 'r', strtotime( '25-Jun-2022 12:00PM' ) ) ); $result = $praef->calculateNextDate( $result['due_date'] ); //25-Jun-2022 12:00PM $this->assertEquals( date( 'r', $result['start_date'] ), date( 'r', strtotime( '01-Jan-2023 12:00AM' ) ) ); $this->assertEquals( date( 'r', $result['end_date'] ), date( 'r', strtotime( '20-Jun-2023 11:59:59PM' ) ) ); $this->assertEquals( date( 'r', $result['due_date'] ), date( 'r', strtotime( '25-Jun-2023 12:00PM' ) ) ); } /** * @group PayrollRemittanceAgencyEvent_testYearToDateB */ function testYearToDateB() { $praef = TTnew( 'PayrollRemittanceAgencyEventFactory' ); /** @var PayrollRemittanceAgencyEventFactory $praef */ $praef->setPayrollRemittanceAgencyId( $this->agency_id ); $praef->setFrequency( 2100 ); $praef->setPrimaryMonth( 12 ); //Dec $praef->setPrimaryDayOfMonth( 1 ); $praef->setDueDateDelayDays( 0 ); $result = $praef->calculateNextDate( strtotime( '30-Nov-2017 12:00PM' ) ); $this->assertEquals( date( 'r', $result['start_date'] ), date( 'r', strtotime( '01-Jan-2017 12:00AM' ) ) ); $this->assertEquals( date( 'r', $result['end_date'] ), date( 'r', strtotime( '01-Dec-2017 11:59:59PM' ) ) ); $this->assertEquals( date( 'r', $result['due_date'] ), date( 'r', strtotime( '01-Dec-2017 12:00PM' ) ) ); $result = $praef->calculateNextDate( strtotime( '30-Nov-2017 11:59PM' ) ); $this->assertEquals( date( 'r', $result['start_date'] ), date( 'r', strtotime( '01-Jan-2017 12:00AM' ) ) ); $this->assertEquals( date( 'r', $result['end_date'] ), date( 'r', strtotime( '01-Dec-2017 11:59:59PM' ) ) ); $this->assertEquals( date( 'r', $result['due_date'] ), date( 'r', strtotime( '01-Dec-2017 12:00PM' ) ) ); $result = $praef->calculateNextDate( strtotime( '01-Dec-2017' ) ); $this->assertEquals( date( 'r', $result['start_date'] ), date( 'r', strtotime( '01-Jan-2018 12:00AM' ) ) ); $this->assertEquals( date( 'r', $result['end_date'] ), date( 'r', strtotime( '01-Dec-2018 11:59:59PM' ) ) ); $this->assertEquals( date( 'r', $result['due_date'] ), date( 'r', strtotime( '01-Dec-2018 12:00PM' ) ) ); $result = $praef->calculateNextDate( strtotime( '01-Dec-2017 12:00PM' ) ); $this->assertEquals( date( 'r', $result['start_date'] ), date( 'r', strtotime( '01-Jan-2018 12:00AM' ) ) ); $this->assertEquals( date( 'r', $result['end_date'] ), date( 'r', strtotime( '01-Dec-2018 11:59:59PM' ) ) ); $this->assertEquals( date( 'r', $result['due_date'] ), date( 'r', strtotime( '01-Dec-2018 12:00PM' ) ) ); $result = $praef->calculateNextDate( strtotime( '01-Dec-2017 11:59PM' ) ); $this->assertEquals( date( 'r', $result['start_date'] ), date( 'r', strtotime( '01-Jan-2018 12:00AM' ) ) ); $this->assertEquals( date( 'r', $result['end_date'] ), date( 'r', strtotime( '01-Dec-2018 11:59:59PM' ) ) ); $this->assertEquals( date( 'r', $result['due_date'] ), date( 'r', strtotime( '01-Dec-2018 12:00PM' ) ) ); } /** * @group PayrollRemittanceAgencyEvent_testEighthMonthly */ function testEighthMonthly() { $praef = TTnew( 'PayrollRemittanceAgencyEventFactory' ); /** @var PayrollRemittanceAgencyEventFactory $praef */ $praef->setPayrollRemittanceAgencyId( $this->agency_id ); $praef->setFrequency( 63000 ); $result = $praef->calculateNextDate( strtotime( '01-Jan-2017 12:00PM' ) ); $this->assertEquals( date( 'r', $result['start_date'] ), date( 'r', strtotime( '01-Jan-2017 12:00AM' ) ) ); $this->assertEquals( date( 'r', $result['end_date'] ), date( 'r', strtotime( '03-Jan-2017 11:59:59PM' ) ) ); $this->assertEquals( date( 'r', $result['due_date'] ), date( 'r', strtotime( '06-Jan-2017 12:00PM' ) ) ); $result = $praef->calculateNextDate( strtotime( '02-Jan-2017 12:00PM' ) ); $this->assertEquals( date( 'r', $result['start_date'] ), date( 'r', strtotime( '01-Jan-2017 12:00AM' ) ) ); $this->assertEquals( date( 'r', $result['end_date'] ), date( 'r', strtotime( '03-Jan-2017 11:59:59PM' ) ) ); $this->assertEquals( date( 'r', $result['due_date'] ), date( 'r', strtotime( '06-Jan-2017 12:00PM' ) ) ); $result = $praef->calculateNextDate( strtotime( '03-Jan-2017 12:00PM' ) ); $this->assertEquals( date( 'r', $result['start_date'] ), date( 'r', strtotime( '01-Jan-2017 12:00AM' ) ) ); $this->assertEquals( date( 'r', $result['end_date'] ), date( 'r', strtotime( '03-Jan-2017 11:59:59PM' ) ) ); $this->assertEquals( date( 'r', $result['due_date'] ), date( 'r', strtotime( '06-Jan-2017 12:00PM' ) ) ); $result = $praef->calculateNextDate( strtotime( '04-Jan-2017 12:00PM' ) ); $this->assertEquals( date( 'r', $result['start_date'] ), date( 'r', strtotime( '04-Jan-2017 12:00AM' ) ) ); $this->assertEquals( date( 'r', $result['end_date'] ), date( 'r', strtotime( '07-Jan-2017 11:59:59PM' ) ) ); $this->assertEquals( date( 'r', $result['due_date'] ), date( 'r', strtotime( '10-Jan-2017 12:00PM' ) ) ); $result = $praef->calculateNextDate( strtotime( '05-Jan-2017 12:00PM' ) ); $this->assertEquals( date( 'r', $result['start_date'] ), date( 'r', strtotime( '04-Jan-2017 12:00AM' ) ) ); $this->assertEquals( date( 'r', $result['end_date'] ), date( 'r', strtotime( '07-Jan-2017 11:59:59PM' ) ) ); $this->assertEquals( date( 'r', $result['due_date'] ), date( 'r', strtotime( '10-Jan-2017 12:00PM' ) ) ); $result = $praef->calculateNextDate( strtotime( '06-Jan-2017 12:00PM' ) ); $this->assertEquals( date( 'r', $result['start_date'] ), date( 'r', strtotime( '04-Jan-2017 12:00AM' ) ) ); $this->assertEquals( date( 'r', $result['end_date'] ), date( 'r', strtotime( '07-Jan-2017 11:59:59PM' ) ) ); $this->assertEquals( date( 'r', $result['due_date'] ), date( 'r', strtotime( '10-Jan-2017 12:00PM' ) ) ); $result = $praef->calculateNextDate( strtotime( '07-Jan-2017 12:00PM' ) ); $this->assertEquals( date( 'r', $result['start_date'] ), date( 'r', strtotime( '04-Jan-2017 12:00AM' ) ) ); $this->assertEquals( date( 'r', $result['end_date'] ), date( 'r', strtotime( '07-Jan-2017 11:59:59PM' ) ) ); $this->assertEquals( date( 'r', $result['due_date'] ), date( 'r', strtotime( '10-Jan-2017 12:00PM' ) ) ); $result = $praef->calculateNextDate( strtotime( '08-Jan-2017 12:00PM' ) ); $this->assertEquals( date( 'r', $result['start_date'] ), date( 'r', strtotime( '08-Jan-2017 12:00AM' ) ) ); $this->assertEquals( date( 'r', $result['end_date'] ), date( 'r', strtotime( '11-Jan-2017 11:59:59PM' ) ) ); $this->assertEquals( date( 'r', $result['due_date'] ), date( 'r', strtotime( '14-Jan-2017 12:00PM' ) ) ); $result = $praef->calculateNextDate( strtotime( '09-Jan-2017 12:00PM' ) ); $this->assertEquals( date( 'r', $result['start_date'] ), date( 'r', strtotime( '08-Jan-2017 12:00AM' ) ) ); $this->assertEquals( date( 'r', $result['end_date'] ), date( 'r', strtotime( '11-Jan-2017 11:59:59PM' ) ) ); $this->assertEquals( date( 'r', $result['due_date'] ), date( 'r', strtotime( '14-Jan-2017 12:00PM' ) ) ); $result = $praef->calculateNextDate( strtotime( '10-Jan-2017 12:00PM' ) ); $this->assertEquals( date( 'r', $result['start_date'] ), date( 'r', strtotime( '08-Jan-2017 12:00AM' ) ) ); $this->assertEquals( date( 'r', $result['end_date'] ), date( 'r', strtotime( '11-Jan-2017 11:59:59PM' ) ) ); $this->assertEquals( date( 'r', $result['due_date'] ), date( 'r', strtotime( '14-Jan-2017 12:00PM' ) ) ); $result = $praef->calculateNextDate( strtotime( '11-Jan-2017 12:00PM' ) ); $this->assertEquals( date( 'r', $result['start_date'] ), date( 'r', strtotime( '08-Jan-2017 12:00AM' ) ) ); $this->assertEquals( date( 'r', $result['end_date'] ), date( 'r', strtotime( '11-Jan-2017 11:59:59PM' ) ) ); $this->assertEquals( date( 'r', $result['due_date'] ), date( 'r', strtotime( '14-Jan-2017 12:00PM' ) ) ); $result = $praef->calculateNextDate( strtotime( '12-Jan-2017 12:00PM' ) ); $this->assertEquals( date( 'r', $result['start_date'] ), date( 'r', strtotime( '12-Jan-2017 12:00AM' ) ) ); $this->assertEquals( date( 'r', $result['end_date'] ), date( 'r', strtotime( '15-Jan-2017 11:59:59PM' ) ) ); $this->assertEquals( date( 'r', $result['due_date'] ), date( 'r', strtotime( '18-Jan-2017 12:00PM' ) ) ); $result = $praef->calculateNextDate( strtotime( '15-Jan-2017 12:00PM' ) ); $this->assertEquals( date( 'r', $result['start_date'] ), date( 'r', strtotime( '12-Jan-2017 12:00AM' ) ) ); $this->assertEquals( date( 'r', $result['end_date'] ), date( 'r', strtotime( '15-Jan-2017 11:59:59PM' ) ) ); $this->assertEquals( date( 'r', $result['due_date'] ), date( 'r', strtotime( '18-Jan-2017 12:00PM' ) ) ); $result = $praef->calculateNextDate( strtotime( '16-Jan-2017 12:00PM' ) ); $this->assertEquals( date( 'r', $result['start_date'] ), date( 'r', strtotime( '16-Jan-2017 12:00AM' ) ) ); $this->assertEquals( date( 'r', $result['end_date'] ), date( 'r', strtotime( '19-Jan-2017 11:59:59PM' ) ) ); $this->assertEquals( date( 'r', $result['due_date'] ), date( 'r', strtotime( '22-Jan-2017 12:00PM' ) ) ); $result = $praef->calculateNextDate( strtotime( '19-Jan-2017 12:00PM' ) ); $this->assertEquals( date( 'r', $result['start_date'] ), date( 'r', strtotime( '16-Jan-2017 12:00AM' ) ) ); $this->assertEquals( date( 'r', $result['end_date'] ), date( 'r', strtotime( '19-Jan-2017 11:59:59PM' ) ) ); $this->assertEquals( date( 'r', $result['due_date'] ), date( 'r', strtotime( '22-Jan-2017 12:00PM' ) ) ); $result = $praef->calculateNextDate( strtotime( '20-Jan-2017 12:00PM' ) ); $this->assertEquals( date( 'r', $result['start_date'] ), date( 'r', strtotime( '20-Jan-2017 12:00AM' ) ) ); $this->assertEquals( date( 'r', $result['end_date'] ), date( 'r', strtotime( '22-Jan-2017 11:59:59PM' ) ) ); $this->assertEquals( date( 'r', $result['due_date'] ), date( 'r', strtotime( '25-Jan-2017 12:00PM' ) ) ); $result = $praef->calculateNextDate( strtotime( '22-Jan-2017 12:00PM' ) ); $this->assertEquals( date( 'r', $result['start_date'] ), date( 'r', strtotime( '20-Jan-2017 12:00AM' ) ) ); $this->assertEquals( date( 'r', $result['end_date'] ), date( 'r', strtotime( '22-Jan-2017 11:59:59PM' ) ) ); $this->assertEquals( date( 'r', $result['due_date'] ), date( 'r', strtotime( '25-Jan-2017 12:00PM' ) ) ); $result = $praef->calculateNextDate( strtotime( '23-Jan-2017 12:00PM' ) ); $this->assertEquals( date( 'r', $result['start_date'] ), date( 'r', strtotime( '23-Jan-2017 12:00AM' ) ) ); $this->assertEquals( date( 'r', $result['end_date'] ), date( 'r', strtotime( '25-Jan-2017 11:59:59PM' ) ) ); $this->assertEquals( date( 'r', $result['due_date'] ), date( 'r', strtotime( '28-Jan-2017 12:00PM' ) ) ); $result = $praef->calculateNextDate( strtotime( '25-Jan-2017 12:00PM' ) ); $this->assertEquals( date( 'r', $result['start_date'] ), date( 'r', strtotime( '23-Jan-2017 12:00AM' ) ) ); $this->assertEquals( date( 'r', $result['end_date'] ), date( 'r', strtotime( '25-Jan-2017 11:59:59PM' ) ) ); $this->assertEquals( date( 'r', $result['due_date'] ), date( 'r', strtotime( '28-Jan-2017 12:00PM' ) ) ); $result = $praef->calculateNextDate( strtotime( '26-Jan-2017 12:00PM' ) ); $this->assertEquals( date( 'r', $result['start_date'] ), date( 'r', strtotime( '26-Jan-2017 12:00AM' ) ) ); $this->assertEquals( date( 'r', $result['end_date'] ), date( 'r', TTDate::getEndMonthEpoch( strtotime( '25-Jan-2017 11:59:59PM' ) ) ) ); $this->assertEquals( date( 'r', $result['due_date'] ), date( 'r', strtotime( '03-Feb-2017 12:00PM' ) ) ); $result = $praef->calculateNextDate( strtotime( '27-Jan-2017 12:00PM' ) ); $this->assertEquals( date( 'r', $result['start_date'] ), date( 'r', strtotime( '26-Jan-2017 12:00AM' ) ) ); $this->assertEquals( date( 'r', $result['end_date'] ), date( 'r', TTDate::getEndMonthEpoch( strtotime( '25-Jan-2017 11:59:59PM' ) ) ) ); $this->assertEquals( date( 'r', $result['due_date'] ), date( 'r', strtotime( '03-Feb-2017 12:00PM' ) ) ); $result = $praef->calculateNextDate( TTDate::getEndMonthEpoch( strtotime( '25-Jan-2017 11:59:59PM' ) ) ); $this->assertEquals( date( 'r', $result['start_date'] ), date( 'r', strtotime( '26-Jan-2017 12:00AM' ) ) ); $this->assertEquals( date( 'r', $result['end_date'] ), date( 'r', TTDate::getEndMonthEpoch( strtotime( '25-Jan-2017 11:59:59PM' ) ) ) ); $this->assertEquals( date( 'r', $result['due_date'] ), date( 'r', strtotime( '03-Feb-2017 12:00PM' ) ) ); //chained tests (like wizard) $result = $praef->calculateNextDate( strtotime( '25-Jan-2017 12:00PM' ) ); $this->assertEquals( date( 'r', $result['start_date'] ), date( 'r', strtotime( '23-Jan-2017 12:00AM' ) ) ); $this->assertEquals( date( 'r', $result['end_date'] ), date( 'r', strtotime( '25-Jan-2017 11:59:59PM' ) ) ); $this->assertEquals( date( 'r', $result['due_date'] ), date( 'r', strtotime( '28-Jan-2017 12:00PM' ) ) ); $result = $praef->calculateNextDate( $result['due_date'] );//28-Jan-2017 12:00PM $this->assertEquals( date( 'r', $result['start_date'] ), date( 'r', strtotime( '26-Jan-2017 12:00AM' ) ) ); $this->assertEquals( date( 'r', $result['end_date'] ), date( 'r', strtotime( '31-Jan-2017 11:59:59PM' ) ) ); $this->assertEquals( date( 'r', $result['due_date'] ), date( 'r', strtotime( '03-Feb-2017 12:00PM' ) ) ); $result = $praef->calculateNextDate( $result['due_date'] );//03-Feb-2017 12:00PM $this->assertEquals( date( 'r', $result['start_date'] ), date( 'r', strtotime( '01-Feb-2017 12:00AM' ) ) ); $this->assertEquals( date( 'r', $result['end_date'] ), date( 'r', strtotime( '03-Feb-2017 11:59:59PM' ) ) ); $this->assertEquals( date( 'r', $result['due_date'] ), date( 'r', strtotime( '06-Feb-2017 12:00PM' ) ) ); $result = $praef->calculateNextDate( $result['due_date'] );//06-Feb-2017 12:00PM $this->assertEquals( date( 'r', $result['start_date'] ), date( 'r', strtotime( '04-Feb-2017 12:00AM' ) ) ); $this->assertEquals( date( 'r', $result['end_date'] ), date( 'r', strtotime( '07-Feb-2017 11:59:59PM' ) ) ); $this->assertEquals( date( 'r', $result['due_date'] ), date( 'r', strtotime( '10-Feb-2017 12:00PM' ) ) ); $result = $praef->calculateNextDate( $result['due_date'] );//10-Feb-2017 12:00PM $this->assertEquals( date( 'r', $result['start_date'] ), date( 'r', strtotime( '08-Feb-2017 12:00AM' ) ) ); $this->assertEquals( date( 'r', $result['end_date'] ), date( 'r', strtotime( '11-Feb-2017 11:59:59PM' ) ) ); $this->assertEquals( date( 'r', $result['due_date'] ), date( 'r', strtotime( '14-Feb-2017 12:00PM' ) ) ); $result = $praef->calculateNextDate( $result['due_date'] );//14-Feb-2017 12:00PM $this->assertEquals( date( 'r', $result['start_date'] ), date( 'r', strtotime( '12-Feb-2017 12:00AM' ) ) ); $this->assertEquals( date( 'r', $result['end_date'] ), date( 'r', strtotime( '15-Feb-2017 11:59:59PM' ) ) ); $this->assertEquals( date( 'r', $result['due_date'] ), date( 'r', strtotime( '18-Feb-2017 12:00PM' ) ) ); $result = $praef->calculateNextDate( $result['due_date'] );//18-Feb-2017 12:00PM $this->assertEquals( date( 'r', $result['start_date'] ), date( 'r', strtotime( '16-Feb-2017 12:00AM' ) ) ); $this->assertEquals( date( 'r', $result['end_date'] ), date( 'r', strtotime( '19-Feb-2017 11:59:59PM' ) ) ); $this->assertEquals( date( 'r', $result['due_date'] ), date( 'r', strtotime( '22-Feb-2017 12:00PM' ) ) ); $result = $praef->calculateNextDate( $result['due_date'] );//22-Feb-2017 12:00PM $this->assertEquals( date( 'r', $result['start_date'] ), date( 'r', strtotime( '20-Feb-2017 12:00AM' ) ) ); $this->assertEquals( date( 'r', $result['end_date'] ), date( 'r', strtotime( '22-Feb-2017 11:59:59PM' ) ) ); $this->assertEquals( date( 'r', $result['due_date'] ), date( 'r', strtotime( '25-Feb-2017 12:00PM' ) ) ); $result = $praef->calculateNextDate( $result['due_date'] );//25-Feb-2017 12:00PM $this->assertEquals( date( 'r', $result['start_date'] ), date( 'r', strtotime( '23-Feb-2017 12:00AM' ) ) ); $this->assertEquals( date( 'r', $result['end_date'] ), date( 'r', strtotime( '25-Feb-2017 11:59:59PM' ) ) ); $this->assertEquals( date( 'r', $result['due_date'] ), date( 'r', strtotime( '28-Feb-2017 12:00PM' ) ) ); $result = $praef->calculateNextDate( $result['due_date'] );//28-Feb-2017 12:00PM $this->assertEquals( date( 'r', $result['start_date'] ), date( 'r', strtotime( '26-Feb-2017 12:00AM' ) ) ); $this->assertEquals( date( 'r', $result['end_date'] ), date( 'r', strtotime( '28-Feb-2017 11:59:59PM' ) ) ); $this->assertEquals( date( 'r', $result['due_date'] ), date( 'r', strtotime( '03-Mar-2017 12:00PM' ) ) ); } /** * @group PayrollRemittanceAgencyEvent_testTwiceMonthly */ function testTwiceMonthly() { $praef = TTnew( 'PayrollRemittanceAgencyEventFactory' ); /** @var PayrollRemittanceAgencyEventFactory $praef */ $praef->setPayrollRemittanceAgencyId( $this->agency_id ); $praef->setFrequency( 61000 ); //increase the upper bound to test a wider range. $testrange = 5; //test edges across 5 years for ( $year = ( date( 'Y' ) - $testrange ); $year <= ( date( 'Y' ) + $testrange ); $year++ ) { //January $result = $praef->calculateNextDate( strtotime( '01-Jan--' . $year . '12:00PM' ) ); $this->assertEquals( date( 'r', $result['start_date'] ), date( 'r', strtotime( '01-Jan-' . $year . ' 12:00AM' ) ) ); $this->assertEquals( date( 'r', $result['end_date'] ), date( 'r', strtotime( '31-Jan-' . $year . ' 11:59:59PM' ) ) ); $this->assertEquals( date( 'r', $result['due_date'] ), date( 'r', strtotime( '10-Feb-' . $year . '12:00PM' ) ) ); $result = $praef->calculateNextDate( strtotime( '02-Jan-' . $year . '12:00PM' ) ); $this->assertEquals( date( 'r', $result['start_date'] ), date( 'r', strtotime( '01-Jan-' . $year . ' 12:00AM' ) ) ); $this->assertEquals( date( 'r', $result['end_date'] ), date( 'r', strtotime( '31-Jan-' . $year . ' 11:59:59PM' ) ) ); $this->assertEquals( date( 'r', $result['due_date'] ), date( 'r', strtotime( '10-Feb-' . $year . '12:00PM' ) ) ); $result = $praef->calculateNextDate( strtotime( '15-Jan-' . $year . '12:00PM' ) ); $this->assertEquals( date( 'r', $result['start_date'] ), date( 'r', strtotime( '01-Jan-' . $year . ' 12:00AM' ) ) ); $this->assertEquals( date( 'r', $result['end_date'] ), date( 'r', strtotime( '31-Jan-' . $year . ' 11:59:59PM' ) ) ); $this->assertEquals( date( 'r', $result['due_date'] ), date( 'r', strtotime( '10-Feb-' . $year . '12:00PM' ) ) ); $result = $praef->calculateNextDate( strtotime( '30-Jan-' . $year . '12:00PM' ) ); $this->assertEquals( date( 'r', $result['start_date'] ), date( 'r', strtotime( '01-Jan-' . $year . ' 12:00AM' ) ) ); $this->assertEquals( date( 'r', $result['end_date'] ), date( 'r', strtotime( '31-Jan-' . $year . ' 11:59:59PM' ) ) ); $this->assertEquals( date( 'r', $result['due_date'] ), date( 'r', strtotime( '10-Feb-' . $year . '12:00PM' ) ) ); $result = $praef->calculateNextDate( strtotime( '31-Jan-' . $year . '12:00PM' ) ); $this->assertEquals( date( 'r', $result['start_date'] ), date( 'r', strtotime( '01-Jan-' . $year . ' 12:00AM' ) ) ); $this->assertEquals( date( 'r', $result['end_date'] ), date( 'r', strtotime( '31-Jan-' . $year . ' 11:59:59PM' ) ) ); $this->assertEquals( date( 'r', $result['due_date'] ), date( 'r', strtotime( '10-Feb-' . $year . '12:00PM' ) ) ); //Feb $result = $praef->calculateNextDate( strtotime( '01-Feb-' . $year . '12:00PM' ) ); $this->assertEquals( date( 'r', $result['start_date'] ), date( 'r', strtotime( '01-Feb-' . $year . ' 12:00AM' ) ) ); $this->assertEquals( date( 'r', $result['end_date'] ), date( 'r', strtotime( '15-Feb-' . $year . ' 11:59:59PM' ) ) ); $this->assertEquals( date( 'r', $result['due_date'] ), date( 'r', strtotime( '25-Feb-' . $year . '12:00PM' ) ) ); $result = $praef->calculateNextDate( strtotime( '02-Feb-' . $year . '12:00PM' ) ); $this->assertEquals( date( 'r', $result['start_date'] ), date( 'r', strtotime( '01-Feb-' . $year . ' 12:00AM' ) ) ); $this->assertEquals( date( 'r', $result['end_date'] ), date( 'r', strtotime( '15-Feb-' . $year . ' 11:59:59PM' ) ) ); $this->assertEquals( date( 'r', $result['due_date'] ), date( 'r', strtotime( '25-Feb-' . $year . '12:00PM' ) ) ); $result = $praef->calculateNextDate( strtotime( '14-Feb-' . $year . '12:00PM' ) ); $this->assertEquals( date( 'r', $result['start_date'] ), date( 'r', strtotime( '01-Feb-' . $year . ' 12:00AM' ) ) ); $this->assertEquals( date( 'r', $result['end_date'] ), date( 'r', strtotime( '15-Feb-' . $year . ' 11:59:59PM' ) ) ); $this->assertEquals( date( 'r', $result['due_date'] ), date( 'r', strtotime( '25-Feb-' . $year . '12:00PM' ) ) ); $result = $praef->calculateNextDate( strtotime( '15-Feb-' . $year . '12:00PM' ) ); $this->assertEquals( date( 'r', $result['start_date'] ), date( 'r', strtotime( '01-Feb-' . $year . ' 12:00AM' ) ) ); $this->assertEquals( date( 'r', $result['end_date'] ), date( 'r', strtotime( '15-Feb-' . $year . ' 11:59:59PM' ) ) ); $this->assertEquals( date( 'r', $result['due_date'] ), date( 'r', strtotime( '25-Feb-' . $year . '12:00PM' ) ) ); $result = $praef->calculateNextDate( strtotime( '16-Feb-' . $year . '12:00PM' ) ); $this->assertEquals( date( 'r', $result['start_date'] ), date( 'r', strtotime( '16-Feb-' . $year . ' 12:00AM' ) ) ); $this->assertEquals( date( 'r', $result['end_date'] ), date( 'r', TTDate::getEndMonthEpoch( $result['start_date'] ) ) ); $this->assertEquals( date( 'r', $result['due_date'] ), date( 'r', strtotime( '10-Mar-' . $year . '12:00PM' ) ) ); $result = $praef->calculateNextDate( strtotime( '17-Feb-' . $year . '12:00PM' ) ); $this->assertEquals( date( 'r', $result['start_date'] ), date( 'r', strtotime( '16-Feb-' . $year . ' 12:00AM' ) ) ); $this->assertEquals( date( 'r', $result['end_date'] ), date( 'r', TTDate::getEndMonthEpoch( $result['start_date'] ) ) ); $this->assertEquals( date( 'r', $result['due_date'] ), date( 'r', strtotime( '10-Mar-' . $year . '12:00PM' ) ) ); $result = $praef->calculateNextDate( strtotime( '27-Feb-' . $year . '12:00PM' ) ); $this->assertEquals( date( 'r', $result['start_date'] ), date( 'r', strtotime( '16-Feb-' . $year . ' 12:00AM' ) ) ); $this->assertEquals( date( 'r', $result['end_date'] ), date( 'r', TTDate::getEndMonthEpoch( $result['start_date'] ) ) ); $this->assertEquals( date( 'r', $result['due_date'] ), date( 'r', strtotime( '10-Mar-' . $year . '12:00PM' ) ) ); $result = $praef->calculateNextDate( strtotime( '28-Feb-' . $year . '12:00PM' ) ); $this->assertEquals( date( 'r', $result['start_date'] ), date( 'r', strtotime( '16-Feb-' . $year . ' 12:00AM' ) ) ); $this->assertEquals( date( 'r', $result['end_date'] ), date( 'r', TTDate::getEndMonthEpoch( $result['start_date'] ) ) ); $this->assertEquals( date( 'r', $result['due_date'] ), date( 'r', strtotime( '10-Mar-' . $year . '12:00PM' ) ) ); //Jul $result = $praef->calculateNextDate( strtotime( '01-Jul-' . $year . '12:00PM' ) ); $this->assertEquals( date( 'r', $result['start_date'] ), date( 'r', strtotime( '01-Jul-' . $year . ' 12:00AM' ) ) ); $this->assertEquals( date( 'r', $result['end_date'] ), date( 'r', strtotime( '15-Jul-' . $year . ' 11:59:59PM' ) ) ); $this->assertEquals( date( 'r', $result['due_date'] ), date( 'r', strtotime( '25-Jul-' . $year . '12:00PM' ) ) ); $result = $praef->calculateNextDate( strtotime( '02-Jul-' . $year . '12:00PM' ) ); $this->assertEquals( date( 'r', $result['start_date'] ), date( 'r', strtotime( '01-Jul-' . $year . ' 12:00AM' ) ) ); $this->assertEquals( date( 'r', $result['end_date'] ), date( 'r', strtotime( '15-Jul-' . $year . ' 11:59:59PM' ) ) ); $this->assertEquals( date( 'r', $result['due_date'] ), date( 'r', strtotime( '25-Jul-' . $year . '12:00PM' ) ) ); $result = $praef->calculateNextDate( strtotime( '14-Jul-' . $year . '12:00PM' ) ); $this->assertEquals( date( 'r', $result['start_date'] ), date( 'r', strtotime( '01-Jul-' . $year . ' 12:00AM' ) ) ); $this->assertEquals( date( 'r', $result['end_date'] ), date( 'r', strtotime( '15-Jul-' . $year . ' 11:59:59PM' ) ) ); $this->assertEquals( date( 'r', $result['due_date'] ), date( 'r', strtotime( '25-Jul-' . $year . '12:00PM' ) ) ); $result = $praef->calculateNextDate( strtotime( '15-Jul-' . $year . '12:00PM' ) ); $this->assertEquals( date( 'r', $result['start_date'] ), date( 'r', strtotime( '01-Jul-' . $year . ' 12:00AM' ) ) ); $this->assertEquals( date( 'r', $result['end_date'] ), date( 'r', strtotime( '15-Jul-' . $year . ' 11:59:59PM' ) ) ); $this->assertEquals( date( 'r', $result['due_date'] ), date( 'r', strtotime( '25-Jul-' . $year . '12:00PM' ) ) ); $result = $praef->calculateNextDate( strtotime( '16-Jul-' . $year . '12:00PM' ) ); $this->assertEquals( date( 'r', $result['start_date'] ), date( 'r', strtotime( '16-Jul-' . $year . ' 12:00AM' ) ) ); $this->assertEquals( date( 'r', $result['end_date'] ), date( 'r', TTDate::getEndMonthEpoch( $result['start_date'] ) ) ); $this->assertEquals( date( 'r', $result['due_date'] ), date( 'r', strtotime( '10-Aug-' . $year . '12:00PM' ) ) ); $result = $praef->calculateNextDate( strtotime( '17-Jul-' . $year . '12:00PM' ) ); $this->assertEquals( date( 'r', $result['start_date'] ), date( 'r', strtotime( '16-Jul-' . $year . ' 12:00AM' ) ) ); $this->assertEquals( date( 'r', $result['end_date'] ), date( 'r', TTDate::getEndMonthEpoch( $result['start_date'] ) ) ); $this->assertEquals( date( 'r', $result['due_date'] ), date( 'r', strtotime( '10-Aug-' . $year . '12:00PM' ) ) ); $result = $praef->calculateNextDate( strtotime( '30-Jul-' . $year . '12:00PM' ) ); $this->assertEquals( date( 'r', $result['start_date'] ), date( 'r', strtotime( '16-Jul-' . $year . ' 12:00AM' ) ) ); $this->assertEquals( date( 'r', $result['end_date'] ), date( 'r', TTDate::getEndMonthEpoch( $result['start_date'] ) ) ); $this->assertEquals( date( 'r', $result['due_date'] ), date( 'r', strtotime( '10-Aug-' . $year . '12:00PM' ) ) ); $result = $praef->calculateNextDate( strtotime( '31-Jul-' . $year . '12:00PM' ) ); $this->assertEquals( date( 'r', $result['start_date'] ), date( 'r', strtotime( '16-Jul-' . $year . ' 12:00AM' ) ) ); $this->assertEquals( date( 'r', $result['end_date'] ), date( 'r', TTDate::getEndMonthEpoch( $result['start_date'] ) ) ); $this->assertEquals( date( 'r', $result['due_date'] ), date( 'r', strtotime( '10-Aug-' . $year . '12:00PM' ) ) ); //Nov $result = $praef->calculateNextDate( strtotime( '01-Nov-' . $year . '12:00PM' ) ); $this->assertEquals( date( 'r', $result['start_date'] ), date( 'r', strtotime( '01-Nov-' . $year . ' 12:00AM' ) ) ); $this->assertEquals( date( 'r', $result['end_date'] ), date( 'r', strtotime( '15-Nov-' . $year . ' 11:59:59PM' ) ) ); $this->assertEquals( date( 'r', $result['due_date'] ), date( 'r', strtotime( '25-Nov-' . $year . '12:00PM' ) ) ); $result = $praef->calculateNextDate( strtotime( '02-Nov-' . $year . '12:00PM' ) ); $this->assertEquals( date( 'r', $result['start_date'] ), date( 'r', strtotime( '01-Nov-' . $year . ' 12:00AM' ) ) ); $this->assertEquals( date( 'r', $result['end_date'] ), date( 'r', strtotime( '15-Nov-' . $year . ' 11:59:59PM' ) ) ); $this->assertEquals( date( 'r', $result['due_date'] ), date( 'r', strtotime( '25-Nov-' . $year . '12:00PM' ) ) ); $result = $praef->calculateNextDate( strtotime( '14-Nov-' . $year . '12:00PM' ) ); $this->assertEquals( date( 'r', $result['start_date'] ), date( 'r', strtotime( '01-Nov-' . $year . ' 12:00AM' ) ) ); $this->assertEquals( date( 'r', $result['end_date'] ), date( 'r', strtotime( '15-Nov-' . $year . ' 11:59:59PM' ) ) ); $this->assertEquals( date( 'r', $result['due_date'] ), date( 'r', strtotime( '25-Nov-' . $year . '12:00PM' ) ) ); $result = $praef->calculateNextDate( strtotime( '15-Nov-' . $year . '12:00PM' ) ); $this->assertEquals( date( 'r', $result['start_date'] ), date( 'r', strtotime( '01-Nov-' . $year . ' 12:00AM' ) ) ); $this->assertEquals( date( 'r', $result['end_date'] ), date( 'r', strtotime( '15-Nov-' . $year . ' 11:59:59PM' ) ) ); $this->assertEquals( date( 'r', $result['due_date'] ), date( 'r', strtotime( '25-Nov-' . $year . '12:00PM' ) ) ); $result = $praef->calculateNextDate( strtotime( '16-Nov-' . $year . '12:00PM' ) ); $this->assertEquals( date( 'r', $result['start_date'] ), date( 'r', strtotime( '16-Nov-' . $year . ' 12:00AM' ) ) ); $this->assertEquals( date( 'r', $result['end_date'] ), date( 'r', TTDate::getEndMonthEpoch( $result['start_date'] ) ) ); $this->assertEquals( date( 'r', $result['due_date'] ), date( 'r', strtotime( '10-Dec-' . $year . '12:00PM' ) ) ); $result = $praef->calculateNextDate( strtotime( '17-Nov-' . $year . '12:00PM' ) ); $this->assertEquals( date( 'r', $result['start_date'] ), date( 'r', strtotime( '16-Nov-' . $year . ' 12:00AM' ) ) ); $this->assertEquals( date( 'r', $result['end_date'] ), date( 'r', TTDate::getEndMonthEpoch( $result['start_date'] ) ) ); $this->assertEquals( date( 'r', $result['due_date'] ), date( 'r', strtotime( '10-Dec-' . $year . '12:00PM' ) ) ); $result = $praef->calculateNextDate( strtotime( '29-Nov-' . $year . '12:00PM' ) ); $this->assertEquals( date( 'r', $result['start_date'] ), date( 'r', strtotime( '16-Nov-' . $year . ' 12:00AM' ) ) ); $this->assertEquals( date( 'r', $result['end_date'] ), date( 'r', TTDate::getEndMonthEpoch( $result['start_date'] ) ) ); $this->assertEquals( date( 'r', $result['due_date'] ), date( 'r', strtotime( '10-Dec-' . $year . '12:00PM' ) ) ); $result = $praef->calculateNextDate( strtotime( '30-Nov-' . $year . '12:00PM' ) ); $this->assertEquals( date( 'r', $result['start_date'] ), date( 'r', strtotime( '16-Nov-' . $year . ' 12:00AM' ) ) ); $this->assertEquals( date( 'r', $result['end_date'] ), date( 'r', TTDate::getEndMonthEpoch( $result['start_date'] ) ) ); $this->assertEquals( date( 'r', $result['due_date'] ), date( 'r', strtotime( '10-Dec-' . $year . '12:00PM' ) ) ); //Dec $result = $praef->calculateNextDate( strtotime( '01-Dec-' . $year . '12:00PM' ) ); $this->assertEquals( date( 'r', $result['start_date'] ), date( 'r', strtotime( '01-Dec-' . $year . ' 12:00AM' ) ) ); $this->assertEquals( date( 'r', $result['end_date'] ), date( 'r', strtotime( '15-Dec-' . $year . ' 11:59:59PM' ) ) ); $this->assertEquals( date( 'r', $result['due_date'] ), date( 'r', strtotime( '26-Dec-' . $year . '12:00PM' ) ) ); $result = $praef->calculateNextDate( strtotime( '02-Dec-' . $year . '12:00PM' ) ); $this->assertEquals( date( 'r', $result['start_date'] ), date( 'r', strtotime( '01-Dec-' . $year . ' 12:00AM' ) ) ); $this->assertEquals( date( 'r', $result['end_date'] ), date( 'r', strtotime( '15-Dec-' . $year . ' 11:59:59PM' ) ) ); $this->assertEquals( date( 'r', $result['due_date'] ), date( 'r', strtotime( '26-Dec-' . $year . '12:00PM' ) ) ); $result = $praef->calculateNextDate( strtotime( '14-Dec-' . $year . '12:00PM' ) ); $this->assertEquals( date( 'r', $result['start_date'] ), date( 'r', strtotime( '01-Dec-' . $year . ' 12:00AM' ) ) ); $this->assertEquals( date( 'r', $result['end_date'] ), date( 'r', strtotime( '15-Dec-' . $year . ' 11:59:59PM' ) ) ); $this->assertEquals( date( 'r', $result['due_date'] ), date( 'r', strtotime( '26-Dec-' . $year . '12:00PM' ) ) ); $result = $praef->calculateNextDate( strtotime( '15-Dec-' . $year . '12:00PM' ) ); $this->assertEquals( date( 'r', $result['start_date'] ), date( 'r', strtotime( '01-Dec-' . $year . ' 12:00AM' ) ) ); $this->assertEquals( date( 'r', $result['end_date'] ), date( 'r', strtotime( '15-Dec-' . $year . ' 11:59:59PM' ) ) ); $this->assertEquals( date( 'r', $result['due_date'] ), date( 'r', strtotime( '26-Dec-' . $year . '12:00PM' ) ) ); $result = $praef->calculateNextDate( strtotime( '16-Dec-' . $year . '12:00PM' ) ); $this->assertEquals( date( 'r', $result['start_date'] ), date( 'r', strtotime( '16-Dec-' . $year . ' 12:00AM' ) ) ); $this->assertEquals( date( 'r', $result['end_date'] ), date( 'r', TTDate::getEndMonthEpoch( $result['start_date'] ) ) ); $this->assertEquals( date( 'r', $result['due_date'] ), date( 'r', strtotime( '31-Jan-' . ( $year + 1 ) . '12:00PM' ) ) ); $result = $praef->calculateNextDate( strtotime( '17-Dec-' . $year . '12:00PM' ) ); $this->assertEquals( date( 'r', $result['start_date'] ), date( 'r', strtotime( '16-Dec-' . $year . ' 12:00AM' ) ) ); $this->assertEquals( date( 'r', $result['end_date'] ), date( 'r', TTDate::getEndMonthEpoch( $result['start_date'] ) ) ); $this->assertEquals( date( 'r', $result['due_date'] ), date( 'r', strtotime( '31-Jan-' . ( $year + 1 ) . '12:00PM' ) ) ); $result = $praef->calculateNextDate( strtotime( '30-Dec-' . $year . '12:00PM' ) ); $this->assertEquals( date( 'r', $result['start_date'] ), date( 'r', strtotime( '16-Dec-' . $year . ' 12:00AM' ) ) ); $this->assertEquals( date( 'r', $result['end_date'] ), date( 'r', TTDate::getEndMonthEpoch( $result['start_date'] ) ) ); $this->assertEquals( date( 'r', $result['due_date'] ), date( 'r', strtotime( '31-Jan-' . ( $year + 1 ) . '12:00PM' ) ) ); $result = $praef->calculateNextDate( strtotime( '31-Dec-' . $year . '12:00PM' ) ); $this->assertEquals( date( 'r', $result['start_date'] ), date( 'r', strtotime( '16-Dec-' . $year . ' 12:00AM' ) ) ); $this->assertEquals( date( 'r', $result['end_date'] ), date( 'r', TTDate::getEndMonthEpoch( $result['start_date'] ) ) ); $this->assertEquals( date( 'r', $result['due_date'] ), date( 'r', strtotime( '31-Jan-' . ( $year + 1 ) . '12:00PM' ) ) ); //next jan $result = $praef->calculateNextDate( strtotime( '01-Jan-' . ( $year + 1 ) . '12:00PM' ) ); $this->assertEquals( date( 'r', $result['start_date'] ), date( 'r', strtotime( '01-Jan-' . ( $year + 1 ) . '12:00AM' ) ) ); $this->assertEquals( date( 'r', $result['end_date'] ), date( 'r', strtotime( '31-Jan-' . ( $year + 1 ) . '11:59:59PM' ) ) ); $this->assertEquals( date( 'r', $result['due_date'] ), date( 'r', strtotime( '10-Feb-' . ( $year + 1 ) . '12:00PM' ) ) ); $result = $praef->calculateNextDate( strtotime( '02-Jan-' . ( $year + 1 ) . '12:00PM' ) ); $this->assertEquals( date( 'r', $result['start_date'] ), date( 'r', strtotime( '01-Jan-' . ( $year + 1 ) . '12:00AM' ) ) ); $this->assertEquals( date( 'r', $result['end_date'] ), date( 'r', strtotime( '31-Jan-' . ( $year + 1 ) . '11:59:59PM' ) ) ); $this->assertEquals( date( 'r', $result['due_date'] ), date( 'r', strtotime( '10-Feb-' . ( $year + 1 ) . '12:00PM' ) ) ); $result = $praef->calculateNextDate( strtotime( '15-Jan-' . ( $year + 1 ) . '12:00PM' ) ); $this->assertEquals( date( 'r', $result['start_date'] ), date( 'r', strtotime( '01-Jan-' . ( $year + 1 ) . '12:00AM' ) ) ); $this->assertEquals( date( 'r', $result['end_date'] ), date( 'r', strtotime( '31-Jan-' . ( $year + 1 ) . '11:59:59PM' ) ) ); $this->assertEquals( date( 'r', $result['due_date'] ), date( 'r', strtotime( '10-Feb-' . ( $year + 1 ) . '12:00PM' ) ) ); $result = $praef->calculateNextDate( strtotime( '30-Jan-' . ( $year + 1 ) . '12:00PM' ) ); $this->assertEquals( date( 'r', $result['start_date'] ), date( 'r', strtotime( '01-Jan-' . ( $year + 1 ) . '12:00AM' ) ) ); $this->assertEquals( date( 'r', $result['end_date'] ), date( 'r', strtotime( '31-Jan-' . ( $year + 1 ) . '11:59:59PM' ) ) ); $this->assertEquals( date( 'r', $result['due_date'] ), date( 'r', strtotime( '10-Feb-' . ( $year + 1 ) . '12:00PM' ) ) ); $result = $praef->calculateNextDate( strtotime( '31-Jan-' . ( $year + 1 ) . '12:00PM' ) ); $this->assertEquals( date( 'r', $result['start_date'] ), date( 'r', strtotime( '01-Jan-' . ( $year + 1 ) . '12:00AM' ) ) ); $this->assertEquals( date( 'r', $result['end_date'] ), date( 'r', strtotime( '31-Jan-' . ( $year + 1 ) . '11:59:59PM' ) ) ); $this->assertEquals( date( 'r', $result['due_date'] ), date( 'r', strtotime( '10-Feb-' . ( $year + 1 ) . '12:00PM' ) ) ); } //chained tests (like wizard) $result = $praef->calculateNextDate( strtotime( '31-Jan-2016 12:00PM' ) ); $this->assertEquals( date( 'r', $result['start_date'] ), date( 'r', strtotime( '01-Jan-2016 12:00AM' ) ) ); $this->assertEquals( date( 'r', $result['end_date'] ), date( 'r', strtotime( '31-Jan-2016 11:59:59PM' ) ) ); $this->assertEquals( date( 'r', $result['due_date'] ), date( 'r', strtotime( '10-Feb-2016 12:00PM' ) ) ); $result = $praef->calculateNextDate( $result['due_date'] );//10-Feb-2016 12:00PM $this->assertEquals( date( 'r', $result['start_date'] ), date( 'r', strtotime( '01-Feb-2016 12:00AM' ) ) ); $this->assertEquals( date( 'r', $result['end_date'] ), date( 'r', strtotime( '15-Feb-2016 11:59:59PM' ) ) ); $this->assertEquals( date( 'r', $result['due_date'] ), date( 'r', strtotime( '25-Feb-2016 12:00PM' ) ) ); $result = $praef->calculateNextDate( $result['due_date'] );//25-Feb-2016 12:00PM $this->assertEquals( date( 'r', $result['start_date'] ), date( 'r', strtotime( '16-Feb-2016 12:00AM' ) ) ); $this->assertEquals( date( 'r', $result['end_date'] ), date( 'r', strtotime( '29-Feb-2016 11:59:59PM' ) ) ); $this->assertEquals( date( 'r', $result['due_date'] ), date( 'r', strtotime( '10-Mar-2016 12:00PM' ) ) ); $result = $praef->calculateNextDate( $result['due_date'] );//10-Mar-2016 12:00PM $this->assertEquals( date( 'r', $result['start_date'] ), date( 'r', strtotime( '01-Mar-2016 12:00AM' ) ) ); $this->assertEquals( date( 'r', $result['end_date'] ), date( 'r', strtotime( '15-Mar-2016 11:59:59PM' ) ) ); $this->assertEquals( date( 'r', $result['due_date'] ), date( 'r', strtotime( '25-Mar-2016 12:00PM' ) ) ); $result = $praef->calculateNextDate( $result['due_date'] );//25-Mar-2016 12:00PM $this->assertEquals( date( 'r', $result['start_date'] ), date( 'r', strtotime( '16-Mar-2016 12:00AM' ) ) ); $this->assertEquals( date( 'r', $result['end_date'] ), date( 'r', strtotime( '31-Mar-2016 11:59:59PM' ) ) ); $this->assertEquals( date( 'r', $result['due_date'] ), date( 'r', strtotime( '10-Apr-2016 12:00PM' ) ) ); $result = $praef->calculateNextDate( $result['due_date'] );//10-Apr-2016 12:00PM $this->assertEquals( date( 'r', $result['start_date'] ), date( 'r', strtotime( '01-Apr-2016 12:00AM' ) ) ); $this->assertEquals( date( 'r', $result['end_date'] ), date( 'r', strtotime( '15-Apr-2016 11:59:59PM' ) ) ); $this->assertEquals( date( 'r', $result['due_date'] ), date( 'r', strtotime( '25-Apr-2016 12:00PM' ) ) ); $result = $praef->calculateNextDate( $result['due_date'] );//25-Apr-2016 12:00PM $this->assertEquals( date( 'r', $result['start_date'] ), date( 'r', strtotime( '16-Apr-2016 12:00AM' ) ) ); $this->assertEquals( date( 'r', $result['end_date'] ), date( 'r', strtotime( '30-Apr-2016 11:59:59PM' ) ) ); $this->assertEquals( date( 'r', $result['due_date'] ), date( 'r', strtotime( '10-May-2016 12:00PM' ) ) ); $result = $praef->calculateNextDate( $result['due_date'] );//10-May-2016 12:00PM $this->assertEquals( date( 'r', $result['start_date'] ), date( 'r', strtotime( '01-May-2016 12:00AM' ) ) ); $this->assertEquals( date( 'r', $result['end_date'] ), date( 'r', strtotime( '15-May-2016 11:59:59PM' ) ) ); $this->assertEquals( date( 'r', $result['due_date'] ), date( 'r', strtotime( '25-May-2016 12:00PM' ) ) ); $result = $praef->calculateNextDate( $result['due_date'] );//25-May-2016 12:00PM $this->assertEquals( date( 'r', $result['start_date'] ), date( 'r', strtotime( '16-May-2016 12:00AM' ) ) ); $this->assertEquals( date( 'r', $result['end_date'] ), date( 'r', strtotime( '31-May-2016 11:59:59PM' ) ) ); $this->assertEquals( date( 'r', $result['due_date'] ), date( 'r', strtotime( '10-Jun-2016 12:00PM' ) ) ); $result = $praef->calculateNextDate( $result['due_date'] );//10-Jun-2016 12:00PM $this->assertEquals( date( 'r', $result['start_date'] ), date( 'r', strtotime( '01-Jun-2016 12:00AM' ) ) ); $this->assertEquals( date( 'r', $result['end_date'] ), date( 'r', strtotime( '15-Jun-2016 11:59:59PM' ) ) ); $this->assertEquals( date( 'r', $result['due_date'] ), date( 'r', strtotime( '25-Jun-2016 12:00PM' ) ) ); $result = $praef->calculateNextDate( $result['due_date'] );//25-Jun-2016 12:00PM $this->assertEquals( date( 'r', $result['start_date'] ), date( 'r', strtotime( '16-Jun-2016 12:00AM' ) ) ); $this->assertEquals( date( 'r', $result['end_date'] ), date( 'r', strtotime( '30-Jun-2016 11:59:59PM' ) ) ); $this->assertEquals( date( 'r', $result['due_date'] ), date( 'r', strtotime( '10-Jul-2016 12:00PM' ) ) ); } function setupPayPeriodTest( $seed_date ) { $pay_period_schedule_id = $this->createPayPeriodSchedule(); $this->assertEquals( true, TTUUID::isUUID( $pay_period_schedule_id ), '$pay_period_schedule_id is not a uuid ' ); $psa_id = $this->createPayStubAccounts(); $cdf = new CompanyDeductionFactory(); $cdf->setPayrollRemittanceAgency( $this->agency_id ); $cdf->setCompany( $this->company_id ); $cdf->setCountry( 'CA' ); $cdf->setProvince( 'BC' ); $cdf->setLegalEntity( $this->legal_entity_id ); $cdf->setStatus( 10 ); $cdf->setType( 10 ); $cdf->setName( 'Auto-generated Company Deduction' ); $cdf->setCalculation( 15 ); $cdf->setCalculationOrder( 186 ); $cdf->setPayStubEntryAccount( $psa_id ); $cd_id = $cdf->save( false ); $udf = new UserDeductionFactory(); $udf->setUser( $this->user_id ); $udf->setCompanyDeduction( $cd_id ); $udf->save(); $this->createPayPeriods( $seed_date, $pay_period_schedule_id ); $this->getAllPayPeriods( $pay_period_schedule_id ); //return the payperiodschedule object so that we can call $ppsf->createNextPayPeriod( $date ) in our tests; return $pay_period_schedule_id; } /** * @group PayrollRemittanceAgencyEvent_testPayPeriodA */ function testPayPeriodA() { $test_start_date = strtotime( '01-Jan-2017 12:00PM' ); //should be day before first pay perdio start date. $ppsf_id = $this->setupPayPeriodTest( $test_start_date ); $this->assertEquals( true, TTUUID::isUUID( $ppsf_id ), 'Pay period schedule must be an object.' ); $praef = TTnew( 'PayrollRemittanceAgencyEventFactory' ); /** @var PayrollRemittanceAgencyEventFactory $praef */ $praef->setId( $praef->getNextInsertId() ); $praef->setPayrollRemittanceAgencyId( $this->agency_id ); $praef->setStatus( 10 ); $praef->setType( 'T4SD' ); $praef->setFrequency( 1000 ); $praef->setDueDateDelayDays( 0 ); $praef->setReminderDays( 3 ); $praef->setPayPeriodSchedule( [ $ppsf_id ] ); if ( $praef->isValid() ) { $praef->Save( false ); } $test_start_date = strtotime( '02-Jan-2017 12:00PM' ); //Should be after the start date of the first pay period to mimic a transaction date. $pp_obj = $this->pay_period_objs[0]; $test_date = $test_start_date; Debug::text( 'Loop Test...', __FILE__, __LINE__, __METHOD__, 10 ); //testing every day in every pay period: $result = $praef->calculateNextDate( $test_date ); $this->assertEquals( true, is_array( $result ), '$result should be an array.' ); $this->assertCount( 4, $result, '$result should have 3 elements.' ); $this->assertEquals( date( 'r', $result['due_date'] ), date( 'r', ( $pp_obj->getTransactionDate() + ( $praef->getDueDateDelayDays() * 86400 ) ) ), 'Due date Matches.' ); $loop_counter = 1; while ( $test_date <= $pp_obj->getEndDate() && $test_date < strtotime( '01-Jan-2020' ) ) { $test_date = TTDate::incrementDate( $test_date, 1, 'day' ); $result = $praef->calculateNextDate( $test_date ); $this->assertEquals( date( 'r', $result['due_date'] ), date( 'r', ( $pp_obj->getTransactionDate() + ( $praef->getDueDateDelayDays() * 86400 ) ) ), 'Due date Matches.' ); $loop_counter++; } //testing with static values: Debug::text( 'Static Test...', __FILE__, __LINE__, __METHOD__, 10 ); $praef->setDueDateDelayDays( 0 ); $pp_obj = $this->pay_period_objs[0]; $result = $praef->calculateNextDate( $pp_obj->getTransactionDate() ); $this->assertEquals( true, is_array( $result ), '$result should be an array.' ); $this->assertCount( 4, $result, '$result should have 3 elements.' ); $this->assertEquals( date( 'r', $result['start_date'] ), date( 'r', strtotime( '21-Jan-2017' ) ), 'Start date Matches.' ); $this->assertEquals( date( 'r', $result['end_date'] ), date( 'r', strtotime( '03-Feb-2017 23:59:59' ) ), 'End date Matches.' ); $this->assertEquals( date( 'r', $result['due_date'] ), date( 'r', strtotime( '03-Feb-2017 12:00:00' ) ), 'Due date Matches.' ); $pp_obj = $this->pay_period_objs[1]; $praef->setDueDateDelayDays( 3 ); $result = $praef->calculateNextDate( $pp_obj->getTransactionDate() ); $this->assertEquals( true, is_array( $result ), '$result should be an array.' ); $this->assertCount( 4, $result, '$result should have 3 elements.' ); $this->assertEquals( date( 'r', $result['start_date'] ), date( 'r', strtotime( '04-Feb-2017' ) ), 'Start date Matches.' ); $this->assertEquals( date( 'r', $result['end_date'] ), date( 'r', strtotime( '17-Feb-2017 23:59:59' ) ), 'End date Matches.' ); $this->assertEquals( date( 'r', $result['due_date'] ), date( 'r', strtotime( '20-Feb-2017 12:00:00' ) ), 'Due date Matches.' ); $pp_obj = $this->pay_period_objs[2]; $praef->setDueDateDelayDays( 6 ); $result = $praef->calculateNextDate( $pp_obj->getTransactionDate() ); $this->assertEquals( true, is_array( $result ), '$result should be an array.' ); $this->assertCount( 4, $result, '$result should have 3 elements.' ); $this->assertEquals( date( 'r', $result['start_date'] ), date( 'r', strtotime( '18-Feb-2017' ) ), 'Start date Matches.' ); $this->assertEquals( date( 'r', $result['end_date'] ), date( 'r', strtotime( '03-Mar-2017 23:59:59' ) ), 'End date Matches.' ); $this->assertEquals( date( 'r', $result['due_date'] ), date( 'r', strtotime( '09-Mar-2017 12:00:00' ) ), 'Due date Matches.' ); $pp_obj = $this->pay_period_objs[3]; $praef->setDueDateDelayDays( 9 ); $result = $praef->calculateNextDate( $pp_obj->getTransactionDate() ); $this->assertEquals( true, is_array( $result ), '$result should be an array.' ); $this->assertCount( 4, $result, '$result should have 3 elements.' ); $this->assertEquals( date( 'r', $result['start_date'] ), date( 'r', strtotime( '04-Mar-2017' ) ), 'Start date Matches.' ); $this->assertEquals( date( 'r', $result['end_date'] ), date( 'r', strtotime( '17-Mar-2017 23:59:59' ) ), 'End date Matches.' ); $this->assertEquals( date( 'r', $result['due_date'] ), date( 'r', strtotime( '26-Mar-2017 12:00:00' ) ), 'Due date Matches.' ); Debug::text( 'Wizard Test...', __FILE__, __LINE__, __METHOD__, 10 ); $praef->setDueDateDelayDays( 0 ); //chained tests (like wizard) also iterates through all 4 pay periods $pp_obj = $this->pay_period_objs[0]; $result = $praef->calculateNextDate( $pp_obj->getTransactionDate() ); $this->assertEquals( date( 'r', $result['start_date'] ), date( 'r', strtotime( '21-Jan-2017' ) ), 'Start date Matches.' ); $this->assertEquals( date( 'r', $result['end_date'] ), date( 'r', strtotime( '03-Feb-2017 23:59:59' ) ), 'End date Matches.' ); $this->assertEquals( date( 'r', $result['due_date'] ), date( 'r', strtotime( '03-Feb-2017 12:00:00' ) ), 'Due date Matches.' ); $praef->setDueDateDelayDays( 3 ); //Needs to use end_date, because due_date can be all over the map due to the due date delay. $result = $praef->calculateNextDate( $result['end_date'] ); //03-Feb-2017 12:00:00 $this->assertEquals( date( 'r', $result['start_date'] ), date( 'r', strtotime( '04-Feb-2017' ) ), 'Start date Matches.' ); $this->assertEquals( date( 'r', $result['end_date'] ), date( 'r', strtotime( '17-Feb-2017 23:59:59' ) ), 'End date Matches.' ); $this->assertEquals( date( 'r', $result['due_date'] ), date( 'r', strtotime( '20-Feb-2017 12:00:00' ) ), 'Due date Matches.' ); $praef->setDueDateDelayDays( 6 ); $result = $praef->calculateNextDate( $result['end_date'] ); //17-Feb-2017 12:00:00 $this->assertEquals( date( 'r', $result['start_date'] ), date( 'r', strtotime( '18-Feb-2017' ) ), 'Start date Matches.' ); $this->assertEquals( date( 'r', $result['end_date'] ), date( 'r', strtotime( '03-Mar-2017 23:59:59' ) ), 'End date Matches.' ); $this->assertEquals( date( 'r', $result['due_date'] ), date( 'r', strtotime( '09-Mar-2017 12:00:00' ) ), 'Due date Matches.' ); $praef->setDueDateDelayDays( 9 ); $result = $praef->calculateNextDate( $result['end_date'] ); //17-Mar-2017 12:00:00 $this->assertEquals( date( 'r', $result['start_date'] ), date( 'r', strtotime( '04-Mar-2017' ) ), 'Start date Matches.' ); $this->assertEquals( date( 'r', $result['end_date'] ), date( 'r', strtotime( '17-Mar-2017 23:59:59' ) ), 'End date Matches.' ); $this->assertEquals( date( 'r', $result['due_date'] ), date( 'r', strtotime( '26-Mar-2017 12:00:00' ) ), 'Due date Matches.' ); } /** * @group PayrollRemittanceAgencyEvent_testPayPeriodB */ function testPayPeriodB() { $test_start_date = strtotime( '01-Jan-2017 12:00PM' ); //Should be day before first pay period start date. $ppsf_id = $this->setupPayPeriodTest( $test_start_date ); $this->assertEquals( true, TTUUID::isUUID( $ppsf_id ), 'Pay period schedule must be an object.' ); $praef = TTnew( 'PayrollRemittanceAgencyEventFactory' ); /** @var PayrollRemittanceAgencyEventFactory $praef */ $praef->setId( $praef->getNextInsertId() ); $praef->setPayrollRemittanceAgencyId( $this->agency_id ); $praef->setStatus( 10 ); $praef->setType( 'T4SD' ); $praef->setFrequency( 1000 ); $praef->setDueDateDelayDays( 1 ); $praef->setReminderDays( 3 ); $praef->setPayPeriodSchedule( [ $ppsf_id ] ); if ( $praef->isValid() ) { $praef->Save( false ); } $test_start_date = strtotime( '02-Jan-2017 12:00PM' ); //Should be after the start date of the first pay period to mimic a transaction date. $pp_obj = $this->pay_period_objs[0]; $test_date = $test_start_date; Debug::text( 'Loop Test...', __FILE__, __LINE__, __METHOD__, 10 ); //testing every day in every pay period: $result = $praef->calculateNextDate( $test_date ); $this->assertEquals( true, is_array( $result ), '$result should be an array.' ); $this->assertCount( 4, $result, '$result should have 3 elements.' ); $this->assertEquals( date( 'r', $result['due_date'] ), date( 'r', ( $pp_obj->getTransactionDate() + ( $praef->getDueDateDelayDays() * 86400 ) ) ), 'Due date Matches.' ); $loop_counter = 1; while ( $test_date <= $pp_obj->getEndDate() && $test_date < strtotime( '01-Jan-2020' ) ) { $test_date = TTDate::incrementDate( $test_date, 1, 'day' ); $result = $praef->calculateNextDate( $test_date ); $this->assertEquals( date( 'r', $result['due_date'] ), date( 'r', ( $pp_obj->getTransactionDate() + ( $praef->getDueDateDelayDays() * 86400 ) ) ), 'Due date Matches.' ); $loop_counter++; } //testing with static values: Debug::text( 'Static Test...', __FILE__, __LINE__, __METHOD__, 10 ); $praef->setDueDateDelayDays( 0 ); $pp_obj = $this->pay_period_objs[0]; $result = $praef->calculateNextDate( $pp_obj->getTransactionDate() ); $this->assertEquals( true, is_array( $result ), '$result should be an array.' ); $this->assertCount( 4, $result, '$result should have 3 elements.' ); $this->assertEquals( date( 'r', $result['start_date'] ), date( 'r', strtotime( '21-Jan-2017' ) ), 'Start date Matches.' ); $this->assertEquals( date( 'r', $result['end_date'] ), date( 'r', strtotime( '03-Feb-2017 23:59:59' ) ), 'End date Matches.' ); $this->assertEquals( date( 'r', $result['due_date'] ), date( 'r', strtotime( '03-Feb-2017 12:00:00' ) ), 'Due date Matches.' ); $pp_obj = $this->pay_period_objs[1]; $praef->setDueDateDelayDays( 3 ); $result = $praef->calculateNextDate( $pp_obj->getTransactionDate() ); $this->assertEquals( true, is_array( $result ), '$result should be an array.' ); $this->assertCount( 4, $result, '$result should have 3 elements.' ); $this->assertEquals( date( 'r', $result['start_date'] ), date( 'r', strtotime( '04-Feb-2017' ) ), 'Start date Matches.' ); $this->assertEquals( date( 'r', $result['end_date'] ), date( 'r', strtotime( '17-Feb-2017 23:59:59' ) ), 'End date Matches.' ); $this->assertEquals( date( 'r', $result['due_date'] ), date( 'r', strtotime( '20-Feb-2017 12:00:00' ) ), 'Due date Matches.' ); $pp_obj = $this->pay_period_objs[2]; $praef->setDueDateDelayDays( 6 ); $result = $praef->calculateNextDate( $pp_obj->getTransactionDate() ); $this->assertEquals( true, is_array( $result ), '$result should be an array.' ); $this->assertCount( 4, $result, '$result should have 3 elements.' ); $this->assertEquals( date( 'r', $result['start_date'] ), date( 'r', strtotime( '18-Feb-2017' ) ), 'Start date Matches.' ); $this->assertEquals( date( 'r', $result['end_date'] ), date( 'r', strtotime( '03-Mar-2017 23:59:59' ) ), 'End date Matches.' ); $this->assertEquals( date( 'r', $result['due_date'] ), date( 'r', strtotime( '09-Mar-2017 12:00:00' ) ), 'Due date Matches.' ); $pp_obj = $this->pay_period_objs[3]; $praef->setDueDateDelayDays( 9 ); $result = $praef->calculateNextDate( $pp_obj->getTransactionDate() ); $this->assertEquals( true, is_array( $result ), '$result should be an array.' ); $this->assertCount( 4, $result, '$result should have 3 elements.' ); $this->assertEquals( date( 'r', $result['start_date'] ), date( 'r', strtotime( '04-Mar-2017' ) ), 'Start date Matches.' ); $this->assertEquals( date( 'r', $result['end_date'] ), date( 'r', strtotime( '17-Mar-2017 23:59:59' ) ), 'End date Matches.' ); $this->assertEquals( date( 'r', $result['due_date'] ), date( 'r', strtotime( '26-Mar-2017 12:00:00' ) ), 'Due date Matches.' ); Debug::text( 'Wizard Test...', __FILE__, __LINE__, __METHOD__, 10 ); $praef->setDueDateDelayDays( 0 ); //chained tests (like wizard) also iterates through all 4 pay periods $pp_obj = $this->pay_period_objs[0]; $result = $praef->calculateNextDate( $pp_obj->getTransactionDate() ); $this->assertEquals( date( 'r', $result['start_date'] ), date( 'r', strtotime( '21-Jan-2017' ) ), 'Start date Matches.' ); $this->assertEquals( date( 'r', $result['end_date'] ), date( 'r', strtotime( '03-Feb-2017 23:59:59' ) ), 'End date Matches.' ); $this->assertEquals( date( 'r', $result['due_date'] ), date( 'r', strtotime( '03-Feb-2017 12:00:00' ) ), 'Due date Matches.' ); $praef->setDueDateDelayDays( 3 ); //Needs to use end_date, because due_date can be all over the map due to the due date delay. $result = $praef->calculateNextDate( $result['end_date'] ); //03-Feb-2017 12:00:00 $this->assertEquals( date( 'r', $result['start_date'] ), date( 'r', strtotime( '04-Feb-2017' ) ), 'Start date Matches.' ); $this->assertEquals( date( 'r', $result['end_date'] ), date( 'r', strtotime( '17-Feb-2017 23:59:59' ) ), 'End date Matches.' ); $this->assertEquals( date( 'r', $result['due_date'] ), date( 'r', strtotime( '20-Feb-2017 12:00:00' ) ), 'Due date Matches.' ); $praef->setDueDateDelayDays( 6 ); $result = $praef->calculateNextDate( $result['end_date'] ); //17-Feb-2017 12:00:00 $this->assertEquals( date( 'r', $result['start_date'] ), date( 'r', strtotime( '18-Feb-2017' ) ), 'Start date Matches.' ); $this->assertEquals( date( 'r', $result['end_date'] ), date( 'r', strtotime( '03-Mar-2017 23:59:59' ) ), 'End date Matches.' ); $this->assertEquals( date( 'r', $result['due_date'] ), date( 'r', strtotime( '09-Mar-2017 12:00:00' ) ), 'Due date Matches.' ); $praef->setDueDateDelayDays( 9 ); $result = $praef->calculateNextDate( $result['end_date'] ); //17-Mar-2017 12:00:00 $this->assertEquals( date( 'r', $result['start_date'] ), date( 'r', strtotime( '04-Mar-2017' ) ), 'Start date Matches.' ); $this->assertEquals( date( 'r', $result['end_date'] ), date( 'r', strtotime( '17-Mar-2017 23:59:59' ) ), 'End date Matches.' ); $this->assertEquals( date( 'r', $result['due_date'] ), date( 'r', strtotime( '26-Mar-2017 12:00:00' ) ), 'Due date Matches.' ); } /** * @group PayrollRemittanceAgencyEvent_testPayPeriodC */ function testPayPeriodC() { $test_start_date = strtotime( '01-Jan-2017 12:00PM' ); //should be day before first pay perdio start date. $ppsf_id = $this->setupPayPeriodTest( $test_start_date ); $this->assertEquals( true, TTUUID::isUUID( $ppsf_id ), 'Pay period schedule must be an object.' ); $praef = TTnew( 'PayrollRemittanceAgencyEventFactory' ); /** @var PayrollRemittanceAgencyEventFactory $praef */ $praef->setId( $praef->getNextInsertId() ); $praef->setPayrollRemittanceAgencyId( $this->agency_id ); $praef->setStatus( 10 ); $praef->setType( 'T4SD' ); $praef->setFrequency( 1000 ); $praef->setDueDateDelayDays( 1 ); $praef->setReminderDays( 3 ); $praef->setPayPeriodSchedule( [ $ppsf_id ] ); if ( $praef->isValid() ) { $praef->Save( false ); } $test_start_date = strtotime( '02-Jan-2017 12:00PM' ); //Should be after the start date of the first pay period to mimic a transaction date. $praef->setLastDueDate( $test_start_date ); Debug::text( 'Static Test...', __FILE__, __LINE__, __METHOD__, 10 ); $praef->setEnableRecalculateDates( true ); if ( $praef->isValid() ) { $praef->Save( false ); } $this->assertEquals( date( 'r', $praef->getStartDate() ), date( 'r', strtotime( '03-Jan-2017' ) ), 'Start date Matches.' ); $this->assertEquals( date( 'r', $praef->getEndDate() ), date( 'r', strtotime( '20-Jan-2017 23:59:59' ) ), 'End date Matches.' ); $this->assertEquals( date( 'r', $praef->getDueDate() ), date( 'r', strtotime( '21-Jan-2017 12:00:00' ) ), 'Due date Matches.' ); $praef->setLastDueDate( $praef->getDueDate() ); $praef->setEnableRecalculateDates( true ); if ( $praef->isValid() ) { $praef->Save( false ); } $this->assertEquals( date( 'r', $praef->getStartDate() ), date( 'r', strtotime( '21-Jan-2017' ) ), 'Start date Matches.' ); $this->assertEquals( date( 'r', $praef->getEndDate() ), date( 'r', strtotime( '03-Feb-2017 23:59:59' ) ), 'End date Matches.' ); $this->assertEquals( date( 'r', $praef->getDueDate() ), date( 'r', strtotime( '04-Feb-2017 12:00:00' ) ), 'Due date Matches.' ); $praef->setLastDueDate( $praef->getDueDate() ); $praef->setEnableRecalculateDates( true ); if ( $praef->isValid() ) { $praef->Save( false ); } $this->assertEquals( date( 'r', $praef->getStartDate() ), date( 'r', strtotime( '04-Feb-2017' ) ), 'Start date Matches.' ); $this->assertEquals( date( 'r', $praef->getEndDate() ), date( 'r', strtotime( '17-Feb-2017 23:59:59' ) ), 'End date Matches.' ); $this->assertEquals( date( 'r', $praef->getDueDate() ), date( 'r', strtotime( '18-Feb-2017 12:00:00' ) ), 'Due date Matches.' ); $praef->setLastDueDate( $praef->getDueDate() ); $praef->setEnableRecalculateDates( true ); if ( $praef->isValid() ) { $praef->Save( false ); } $this->assertEquals( date( 'r', $praef->getStartDate() ), date( 'r', strtotime( '18-Feb-2017' ) ), 'Start date Matches.' ); $this->assertEquals( date( 'r', $praef->getEndDate() ), date( 'r', strtotime( '03-Mar-2017 23:59:59' ) ), 'End date Matches.' ); $this->assertEquals( date( 'r', $praef->getDueDate() ), date( 'r', strtotime( '04-Mar-2017 12:00:00' ) ), 'Due date Matches.' ); $praef->setLastDueDate( $praef->getDueDate() ); } /** * @group PayrollRemittanceAgencyEvent_testMonthlyQuarterExceptions */ function testMonthlyQuarterExceptions() { //US - Monthly (Quarter Exceptions) //Due the 15th day of the month following the monthly withholding period, except for March, June, September and December; then due the last day of the month following the withholding period. $praef = TTnew( 'PayrollRemittanceAgencyEventFactory' ); /** @var PayrollRemittanceAgencyEventFactory $praef */ $praef->setPayrollRemittanceAgencyId( $this->agency_id ); $praef->setFrequency( 60000 ); $result = $praef->calculateNextDate( strtotime( '01-Jan-2017 12:00PM' ) ); $this->assertEquals( true, is_array( $result ), '$result should be an array.' ); $this->assertCount( 3, $result, '$result should have 3 elements.' ); $this->assertEquals( date( 'r', $result['start_date'] ), date( 'r', strtotime( '01-Jan-2017' ) ), 'Start date Matches.' ); $this->assertEquals( date( 'r', $result['end_date'] ), date( 'r', strtotime( '31-Jan-2017 23:59:59' ) ), 'End date Matches.' ); $this->assertEquals( date( 'r', $result['due_date'] ), date( 'r', strtotime( '15-Feb-2017 12:00:00' ) ), 'Due date Matches.' ); $result = $praef->calculateNextDate( strtotime( '02-Jan-2017 12:00PM' ) ); $this->assertEquals( date( 'r', $result['start_date'] ), date( 'r', strtotime( '01-Jan-2017' ) ), 'Start date Matches.' ); $this->assertEquals( date( 'r', $result['end_date'] ), date( 'r', strtotime( '31-Jan-2017 23:59:59' ) ), 'End date Matches.' ); $this->assertEquals( date( 'r', $result['due_date'] ), date( 'r', strtotime( '15-Feb-2017 12:00:00' ) ), 'Due date Matches.' ); $result = $praef->calculateNextDate( strtotime( '16-Jan-2017 12:00PM' ) ); $this->assertEquals( date( 'r', $result['start_date'] ), date( 'r', strtotime( '01-Jan-2017' ) ), 'Start date Matches.' ); $this->assertEquals( date( 'r', $result['end_date'] ), date( 'r', strtotime( '31-Jan-2017 23:59:59' ) ), 'End date Matches.' ); $this->assertEquals( date( 'r', $result['due_date'] ), date( 'r', strtotime( '15-Feb-2017 12:00:00' ) ), 'Due date Matches.' ); $result = $praef->calculateNextDate( strtotime( '30-Jan-2017 12:00PM' ) ); $this->assertEquals( date( 'r', $result['start_date'] ), date( 'r', strtotime( '01-Jan-2017' ) ), 'Start date Matches.' ); $this->assertEquals( date( 'r', $result['end_date'] ), date( 'r', strtotime( '31-Jan-2017 23:59:59' ) ), 'End date Matches.' ); $this->assertEquals( date( 'r', $result['due_date'] ), date( 'r', strtotime( '15-Feb-2017 12:00:00' ) ), 'Due date Matches.' ); $result = $praef->calculateNextDate( strtotime( '31-Jan-2017 12:00PM' ) ); $this->assertEquals( date( 'r', $result['start_date'] ), date( 'r', strtotime( '01-Jan-2017' ) ), 'Start date Matches.' ); $this->assertEquals( date( 'r', $result['end_date'] ), date( 'r', strtotime( '31-Jan-2017 23:59:59' ) ), 'End date Matches.' ); $this->assertEquals( date( 'r', $result['due_date'] ), date( 'r', strtotime( '15-Feb-2017 12:00:00' ) ), 'Due date Matches.' ); $result = $praef->calculateNextDate( strtotime( '01-Feb-2017 12:00PM' ) ); $this->assertEquals( date( 'r', $result['start_date'] ), date( 'r', strtotime( '01-Feb-2017' ) ), 'Start date Matches.' ); $this->assertEquals( date( 'r', $result['end_date'] ), date( 'r', strtotime( '28-Feb-2017 23:59:59' ) ), 'End date Matches.' ); $this->assertEquals( date( 'r', $result['due_date'] ), date( 'r', strtotime( '15-Mar-2017 12:00:00' ) ), 'Due date Matches.' ); $result = $praef->calculateNextDate( strtotime( '28-Feb-2017 12:00PM' ) ); $this->assertEquals( date( 'r', $result['start_date'] ), date( 'r', strtotime( '01-Feb-2017' ) ), 'Start date Matches.' ); $this->assertEquals( date( 'r', $result['end_date'] ), date( 'r', strtotime( '28-Feb-2017 23:59:59' ) ), 'End date Matches.' ); $this->assertEquals( date( 'r', $result['due_date'] ), date( 'r', strtotime( '15-Mar-2017 12:00:00' ) ), 'Due date Matches.' ); $result = $praef->calculateNextDate( strtotime( '01-Mar-2017 12:00PM' ) ); $this->assertEquals( date( 'r', $result['start_date'] ), date( 'r', strtotime( '01-Mar-2017' ) ), 'Start date Matches.' ); $this->assertEquals( date( 'r', $result['end_date'] ), date( 'r', strtotime( '31-Mar-2017 23:59:59' ) ), 'End date Matches.' ); $this->assertEquals( date( 'r', $result['due_date'] ), date( 'r', strtotime( '30-Apr-2017 12:00:00' ) ), 'Due date Matches.' ); $result = $praef->calculateNextDate( strtotime( '31-Mar-2017 12:00PM' ) ); $this->assertEquals( date( 'r', $result['start_date'] ), date( 'r', strtotime( '01-Mar-2017' ) ), 'Start date Matches.' ); $this->assertEquals( date( 'r', $result['end_date'] ), date( 'r', strtotime( '31-Mar-2017 23:59:59' ) ), 'End date Matches.' ); $this->assertEquals( date( 'r', $result['due_date'] ), date( 'r', strtotime( '30-Apr-2017 12:00:00' ) ), 'Due date Matches.' ); $result = $praef->calculateNextDate( strtotime( '01-Apr-2017 12:00PM' ) ); $this->assertEquals( date( 'r', $result['start_date'] ), date( 'r', strtotime( '01-Apr-2017' ) ), 'Start date Matches.' ); $this->assertEquals( date( 'r', $result['end_date'] ), date( 'r', strtotime( '30-Apr-2017 23:59:59' ) ), 'End date Matches.' ); $this->assertEquals( date( 'r', $result['due_date'] ), date( 'r', strtotime( '15-May-2017 12:00:00' ) ), 'Due date Matches.' ); $result = $praef->calculateNextDate( strtotime( '30-Apr-2017 12:00PM' ) ); $this->assertEquals( date( 'r', $result['start_date'] ), date( 'r', strtotime( '01-Apr-2017' ) ), 'Start date Matches.' ); $this->assertEquals( date( 'r', $result['end_date'] ), date( 'r', strtotime( '30-Apr-2017 23:59:59' ) ), 'End date Matches.' ); $this->assertEquals( date( 'r', $result['due_date'] ), date( 'r', strtotime( '15-May-2017 12:00:00' ) ), 'Due date Matches.' ); $result = $praef->calculateNextDate( strtotime( '01-May-2017 12:00PM' ) ); $this->assertEquals( date( 'r', $result['start_date'] ), date( 'r', strtotime( '01-May-2017' ) ), 'Start date Matches.' ); $this->assertEquals( date( 'r', $result['end_date'] ), date( 'r', strtotime( '31-May-2017 23:59:59' ) ), 'End date Matches.' ); $this->assertEquals( date( 'r', $result['due_date'] ), date( 'r', strtotime( '15-Jun-2017 12:00:00' ) ), 'Due date Matches.' ); $result = $praef->calculateNextDate( strtotime( '31-May-2017 12:00PM' ) ); $this->assertEquals( date( 'r', $result['start_date'] ), date( 'r', strtotime( '01-May-2017' ) ), 'Start date Matches.' ); $this->assertEquals( date( 'r', $result['end_date'] ), date( 'r', strtotime( '31-May-2017 23:59:59' ) ), 'End date Matches.' ); $this->assertEquals( date( 'r', $result['due_date'] ), date( 'r', strtotime( '15-Jun-2017 12:00:00' ) ), 'Due date Matches.' ); $result = $praef->calculateNextDate( strtotime( '01-Jun-2017 12:00PM' ) ); $this->assertEquals( date( 'r', $result['start_date'] ), date( 'r', strtotime( '01-Jun-2017' ) ), 'Start date Matches.' ); $this->assertEquals( date( 'r', $result['end_date'] ), date( 'r', strtotime( '30-Jun-2017 23:59:59' ) ), 'End date Matches.' ); $this->assertEquals( date( 'r', $result['due_date'] ), date( 'r', strtotime( '31-Jul-2017 12:00:00' ) ), 'Due date Matches.' ); $result = $praef->calculateNextDate( strtotime( '30-Jun-2017 12:00PM' ) ); $this->assertEquals( date( 'r', $result['start_date'] ), date( 'r', strtotime( '01-Jun-2017' ) ), 'Start date Matches.' ); $this->assertEquals( date( 'r', $result['end_date'] ), date( 'r', strtotime( '30-Jun-2017 23:59:59' ) ), 'End date Matches.' ); $this->assertEquals( date( 'r', $result['due_date'] ), date( 'r', strtotime( '31-Jul-2017 12:00:00' ) ), 'Due date Matches.' ); $result = $praef->calculateNextDate( strtotime( '01-Jul-2017 12:00PM' ) ); $this->assertEquals( date( 'r', $result['start_date'] ), date( 'r', strtotime( '01-Jul-2017' ) ), 'Start date Matches.' ); $this->assertEquals( date( 'r', $result['end_date'] ), date( 'r', strtotime( '31-Jul-2017 23:59:59' ) ), 'End date Matches.' ); $this->assertEquals( date( 'r', $result['due_date'] ), date( 'r', strtotime( '15-Aug-2017 12:00:00' ) ), 'Due date Matches.' ); $result = $praef->calculateNextDate( strtotime( '31-Jul-2017 12:00PM' ) ); $this->assertEquals( date( 'r', $result['start_date'] ), date( 'r', strtotime( '01-Jul-2017' ) ), 'Start date Matches.' ); $this->assertEquals( date( 'r', $result['end_date'] ), date( 'r', strtotime( '31-Jul-2017 23:59:59' ) ), 'End date Matches.' ); $this->assertEquals( date( 'r', $result['due_date'] ), date( 'r', strtotime( '15-Aug-2017 12:00:00' ) ), 'Due date Matches.' ); $result = $praef->calculateNextDate( strtotime( '01-Aug-2017 12:00PM' ) ); $this->assertEquals( date( 'r', $result['start_date'] ), date( 'r', strtotime( '01-Aug-2017' ) ), 'Start date Matches.' ); $this->assertEquals( date( 'r', $result['end_date'] ), date( 'r', strtotime( '31-Aug-2017 23:59:59' ) ), 'End date Matches.' ); $this->assertEquals( date( 'r', $result['due_date'] ), date( 'r', strtotime( '15-Sep-2017 12:00:00' ) ), 'Due date Matches.' ); $result = $praef->calculateNextDate( strtotime( '31-Aug-2017 12:00PM' ) ); $this->assertEquals( date( 'r', $result['start_date'] ), date( 'r', strtotime( '01-Aug-2017' ) ), 'Start date Matches.' ); $this->assertEquals( date( 'r', $result['end_date'] ), date( 'r', strtotime( '31-Aug-2017 23:59:59' ) ), 'End date Matches.' ); $this->assertEquals( date( 'r', $result['due_date'] ), date( 'r', strtotime( '15-Sep-2017 12:00:00' ) ), 'Due date Matches.' ); $test_start_date = strtotime( '01-Sep-2017 12:00PM' ); $result = $praef->calculateNextDate( $test_start_date ); $this->assertEquals( date( 'r', $result['start_date'] ), date( 'r', strtotime( '01-Sep-2017' ) ), 'Start date Matches.' ); $this->assertEquals( date( 'r', $result['end_date'] ), date( 'r', strtotime( '30-Sep-2017 23:59:59' ) ), 'End date Matches.' ); $this->assertEquals( date( 'r', $result['due_date'] ), date( 'r', strtotime( '31-Oct-2017 12:00:00' ) ), 'Due date Matches.' ); $test_start_date = strtotime( '30-Sep-2017 12:00PM' ); $result = $praef->calculateNextDate( $test_start_date ); $this->assertEquals( date( 'r', $result['start_date'] ), date( 'r', strtotime( '01-Sep-2017' ) ), 'Start date Matches.' ); $this->assertEquals( date( 'r', $result['end_date'] ), date( 'r', strtotime( '30-Sep-2017 23:59:59' ) ), 'End date Matches.' ); $this->assertEquals( date( 'r', $result['due_date'] ), date( 'r', strtotime( '31-Oct-2017 12:00:00' ) ), 'Due date Matches.' ); $result = $praef->calculateNextDate( strtotime( '01-Oct-2017 12:00PM' ) ); $this->assertEquals( date( 'r', $result['start_date'] ), date( 'r', strtotime( '01-Oct-2017' ) ), 'Start date Matches.' ); $this->assertEquals( date( 'r', $result['end_date'] ), date( 'r', strtotime( '31-Oct-2017 23:59:59' ) ), 'End date Matches.' ); $this->assertEquals( date( 'r', $result['due_date'] ), date( 'r', strtotime( '15-Nov-2017 12:00:00' ) ), 'Due date Matches.' ); $result = $praef->calculateNextDate( strtotime( '31-Oct-2017 12:00PM' ) ); $this->assertEquals( date( 'r', $result['start_date'] ), date( 'r', strtotime( '01-Oct-2017' ) ), 'Start date Matches.' ); $this->assertEquals( date( 'r', $result['end_date'] ), date( 'r', strtotime( '31-Oct-2017 23:59:59' ) ), 'End date Matches.' ); $this->assertEquals( date( 'r', $result['due_date'] ), date( 'r', strtotime( '15-Nov-2017 12:00:00' ) ), 'Due date Matches.' ); $result = $praef->calculateNextDate( strtotime( '01-Nov-2017 12:00PM' ) ); $this->assertEquals( date( 'r', $result['start_date'] ), date( 'r', strtotime( '01-Nov-2017' ) ), 'Start date Matches.' ); $this->assertEquals( date( 'r', $result['end_date'] ), date( 'r', strtotime( '30-Nov-2017 23:59:59' ) ), 'End date Matches.' ); $this->assertEquals( date( 'r', $result['due_date'] ), date( 'r', strtotime( '15-Dec-2017 12:00:00' ) ), 'Due date Matches.' ); $result = $praef->calculateNextDate( strtotime( '30-Nov-2017 12:00PM' ) ); $this->assertEquals( date( 'r', $result['start_date'] ), date( 'r', strtotime( '01-Nov-2017' ) ), 'Start date Matches.' ); $this->assertEquals( date( 'r', $result['end_date'] ), date( 'r', strtotime( '30-Nov-2017 23:59:59' ) ), 'End date Matches.' ); $this->assertEquals( date( 'r', $result['due_date'] ), date( 'r', strtotime( '15-Dec-2017 12:00:00' ) ), 'Due date Matches.' ); $result = $praef->calculateNextDate( strtotime( '01-Dec-2017 12:00PM' ) ); $this->assertEquals( date( 'r', $result['start_date'] ), date( 'r', strtotime( '01-Dec-2017' ) ), 'Start date Matches.' ); $this->assertEquals( date( 'r', $result['end_date'] ), date( 'r', strtotime( '31-Dec-2017 23:59:59' ) ), 'End date Matches.' ); $this->assertEquals( date( 'r', $result['due_date'] ), date( 'r', strtotime( '31-Jan-2018 12:00:00' ) ), 'Due date Matches.' ); $result = $praef->calculateNextDate( strtotime( '31-Dec-2017 12:00PM' ) ); $this->assertEquals( date( 'r', $result['start_date'] ), date( 'r', strtotime( '01-Dec-2017' ) ), 'Start date Matches.' ); $this->assertEquals( date( 'r', $result['end_date'] ), date( 'r', strtotime( '31-Dec-2017 23:59:59' ) ), 'End date Matches.' ); $this->assertEquals( date( 'r', $result['due_date'] ), date( 'r', strtotime( '31-Jan-2018 12:00:00' ) ), 'Due date Matches.' ); //chained testing (like wizard) $result = $praef->calculateNextDate( strtotime( '01-Dec-2017 12:00PM' ) ); $this->assertEquals( date( 'r', $result['start_date'] ), date( 'r', strtotime( '01-Dec-2017' ) ), 'Start date Matches.' ); $this->assertEquals( date( 'r', $result['end_date'] ), date( 'r', strtotime( '31-Dec-2017 23:59:59' ) ), 'End date Matches.' ); $this->assertEquals( date( 'r', $result['due_date'] ), date( 'r', strtotime( '31-Jan-2018 12:00:00' ) ), 'Due date Matches.' ); $result = $praef->calculateNextDate( $result['due_date'] );//31-Jan-2018 12:00:00 $this->assertEquals( date( 'r', $result['start_date'] ), date( 'r', strtotime( '01-Jan-2018' ) ), 'Start date Matches.' ); $this->assertEquals( date( 'r', $result['end_date'] ), date( 'r', strtotime( '31-Jan-2018 23:59:59' ) ), 'End date Matches.' ); $this->assertEquals( date( 'r', $result['due_date'] ), date( 'r', strtotime( '15-Feb-2018 12:00:00' ) ), 'Due date Matches.' ); $result = $praef->calculateNextDate( $result['due_date'] );//15-Feb-2018 12:00:00 $this->assertEquals( date( 'r', $result['start_date'] ), date( 'r', strtotime( '01-Feb-2018' ) ), 'Start date Matches.' ); $this->assertEquals( date( 'r', $result['end_date'] ), date( 'r', strtotime( '28-Feb-2018 23:59:59' ) ), 'End date Matches.' ); $this->assertEquals( date( 'r', $result['due_date'] ), date( 'r', strtotime( '15-Mar-2018 12:00:00' ) ), 'Due date Matches.' ); $result = $praef->calculateNextDate( $result['due_date'] );//31-Mar-2018 12:00:00 $this->assertEquals( date( 'r', $result['start_date'] ), date( 'r', strtotime( '01-Mar-2018' ) ), 'Start date Matches.' ); $this->assertEquals( date( 'r', $result['end_date'] ), date( 'r', strtotime( '31-Mar-2018 23:59:59' ) ), 'End date Matches.' ); $this->assertEquals( date( 'r', $result['due_date'] ), date( 'r', strtotime( '30-Apr-2018 12:00:00' ) ), 'Due date Matches.' ); $result = $praef->calculateNextDate( $result['due_date'] );//30-Apr-2018 12:00:00 $this->assertEquals( date( 'r', $result['start_date'] ), date( 'r', strtotime( '01-Apr-2018' ) ), 'Start date Matches.' ); $this->assertEquals( date( 'r', $result['end_date'] ), date( 'r', strtotime( '30-Apr-2018 23:59:59' ) ), 'End date Matches.' ); $this->assertEquals( date( 'r', $result['due_date'] ), date( 'r', strtotime( '15-May-2018 12:00:00' ) ), 'Due date Matches.' ); } /** * @group PayrollRemittanceAgencyEvent_testQuarterMonthly */ function testQuarterMonthly() { //quarter-monthly // 1.The first seven days of the calendar month. // 2.The 8th to the 15th day of the calendar month. // 3.The 16th to the 22nd day of the calendar month. // 4.The 23rd day to the end of the calendar month. //As a quarter-monthly filer, you are required to pay at least 90 percent of the actual tax due within three banking day following the end //of the quarter-monthly period. $praef = TTnew( 'PayrollRemittanceAgencyEventFactory' ); /** @var PayrollRemittanceAgencyEventFactory $praef */ $praef->setPayrollRemittanceAgencyId( $this->agency_id ); $praef->setFrequency( 62000 ); $result = $praef->calculateNextDate( strtotime( '01-Jan-2017 12:00PM' ) ); $this->assertEquals( true, is_array( $result ), '$result should be an array.' ); $this->assertCount( 3, $result, '$result should have 3 elements.' ); $this->assertEquals( date( 'r', $result['start_date'] ), date( 'r', strtotime( '01-Jan-2017' ) ), 'Start date Matches.' ); $this->assertEquals( date( 'r', $result['end_date'] ), date( 'r', strtotime( '07-Jan-2017 23:59:59' ) ), 'End date Matches.' ); $this->assertEquals( date( 'r', $result['due_date'] ), date( 'r', strtotime( '10-Jan-2017 12:00:00' ) ), 'Due date Matches.' ); $result = $praef->calculateNextDate( strtotime( '07-Jan-2017 12:00PM' ) ); $this->assertEquals( date( 'r', $result['start_date'] ), date( 'r', strtotime( '01-Jan-2017' ) ), 'Start date Matches.' ); $this->assertEquals( date( 'r', $result['end_date'] ), date( 'r', strtotime( '07-Jan-2017 23:59:59' ) ), 'End date Matches.' ); $this->assertEquals( date( 'r', $result['due_date'] ), date( 'r', strtotime( '10-Jan-2017 12:00:00' ) ), 'Due date Matches.' ); $result = $praef->calculateNextDate( strtotime( '08-Jan-2017 12:00PM' ) ); $this->assertEquals( date( 'r', $result['start_date'] ), date( 'r', strtotime( '08-Jan-2017' ) ), 'Start date Matches.' ); $this->assertEquals( date( 'r', $result['end_date'] ), date( 'r', strtotime( '15-Jan-2017 23:59:59' ) ), 'End date Matches.' ); $this->assertEquals( date( 'r', $result['due_date'] ), date( 'r', strtotime( '18-Jan-2017 12:00:00' ) ), 'Due date Matches.' ); $result = $praef->calculateNextDate( strtotime( '11-Jan-2017 12:00PM' ) ); $this->assertEquals( date( 'r', $result['start_date'] ), date( 'r', strtotime( '08-Jan-2017' ) ), 'Start date Matches.' ); $this->assertEquals( date( 'r', $result['end_date'] ), date( 'r', strtotime( '15-Jan-2017 23:59:59' ) ), 'End date Matches.' ); $this->assertEquals( date( 'r', $result['due_date'] ), date( 'r', strtotime( '18-Jan-2017 12:00:00' ) ), 'Due date Matches.' ); $result = $praef->calculateNextDate( strtotime( '15-Jan-2017 12:00PM' ) ); $this->assertEquals( date( 'r', $result['start_date'] ), date( 'r', strtotime( '08-Jan-2017' ) ), 'Start date Matches.' ); $this->assertEquals( date( 'r', $result['end_date'] ), date( 'r', strtotime( '15-Jan-2017 23:59:59' ) ), 'End date Matches.' ); $this->assertEquals( date( 'r', $result['due_date'] ), date( 'r', strtotime( '18-Jan-2017 12:00:00' ) ), 'Due date Matches.' ); $result = $praef->calculateNextDate( strtotime( '16-Jan-2017 12:00PM' ) ); $this->assertEquals( date( 'r', $result['start_date'] ), date( 'r', strtotime( '16-Jan-2017' ) ), 'Start date Matches.' ); $this->assertEquals( date( 'r', $result['end_date'] ), date( 'r', strtotime( '22-Jan-2017 23:59:59' ) ), 'End date Matches.' ); $this->assertEquals( date( 'r', $result['due_date'] ), date( 'r', strtotime( '25-Jan-2017 12:00:00' ) ), 'Due date Matches.' ); $result = $praef->calculateNextDate( strtotime( '18-Jan-2017 12:00PM' ) ); $this->assertEquals( date( 'r', $result['start_date'] ), date( 'r', strtotime( '16-Jan-2017' ) ), 'Start date Matches.' ); $this->assertEquals( date( 'r', $result['end_date'] ), date( 'r', strtotime( '22-Jan-2017 23:59:59' ) ), 'End date Matches.' ); $this->assertEquals( date( 'r', $result['due_date'] ), date( 'r', strtotime( '25-Jan-2017 12:00:00' ) ), 'Due date Matches.' ); $result = $praef->calculateNextDate( strtotime( '22-Jan-2017 12:00PM' ) ); $this->assertEquals( date( 'r', $result['start_date'] ), date( 'r', strtotime( '16-Jan-2017' ) ), 'Start date Matches.' ); $this->assertEquals( date( 'r', $result['end_date'] ), date( 'r', strtotime( '22-Jan-2017 23:59:59' ) ), 'End date Matches.' ); $this->assertEquals( date( 'r', $result['due_date'] ), date( 'r', strtotime( '25-Jan-2017 12:00:00' ) ), 'Due date Matches.' ); $result = $praef->calculateNextDate( strtotime( '23-Jan-2017 12:00PM' ) ); $this->assertEquals( date( 'r', $result['start_date'] ), date( 'r', strtotime( '23-Jan-2017' ) ), 'Start date Matches.' ); $this->assertEquals( date( 'r', $result['end_date'] ), date( 'r', strtotime( '31-Jan-2017 23:59:59' ) ), 'End date Matches.' ); $this->assertEquals( date( 'r', $result['due_date'] ), date( 'r', strtotime( '03-Feb-2017 12:00:00' ) ), 'Due date Matches.' ); $result = $praef->calculateNextDate( strtotime( '28-Jan-2017 12:00PM' ) ); $this->assertEquals( date( 'r', $result['start_date'] ), date( 'r', strtotime( '23-Jan-2017' ) ), 'Start date Matches.' ); $this->assertEquals( date( 'r', $result['end_date'] ), date( 'r', strtotime( '31-Jan-2017 23:59:59' ) ), 'End date Matches.' ); $this->assertEquals( date( 'r', $result['due_date'] ), date( 'r', strtotime( '03-Feb-2017 12:00:00' ) ), 'Due date Matches.' ); $result = $praef->calculateNextDate( strtotime( '31-Jan-2017 12:00PM' ) ); $this->assertEquals( date( 'r', $result['start_date'] ), date( 'r', strtotime( '23-Jan-2017' ) ), 'Start date Matches.' ); $this->assertEquals( date( 'r', $result['end_date'] ), date( 'r', strtotime( '31-Jan-2017 23:59:59' ) ), 'End date Matches.' ); $this->assertEquals( date( 'r', $result['due_date'] ), date( 'r', strtotime( '03-Feb-2017 12:00:00' ) ), 'Due date Matches.' ); $result = $praef->calculateNextDate( strtotime( '23-Feb-2018 12:00PM' ) ); $this->assertEquals( date( 'r', $result['start_date'] ), date( 'r', strtotime( '23-Feb-2018' ) ), 'Start date Matches.' ); $this->assertEquals( date( 'r', $result['end_date'] ), date( 'r', strtotime( '28-Feb-2018 23:59:59' ) ), 'End date Matches.' ); $this->assertEquals( date( 'r', $result['due_date'] ), date( 'r', strtotime( '03-Mar-2018 12:00:00' ) ), 'Due date Matches.' ); $result = $praef->calculateNextDate( strtotime( '28-Feb-2018 12:00PM' ) ); $this->assertEquals( date( 'r', $result['start_date'] ), date( 'r', strtotime( '23-Feb-2018' ) ), 'Start date Matches.' ); $this->assertEquals( date( 'r', $result['end_date'] ), date( 'r', strtotime( '28-Feb-2018 23:59:59' ) ), 'End date Matches.' ); $this->assertEquals( date( 'r', $result['due_date'] ), date( 'r', strtotime( '03-Mar-2018 12:00:00' ) ), 'Due date Matches.' ); //chained test(like wizard) $result = $praef->calculateNextDate( strtotime( '28-Feb-2018 12:00PM' ) ); $this->assertEquals( date( 'r', $result['start_date'] ), date( 'r', strtotime( '23-Feb-2018' ) ), 'Start date Matches.' ); $this->assertEquals( date( 'r', $result['end_date'] ), date( 'r', strtotime( '28-Feb-2018 23:59:59' ) ), 'End date Matches.' ); $this->assertEquals( date( 'r', $result['due_date'] ), date( 'r', strtotime( '03-Mar-2018 12:00:00' ) ), 'Due date Matches.' ); $result = $praef->calculateNextDate( $result['due_date'] );//03-Mar-2018 12:00:00 $this->assertEquals( date( 'r', $result['start_date'] ), date( 'r', strtotime( '01-Mar-2018 00:00:00' ) ), 'Start date Matches.' ); $this->assertEquals( date( 'r', $result['end_date'] ), date( 'r', strtotime( '07-Mar-2018 23:59:59' ) ), 'End date Matches.' ); $this->assertEquals( date( 'r', $result['due_date'] ), date( 'r', strtotime( '10-Mar-2018 12:00:00' ) ), 'Due date Matches.' ); $result = $praef->calculateNextDate( $result['due_date'] );//10-Mar-2018 12:00:00 $this->assertEquals( date( 'r', $result['start_date'] ), date( 'r', strtotime( '08-Mar-2018 00:00:00' ) ), 'Start date Matches.' ); $this->assertEquals( date( 'r', $result['end_date'] ), date( 'r', strtotime( '15-Mar-2018 23:59:59' ) ), 'End date Matches.' ); $this->assertEquals( date( 'r', $result['due_date'] ), date( 'r', strtotime( '18-Mar-2018 12:00:00' ) ), 'Due date Matches.' ); $result = $praef->calculateNextDate( $result['due_date'] );//18-Mar-2018 12:00:00 $this->assertEquals( date( 'r', $result['start_date'] ), date( 'r', strtotime( '16-Mar-2018 00:00:00' ) ), 'Start date Matches.' ); $this->assertEquals( date( 'r', $result['end_date'] ), date( 'r', strtotime( '22-Mar-2018 23:59:59' ) ), 'End date Matches.' ); $this->assertEquals( date( 'r', $result['due_date'] ), date( 'r', strtotime( '25-Mar-2018 12:00:00' ) ), 'Due date Matches.' ); $result = $praef->calculateNextDate( $result['due_date'] );//25-Mar-2018 12:00:00 $this->assertEquals( date( 'r', $result['start_date'] ), date( 'r', strtotime( '23-Mar-2018 00:00:00' ) ), 'Start date Matches.' ); $this->assertEquals( date( 'r', $result['end_date'] ), date( 'r', strtotime( '31-Mar-2018 23:59:59' ) ), 'End date Matches.' ); $this->assertEquals( date( 'r', $result['due_date'] ), date( 'r', strtotime( '03-Apr-2018 12:00:00' ) ), 'Due date Matches.' ); $result = $praef->calculateNextDate( $result['due_date'] );//03-Apr-2018 12:00:00 $this->assertEquals( date( 'r', $result['start_date'] ), date( 'r', strtotime( '01-Apr-2018 00:00:00' ) ), 'Start date Matches.' ); $this->assertEquals( date( 'r', $result['end_date'] ), date( 'r', strtotime( '07-Apr-2018 23:59:59' ) ), 'End date Matches.' ); $this->assertEquals( date( 'r', $result['due_date'] ), date( 'r', strtotime( '10-Apr-2018 12:00:00' ) ), 'Due date Matches.' ); } /** * @group PayrollRemittanceAgencyEvent_testUSQuarterly */ function testUSQuarterly() { // (April 30, July 31, and October 31). $praef = TTnew( 'PayrollRemittanceAgencyEventFactory' ); /** @var PayrollRemittanceAgencyEventFactory $praef */ $praef->setPayrollRemittanceAgencyId( $this->agency_id ); $praef->setFrequency( 59000 ); $result = $praef->calculateNextDate( strtotime( '01-Jan-2017 12:00PM' ) ); //sanity check $this->assertEquals( true, is_array( $result ), '$result should be an array.' ); $this->assertCount( 3, $result, '$result should have 3 elements.' ); //Q1 $this->assertEquals( date( 'r', $result['start_date'] ), date( 'r', strtotime( '01-Jan-2017' ) ), 'Start date Matches.' ); $this->assertEquals( date( 'r', $result['end_date'] ), date( 'r', strtotime( '31-Mar-2017 23:59:59' ) ), 'End date Matches.' ); $this->assertEquals( date( 'r', $result['due_date'] ), date( 'r', strtotime( '30-Apr-2017 12:00:00' ) ), 'Due date Matches.' ); $result = $praef->calculateNextDate( strtotime( '15-Jan-2017 12:00PM' ) ); $this->assertEquals( date( 'r', $result['start_date'] ), date( 'r', strtotime( '01-Jan-2017' ) ), 'Start date Matches.' ); $this->assertEquals( date( 'r', $result['end_date'] ), date( 'r', strtotime( '31-Mar-2017 23:59:59' ) ), 'End date Matches.' ); $this->assertEquals( date( 'r', $result['due_date'] ), date( 'r', strtotime( '30-Apr-2017 12:00:00' ) ), 'Due date Matches.' ); $result = $praef->calculateNextDate( strtotime( '15-Mar-2017 12:00PM' ) ); $this->assertEquals( date( 'r', $result['start_date'] ), date( 'r', strtotime( '01-Jan-2017' ) ), 'Start date Matches.' ); $this->assertEquals( date( 'r', $result['end_date'] ), date( 'r', strtotime( '31-Mar-2017 23:59:59' ) ), 'End date Matches.' ); $this->assertEquals( date( 'r', $result['due_date'] ), date( 'r', strtotime( '30-Apr-2017 12:00:00' ) ), 'Due date Matches.' ); $result = $praef->calculateNextDate( strtotime( '31-Mar-2017 12:00PM' ) ); $this->assertEquals( date( 'r', $result['start_date'] ), date( 'r', strtotime( '01-Jan-2017' ) ), 'Start date Matches.' ); $this->assertEquals( date( 'r', $result['end_date'] ), date( 'r', strtotime( '31-Mar-2017 23:59:59' ) ), 'End date Matches.' ); $this->assertEquals( date( 'r', $result['due_date'] ), date( 'r', strtotime( '30-Apr-2017 12:00:00' ) ), 'Due date Matches.' ); //Q2. $result = $praef->calculateNextDate( strtotime( '01-Apr-2017 12:00PM' ) ); $this->assertEquals( date( 'r', $result['start_date'] ), date( 'r', strtotime( '01-Apr-2017' ) ), 'Start date Matches.' ); $this->assertEquals( date( 'r', $result['end_date'] ), date( 'r', strtotime( '30-Jun-2017 23:59:59' ) ), 'End date Matches.' ); $this->assertEquals( date( 'r', $result['due_date'] ), date( 'r', strtotime( '31-Jul-2017 12:00:00' ) ), 'Due date Matches.' ); $result = $praef->calculateNextDate( strtotime( '15-Apr-2017 12:00PM' ) ); $this->assertEquals( date( 'r', $result['start_date'] ), date( 'r', strtotime( '01-Apr-2017' ) ), 'Start date Matches.' ); $this->assertEquals( date( 'r', $result['end_date'] ), date( 'r', strtotime( '30-Jun-2017 23:59:59' ) ), 'End date Matches.' ); $this->assertEquals( date( 'r', $result['due_date'] ), date( 'r', strtotime( '31-Jul-2017 12:00:00' ) ), 'Due date Matches.' ); $result = $praef->calculateNextDate( strtotime( '15-Jun-2017 12:00PM' ) ); $this->assertEquals( date( 'r', $result['start_date'] ), date( 'r', strtotime( '01-Apr-2017' ) ), 'Start date Matches.' ); $this->assertEquals( date( 'r', $result['end_date'] ), date( 'r', strtotime( '30-Jun-2017 23:59:59' ) ), 'End date Matches.' ); $this->assertEquals( date( 'r', $result['due_date'] ), date( 'r', strtotime( '31-Jul-2017 12:00:00' ) ), 'Due date Matches.' ); $result = $praef->calculateNextDate( strtotime( '30-Jun-2017 12:00PM' ) ); $this->assertEquals( date( 'r', $result['start_date'] ), date( 'r', strtotime( '01-Apr-2017' ) ), 'Start date Matches.' ); $this->assertEquals( date( 'r', $result['end_date'] ), date( 'r', strtotime( '30-Jun-2017 23:59:59' ) ), 'End date Matches.' ); $this->assertEquals( date( 'r', $result['due_date'] ), date( 'r', strtotime( '31-Jul-2017 12:00:00' ) ), 'Due date Matches.' ); //Q3. $result = $praef->calculateNextDate( strtotime( '01-Jul-2017 12:00PM' ) ); $this->assertEquals( date( 'r', $result['start_date'] ), date( 'r', strtotime( '01-Jul-2017' ) ), 'Start date Matches.' ); $this->assertEquals( date( 'r', $result['end_date'] ), date( 'r', strtotime( '30-Sep-2017 23:59:59' ) ), 'End date Matches.' ); $this->assertEquals( date( 'r', $result['due_date'] ), date( 'r', strtotime( '31-Oct-2017 12:00:00' ) ), 'Due date Matches.' ); $result = $praef->calculateNextDate( strtotime( '15-Jul-2017 12:00PM' ) ); $this->assertEquals( date( 'r', $result['start_date'] ), date( 'r', strtotime( '01-Jul-2017' ) ), 'Start date Matches.' ); $this->assertEquals( date( 'r', $result['end_date'] ), date( 'r', strtotime( '30-Sep-2017 23:59:59' ) ), 'End date Matches.' ); $this->assertEquals( date( 'r', $result['due_date'] ), date( 'r', strtotime( '31-Oct-2017 12:00:00' ) ), 'Due date Matches.' ); $result = $praef->calculateNextDate( strtotime( '15-Sep-2017 12:00PM' ) ); $this->assertEquals( date( 'r', $result['start_date'] ), date( 'r', strtotime( '01-Jul-2017' ) ), 'Start date Matches.' ); $this->assertEquals( date( 'r', $result['end_date'] ), date( 'r', strtotime( '30-Sep-2017 23:59:59' ) ), 'End date Matches.' ); $this->assertEquals( date( 'r', $result['due_date'] ), date( 'r', strtotime( '31-Oct-2017 12:00:00' ) ), 'Due date Matches.' ); $result = $praef->calculateNextDate( strtotime( '30-Sep-2017 12:00PM' ) ); $this->assertEquals( date( 'r', $result['start_date'] ), date( 'r', strtotime( '01-Jul-2017' ) ), 'Start date Matches.' ); $this->assertEquals( date( 'r', $result['end_date'] ), date( 'r', strtotime( '30-Sep-2017 23:59:59' ) ), 'End date Matches.' ); $this->assertEquals( date( 'r', $result['due_date'] ), date( 'r', strtotime( '31-Oct-2017 12:00:00' ) ), 'Due date Matches.' ); //Q4 $result = $praef->calculateNextDate( strtotime( '01-Oct-2017 12:00PM' ) ); $this->assertEquals( date( 'r', $result['start_date'] ), date( 'r', strtotime( '01-Jan-2018' ) ), 'Start date Matches.' ); $this->assertEquals( date( 'r', $result['end_date'] ), date( 'r', strtotime( '31-Mar-2018 23:59:59' ) ), 'End date Matches.' ); $this->assertEquals( date( 'r', $result['due_date'] ), date( 'r', strtotime( '30-Apr-2018 12:00:00' ) ), 'Due date Matches.' ); $result = $praef->calculateNextDate( strtotime( '15-Oct-2017 12:00PM' ) ); $this->assertEquals( date( 'r', $result['start_date'] ), date( 'r', strtotime( '01-Jan-2018' ) ), 'Start date Matches.' ); $this->assertEquals( date( 'r', $result['end_date'] ), date( 'r', strtotime( '31-Mar-2018 23:59:59' ) ), 'End date Matches.' ); $this->assertEquals( date( 'r', $result['due_date'] ), date( 'r', strtotime( '30-Apr-2018 12:00:00' ) ), 'Due date Matches.' ); $result = $praef->calculateNextDate( strtotime( '15-Dec-2017 12:00PM' ) ); $this->assertEquals( date( 'r', $result['start_date'] ), date( 'r', strtotime( '01-Jan-2018' ) ), 'Start date Matches.' ); $this->assertEquals( date( 'r', $result['end_date'] ), date( 'r', strtotime( '31-Mar-2018 23:59:59' ) ), 'End date Matches.' ); $this->assertEquals( date( 'r', $result['due_date'] ), date( 'r', strtotime( '30-Apr-2018 12:00:00' ) ), 'Due date Matches.' ); $result = $praef->calculateNextDate( strtotime( '31-Dec-2017 12:00PM' ) ); $this->assertEquals( date( 'r', $result['start_date'] ), date( 'r', strtotime( '01-Jan-2018' ) ), 'Start date Matches.' ); $this->assertEquals( date( 'r', $result['end_date'] ), date( 'r', strtotime( '31-Mar-2018 23:59:59' ) ), 'End date Matches.' ); $this->assertEquals( date( 'r', $result['due_date'] ), date( 'r', strtotime( '30-Apr-2018 12:00:00' ) ), 'Due date Matches.' ); //chained tests (like wizard) $result = $praef->calculateNextDate( $result['due_date'] );//30-Apr-2018 12:00:00 $this->assertEquals( date( 'r', $result['start_date'] ), date( 'r', strtotime( '01-Apr-2018' ) ), 'Start date Matches.' ); $this->assertEquals( date( 'r', $result['end_date'] ), date( 'r', strtotime( '30-Jun-2018 23:59:59' ) ), 'End date Matches.' ); $this->assertEquals( date( 'r', $result['due_date'] ), date( 'r', strtotime( '31-Jul-2018 12:00:00' ) ), 'Due date Matches.' ); $result = $praef->calculateNextDate( $result['due_date'] );//31-Jul-2018 12:00:00 $this->assertEquals( date( 'r', $result['start_date'] ), date( 'r', strtotime( '01-Jul-2018' ) ), 'Start date Matches.' ); $this->assertEquals( date( 'r', $result['end_date'] ), date( 'r', strtotime( '30-Sep-2018 23:59:59' ) ), 'End date Matches.' ); $this->assertEquals( date( 'r', $result['due_date'] ), date( 'r', strtotime( '31-Oct-2018 12:00:00' ) ), 'Due date Matches.' ); $result = $praef->calculateNextDate( $result['due_date'] );//31-Oct-2018 12:00:00 $this->assertEquals( date( 'r', $result['start_date'] ), date( 'r', strtotime( '01-Jan-2019' ) ), 'Start date Matches.' ); $this->assertEquals( date( 'r', $result['end_date'] ), date( 'r', strtotime( '31-Mar-2019 23:59:59' ) ), 'End date Matches.' ); $this->assertEquals( date( 'r', $result['due_date'] ), date( 'r', strtotime( '30-Apr-2019 12:00:00' ) ), 'Due date Matches.' ); $result = $praef->calculateNextDate( $result['due_date'] );//30-Apr-2018 12:00:00 $this->assertEquals( date( 'r', $result['start_date'] ), date( 'r', strtotime( '01-Apr-2019' ) ), 'Start date Matches.' ); $this->assertEquals( date( 'r', $result['end_date'] ), date( 'r', strtotime( '30-Jun-2019 23:59:59' ) ), 'End date Matches.' ); $this->assertEquals( date( 'r', $result['due_date'] ), date( 'r', strtotime( '31-Jul-2019 12:00:00' ) ), 'Due date Matches.' ); } /** * @group PayrollRemittanceAgencyEvent_testUSMonthlyExcludeLastMOQ */ function testUSMonthlyExcludeLastMOQ() { // (April 30, July 31, and October 31). $praef = TTnew( 'PayrollRemittanceAgencyEventFactory' ); /** @var PayrollRemittanceAgencyEventFactory $praef */ $praef->setPayrollRemittanceAgencyId( $this->agency_id ); $praef->setFrequency( 60100 ); $result = $praef->calculateNextDate( strtotime( '01-Jan-2017 12:00PM' ) ); //sanity check $this->assertEquals( true, is_array( $result ), '$result should be an array.' ); $this->assertCount( 3, $result, '$result should have 3 elements.' ); $this->assertEquals( date( 'r', $result['start_date'] ), date( 'r', strtotime( '01-Jan-2017' ) ), 'Start date Matches.' ); $this->assertEquals( date( 'r', $result['end_date'] ), date( 'r', strtotime( '31-Jan-2017 23:59:59' ) ), 'End date Matches.' ); $this->assertEquals( date( 'r', $result['due_date'] ), date( 'r', strtotime( '15-Feb-2017 12:00:00' ) ), 'Due date Matches.' ); $result = $praef->calculateNextDate( strtotime( '02-Jan-2017 12:00PM' ) ); $this->assertEquals( date( 'r', $result['start_date'] ), date( 'r', strtotime( '01-Jan-2017' ) ), 'Start date Matches.' ); $this->assertEquals( date( 'r', $result['end_date'] ), date( 'r', strtotime( '31-Jan-2017 23:59:59' ) ), 'End date Matches.' ); $this->assertEquals( date( 'r', $result['due_date'] ), date( 'r', strtotime( '15-Feb-2017 12:00:00' ) ), 'Due date Matches.' ); $result = $praef->calculateNextDate( strtotime( '16-Jan-2017 12:00PM' ) ); $this->assertEquals( date( 'r', $result['start_date'] ), date( 'r', strtotime( '01-Jan-2017' ) ), 'Start date Matches.' ); $this->assertEquals( date( 'r', $result['end_date'] ), date( 'r', strtotime( '31-Jan-2017 23:59:59' ) ), 'End date Matches.' ); $this->assertEquals( date( 'r', $result['due_date'] ), date( 'r', strtotime( '15-Feb-2017 12:00:00' ) ), 'Due date Matches.' ); $result = $praef->calculateNextDate( strtotime( '30-Jan-2017 12:00PM' ) ); $this->assertEquals( date( 'r', $result['start_date'] ), date( 'r', strtotime( '01-Jan-2017' ) ), 'Start date Matches.' ); $this->assertEquals( date( 'r', $result['end_date'] ), date( 'r', strtotime( '31-Jan-2017 23:59:59' ) ), 'End date Matches.' ); $this->assertEquals( date( 'r', $result['due_date'] ), date( 'r', strtotime( '15-Feb-2017 12:00:00' ) ), 'Due date Matches.' ); $result = $praef->calculateNextDate( strtotime( '31-Jan-2017 12:00PM' ) ); $this->assertEquals( date( 'r', $result['start_date'] ), date( 'r', strtotime( '01-Jan-2017' ) ), 'Start date Matches.' ); $this->assertEquals( date( 'r', $result['end_date'] ), date( 'r', strtotime( '31-Jan-2017 23:59:59' ) ), 'End date Matches.' ); $this->assertEquals( date( 'r', $result['due_date'] ), date( 'r', strtotime( '15-Feb-2017 12:00:00' ) ), 'Due date Matches.' ); $result = $praef->calculateNextDate( strtotime( '01-Feb-2017 12:00PM' ) ); $this->assertEquals( date( 'r', $result['start_date'] ), date( 'r', strtotime( '01-Feb-2017' ) ), 'Start date Matches.' ); $this->assertEquals( date( 'r', $result['end_date'] ), date( 'r', strtotime( '28-Feb-2017 23:59:59' ) ), 'End date Matches.' ); $this->assertEquals( date( 'r', $result['due_date'] ), date( 'r', strtotime( '15-Mar-2017 12:00:00' ) ), 'Due date Matches.' ); $result = $praef->calculateNextDate( strtotime( '28-Feb-2017 12:00PM' ) ); $this->assertEquals( date( 'r', $result['start_date'] ), date( 'r', strtotime( '01-Feb-2017' ) ), 'Start date Matches.' ); $this->assertEquals( date( 'r', $result['end_date'] ), date( 'r', strtotime( '28-Feb-2017 23:59:59' ) ), 'End date Matches.' ); $this->assertEquals( date( 'r', $result['due_date'] ), date( 'r', strtotime( '15-Mar-2017 12:00:00' ) ), 'Due date Matches.' ); $result = $praef->calculateNextDate( strtotime( '01-Mar-2017 12:00PM' ) ); $this->assertEquals( date( 'r', $result['start_date'] ), date( 'r', strtotime( '01-Apr-2017' ) ), 'Start date Matches.' ); $this->assertEquals( date( 'r', $result['end_date'] ), date( 'r', strtotime( '30-Apr-2017 23:59:59' ) ), 'End date Matches.' ); $this->assertEquals( date( 'r', $result['due_date'] ), date( 'r', strtotime( '15-May-2017 12:00:00' ) ), 'Due date Matches.' ); $result = $praef->calculateNextDate( strtotime( '30-Apr-2017 12:00PM' ) ); $this->assertEquals( date( 'r', $result['start_date'] ), date( 'r', strtotime( '01-Apr-2017' ) ), 'Start date Matches.' ); $this->assertEquals( date( 'r', $result['end_date'] ), date( 'r', strtotime( '30-Apr-2017 23:59:59' ) ), 'End date Matches.' ); $this->assertEquals( date( 'r', $result['due_date'] ), date( 'r', strtotime( '15-May-2017 12:00:00' ) ), 'Due date Matches.' ); $result = $praef->calculateNextDate( strtotime( '01-Apr-2017 12:00PM' ) ); $this->assertEquals( date( 'r', $result['start_date'] ), date( 'r', strtotime( '01-Apr-2017' ) ), 'Start date Matches.' ); $this->assertEquals( date( 'r', $result['end_date'] ), date( 'r', strtotime( '30-Apr-2017 23:59:59' ) ), 'End date Matches.' ); $this->assertEquals( date( 'r', $result['due_date'] ), date( 'r', strtotime( '15-May-2017 12:00:00' ) ), 'Due date Matches.' ); $result = $praef->calculateNextDate( strtotime( '30-Apr-2017 12:00PM' ) ); $this->assertEquals( date( 'r', $result['start_date'] ), date( 'r', strtotime( '01-Apr-2017' ) ), 'Start date Matches.' ); $this->assertEquals( date( 'r', $result['end_date'] ), date( 'r', strtotime( '30-Apr-2017 23:59:59' ) ), 'End date Matches.' ); $this->assertEquals( date( 'r', $result['due_date'] ), date( 'r', strtotime( '15-May-2017 12:00:00' ) ), 'Due date Matches.' ); $result = $praef->calculateNextDate( strtotime( '01-May-2017 12:00PM' ) ); $this->assertEquals( date( 'r', $result['start_date'] ), date( 'r', strtotime( '01-May-2017' ) ), 'Start date Matches.' ); $this->assertEquals( date( 'r', $result['end_date'] ), date( 'r', strtotime( '31-May-2017 23:59:59' ) ), 'End date Matches.' ); $this->assertEquals( date( 'r', $result['due_date'] ), date( 'r', strtotime( '15-Jun-2017 12:00:00' ) ), 'Due date Matches.' ); $result = $praef->calculateNextDate( strtotime( '31-May-2017 12:00PM' ) ); $this->assertEquals( date( 'r', $result['start_date'] ), date( 'r', strtotime( '01-May-2017' ) ), 'Start date Matches.' ); $this->assertEquals( date( 'r', $result['end_date'] ), date( 'r', strtotime( '31-May-2017 23:59:59' ) ), 'End date Matches.' ); $this->assertEquals( date( 'r', $result['due_date'] ), date( 'r', strtotime( '15-Jun-2017 12:00:00' ) ), 'Due date Matches.' ); $result = $praef->calculateNextDate( strtotime( '01-Jun-2017 12:00PM' ) ); $this->assertEquals( date( 'r', $result['start_date'] ), date( 'r', strtotime( '01-Jul-2017' ) ), 'Start date Matches.' ); $this->assertEquals( date( 'r', $result['end_date'] ), date( 'r', strtotime( '31-Jul-2017 23:59:59' ) ), 'End date Matches.' ); $this->assertEquals( date( 'r', $result['due_date'] ), date( 'r', strtotime( '15-Aug-2017 12:00:00' ) ), 'Due date Matches.' ); $result = $praef->calculateNextDate( strtotime( '31-Jul-2017 12:00PM' ) ); $this->assertEquals( date( 'r', $result['start_date'] ), date( 'r', strtotime( '01-Jul-2017' ) ), 'Start date Matches.' ); $this->assertEquals( date( 'r', $result['end_date'] ), date( 'r', strtotime( '31-Jul-2017 23:59:59' ) ), 'End date Matches.' ); $this->assertEquals( date( 'r', $result['due_date'] ), date( 'r', strtotime( '15-Aug-2017 12:00:00' ) ), 'Due date Matches.' ); $result = $praef->calculateNextDate( strtotime( '01-Jul-2017 12:00PM' ) ); $this->assertEquals( date( 'r', $result['start_date'] ), date( 'r', strtotime( '01-Jul-2017' ) ), 'Start date Matches.' ); $this->assertEquals( date( 'r', $result['end_date'] ), date( 'r', strtotime( '31-Jul-2017 23:59:59' ) ), 'End date Matches.' ); $this->assertEquals( date( 'r', $result['due_date'] ), date( 'r', strtotime( '15-Aug-2017 12:00:00' ) ), 'Due date Matches.' ); $result = $praef->calculateNextDate( strtotime( '31-Jul-2017 12:00PM' ) ); $this->assertEquals( date( 'r', $result['start_date'] ), date( 'r', strtotime( '01-Jul-2017' ) ), 'Start date Matches.' ); $this->assertEquals( date( 'r', $result['end_date'] ), date( 'r', strtotime( '31-Jul-2017 23:59:59' ) ), 'End date Matches.' ); $this->assertEquals( date( 'r', $result['due_date'] ), date( 'r', strtotime( '15-Aug-2017 12:00:00' ) ), 'Due date Matches.' ); $result = $praef->calculateNextDate( strtotime( '01-Aug-2017 12:00PM' ) ); $this->assertEquals( date( 'r', $result['start_date'] ), date( 'r', strtotime( '01-Aug-2017' ) ), 'Start date Matches.' ); $this->assertEquals( date( 'r', $result['end_date'] ), date( 'r', strtotime( '31-Aug-2017 23:59:59' ) ), 'End date Matches.' ); $this->assertEquals( date( 'r', $result['due_date'] ), date( 'r', strtotime( '15-Sep-2017 12:00:00' ) ), 'Due date Matches.' ); $result = $praef->calculateNextDate( strtotime( '31-Aug-2017 12:00PM' ) ); $this->assertEquals( date( 'r', $result['start_date'] ), date( 'r', strtotime( '01-Aug-2017' ) ), 'Start date Matches.' ); $this->assertEquals( date( 'r', $result['end_date'] ), date( 'r', strtotime( '31-Aug-2017 23:59:59' ) ), 'End date Matches.' ); $this->assertEquals( date( 'r', $result['due_date'] ), date( 'r', strtotime( '15-Sep-2017 12:00:00' ) ), 'Due date Matches.' ); $test_start_date = strtotime( '01-Sep-2017 12:00PM' ); $result = $praef->calculateNextDate( $test_start_date ); $this->assertEquals( date( 'r', $result['start_date'] ), date( 'r', strtotime( '01-Oct-2017' ) ), 'Start date Matches.' ); $this->assertEquals( date( 'r', $result['end_date'] ), date( 'r', strtotime( '31-Oct-2017 23:59:59' ) ), 'End date Matches.' ); $this->assertEquals( date( 'r', $result['due_date'] ), date( 'r', strtotime( '15-Nov-2017 12:00:00' ) ), 'Due date Matches.' ); $result = $praef->calculateNextDate( strtotime( '31-Oct-2017 12:00PM' ) ); $this->assertEquals( date( 'r', $result['start_date'] ), date( 'r', strtotime( '01-Oct-2017' ) ), 'Start date Matches.' ); $this->assertEquals( date( 'r', $result['end_date'] ), date( 'r', strtotime( '31-Oct-2017 23:59:59' ) ), 'End date Matches.' ); $this->assertEquals( date( 'r', $result['due_date'] ), date( 'r', strtotime( '15-Nov-2017 12:00:00' ) ), 'Due date Matches.' ); $result = $praef->calculateNextDate( strtotime( '01-Oct-2017 12:00PM' ) ); $this->assertEquals( date( 'r', $result['start_date'] ), date( 'r', strtotime( '01-Oct-2017' ) ), 'Start date Matches.' ); $this->assertEquals( date( 'r', $result['end_date'] ), date( 'r', strtotime( '31-Oct-2017 23:59:59' ) ), 'End date Matches.' ); $this->assertEquals( date( 'r', $result['due_date'] ), date( 'r', strtotime( '15-Nov-2017 12:00:00' ) ), 'Due date Matches.' ); $result = $praef->calculateNextDate( strtotime( '31-Oct-2017 12:00PM' ) ); $this->assertEquals( date( 'r', $result['start_date'] ), date( 'r', strtotime( '01-Oct-2017' ) ), 'Start date Matches.' ); $this->assertEquals( date( 'r', $result['end_date'] ), date( 'r', strtotime( '31-Oct-2017 23:59:59' ) ), 'End date Matches.' ); $this->assertEquals( date( 'r', $result['due_date'] ), date( 'r', strtotime( '15-Nov-2017 12:00:00' ) ), 'Due date Matches.' ); $result = $praef->calculateNextDate( strtotime( '01-Nov-2017 12:00PM' ) ); $this->assertEquals( date( 'r', $result['start_date'] ), date( 'r', strtotime( '01-Nov-2017' ) ), 'Start date Matches.' ); $this->assertEquals( date( 'r', $result['end_date'] ), date( 'r', strtotime( '30-Nov-2017 23:59:59' ) ), 'End date Matches.' ); $this->assertEquals( date( 'r', $result['due_date'] ), date( 'r', strtotime( '15-Dec-2017 12:00:00' ) ), 'Due date Matches.' ); $result = $praef->calculateNextDate( strtotime( '30-Nov-2017 12:00PM' ) ); $this->assertEquals( date( 'r', $result['start_date'] ), date( 'r', strtotime( '01-Nov-2017' ) ), 'Start date Matches.' ); $this->assertEquals( date( 'r', $result['end_date'] ), date( 'r', strtotime( '30-Nov-2017 23:59:59' ) ), 'End date Matches.' ); $this->assertEquals( date( 'r', $result['due_date'] ), date( 'r', strtotime( '15-Dec-2017 12:00:00' ) ), 'Due date Matches.' ); $result = $praef->calculateNextDate( strtotime( '01-Dec-2017 12:00PM' ) ); $this->assertEquals( date( 'r', $result['start_date'] ), date( 'r', strtotime( '01-Jan-2018' ) ), 'Start date Matches.' ); $this->assertEquals( date( 'r', $result['end_date'] ), date( 'r', strtotime( '31-Jan-2018 23:59:59' ) ), 'End date Matches.' ); $this->assertEquals( date( 'r', $result['due_date'] ), date( 'r', strtotime( '15-Feb-2018 12:00:00' ) ), 'Due date Matches.' ); $result = $praef->calculateNextDate( strtotime( '31-Dec-2017 12:00PM' ) ); $this->assertEquals( date( 'r', $result['start_date'] ), date( 'r', strtotime( '01-Jan-2018' ) ), 'Start date Matches.' ); $this->assertEquals( date( 'r', $result['end_date'] ), date( 'r', strtotime( '31-Jan-2018 23:59:59' ) ), 'End date Matches.' ); $this->assertEquals( date( 'r', $result['due_date'] ), date( 'r', strtotime( '15-Feb-2018 12:00:00' ) ), 'Due date Matches.' ); //chained tests (like wizard) $result = $praef->calculateNextDate( $result['due_date'] );//15-Feb-2018 12:00:00 $this->assertEquals( date( 'r', $result['start_date'] ), date( 'r', strtotime( '01-Feb-2018' ) ), 'Start date Matches.' ); $this->assertEquals( date( 'r', $result['end_date'] ), date( 'r', strtotime( '28-Feb-2018 23:59:59' ) ), 'End date Matches.' ); $this->assertEquals( date( 'r', $result['due_date'] ), date( 'r', strtotime( '15-Mar-2018 12:00:00' ) ), 'Due date Matches.' ); $result = $praef->calculateNextDate( $result['due_date'] );//15-March-2018 12:00:00 $this->assertEquals( date( 'r', $result['start_date'] ), date( 'r', strtotime( '01-Apr-2018' ) ), 'Start date Matches.' ); $this->assertEquals( date( 'r', $result['end_date'] ), date( 'r', strtotime( '30-Apr-2018 23:59:59' ) ), 'End date Matches.' ); $this->assertEquals( date( 'r', $result['due_date'] ), date( 'r', strtotime( '15-May-2018 12:00:00' ) ), 'Due date Matches.' ); $result = $praef->calculateNextDate( $result['due_date'] );//15-May-2018 12:00:00 $this->assertEquals( date( 'r', $result['start_date'] ), date( 'r', strtotime( '01-May-2018' ) ), 'Start date Matches.' ); $this->assertEquals( date( 'r', $result['end_date'] ), date( 'r', strtotime( '31-May-2018 23:59:59' ) ), 'End date Matches.' ); $this->assertEquals( date( 'r', $result['due_date'] ), date( 'r', strtotime( '15-Jun-2018 12:00:00' ) ), 'Due date Matches.' ); $result = $praef->calculateNextDate( $result['due_date'] );//15-Jun-2018 12:00:00 $this->assertEquals( date( 'r', $result['start_date'] ), date( 'r', strtotime( '01-Jul-2018' ) ), 'Start date Matches.' ); $this->assertEquals( date( 'r', $result['end_date'] ), date( 'r', strtotime( '31-Jul-2018 23:59:59' ) ), 'End date Matches.' ); $this->assertEquals( date( 'r', $result['due_date'] ), date( 'r', strtotime( '15-Aug-2018 12:00:00' ) ), 'Due date Matches.' ); $result = $praef->calculateNextDate( $result['due_date'] );//15-Aug-2018 12:00:00 $this->assertEquals( date( 'r', $result['start_date'] ), date( 'r', strtotime( '01-Aug-2018' ) ), 'Start date Matches.' ); $this->assertEquals( date( 'r', $result['end_date'] ), date( 'r', strtotime( '31-Aug-2018 23:59:59' ) ), 'End date Matches.' ); $this->assertEquals( date( 'r', $result['due_date'] ), date( 'r', strtotime( '15-Sep-2018 12:00:00' ) ), 'Due date Matches.' ); $result = $praef->calculateNextDate( $result['due_date'] );//15-Sep-2018 12:00:00 $this->assertEquals( date( 'r', $result['start_date'] ), date( 'r', strtotime( '01-Oct-2018' ) ), 'Start date Matches.' ); $this->assertEquals( date( 'r', $result['end_date'] ), date( 'r', strtotime( '31-Oct-2018 23:59:59' ) ), 'End date Matches.' ); $this->assertEquals( date( 'r', $result['due_date'] ), date( 'r', strtotime( '15-Nov-2018 12:00:00' ) ), 'Due date Matches.' ); $result = $praef->calculateNextDate( $result['due_date'] );//15-Nov-2018 12:00:00 $this->assertEquals( date( 'r', $result['start_date'] ), date( 'r', strtotime( '01-Nov-2018' ) ), 'Start date Matches.' ); $this->assertEquals( date( 'r', $result['end_date'] ), date( 'r', strtotime( '30-Nov-2018 23:59:59' ) ), 'End date Matches.' ); $this->assertEquals( date( 'r', $result['due_date'] ), date( 'r', strtotime( '15-Dec-2018 12:00:00' ) ), 'Due date Matches.' ); $result = $praef->calculateNextDate( $result['due_date'] );//15-Dec-2018 12:00:00 $this->assertEquals( date( 'r', $result['start_date'] ), date( 'r', strtotime( '01-Jan-2019' ) ), 'Start date Matches.' ); $this->assertEquals( date( 'r', $result['end_date'] ), date( 'r', strtotime( '31-Jan-2019 23:59:59' ) ), 'End date Matches.' ); $this->assertEquals( date( 'r', $result['due_date'] ), date( 'r', strtotime( '15-Feb-2019 12:00:00' ) ), 'Due date Matches.' ); } /** * @group PayrollRemittanceAgencyEvent_testOnHire */ function testOnHire() { global $dd; Debug::text( 'Running setUp(): ', __FILE__, __LINE__, __METHOD__, 10 ); $this->user_id = $dd->createUser( $this->company_id, $this->legal_entity_id, 999 ); Debug::text( 'User ID: ' . $this->user_id, __FILE__, __LINE__, __METHOD__, 10 ); $dd->createUserWage( $this->user_id, '17.77', strtotime( '05-Jun-2016' ) ); //Create wage on new hire date so we avoid the validation error of: Hire date must be on or after the employees first wage entry, you may need to change their wage effective date first $user_obj = $this->getUserObject( $this->user_id ); $user_obj->setHireDate( strtotime( '05-Jun-2016' ) ); $this->assertEquals( true, $user_obj->isValid(), $user_obj->Validator->getTextErrors() ); if ( $user_obj->isValid() ) { $user_obj->Save( false ); } $praef = TTnew( 'PayrollRemittanceAgencyEventFactory' ); /** @var PayrollRemittanceAgencyEventFactory $praef */ $praef->setPayrollRemittanceAgencyId( $this->agency_id ); $praef->setDueDateDelayDays( 10 ); $praef->setStatus( 10 ); //enabled $praef->setType( 'T4' ); $praef->setReminderDays( 0 ); $praef->setFrequency( 90100 ); //On Hire Event Frequency $praef->setEffectiveDate( strtotime( '05-Jun-2016' ) ); $this->assertEquals( true, $praef->isValid() ); if ( $praef->isValid() ) { $praef->Save( false ); } $result = $praef->calculateNextDate( null, strtotime( '05-Jun-2016' ) ); Debug::Arr( $result, 'FIRST RESULT: ', __FILE__, __LINE__, __METHOD__, 10 ); //sanity check $this->assertEquals( true, is_array( $result ), '$result should be an array.' ); $this->assertCount( 3, $result, '$result should have 3 elements.' ); $this->assertNotEmpty( $result['start_date'], '$result elements should not be empty.' ); $this->assertNotEmpty( $result['end_date'], '$result elements should not be empty.' ); $this->assertNotEmpty( $result['due_date'], '$result elements should not be empty.' ); $this->assertEquals( date( 'r', $result['start_date'] ), date( 'r', strtotime( '05-Jun-2016 00:00:00' ) ), 'Start date Matches.' ); $this->assertEquals( date( 'r', $result['end_date'] ), date( 'r', strtotime( '14-Jun-2016 23:59:59' ) ), 'End date Matches.' ); $this->assertEquals( date( 'r', $result['due_date'] ), date( 'r', strtotime( '15-Jun-2016 12:00:00' ) ), 'Due date Matches.' ); $this->user_id = $dd->createUser( $this->company_id, $this->legal_entity_id, 999 ); Debug::text( 'User ID: ' . $this->user_id, __FILE__, __LINE__, __METHOD__, 10 ); $dd->createUserWage( $this->user_id, '17.77', strtotime( '07-Jun-2016' ) ); //Create wage on new hire date so we avoid the validation error of: Hire date must be on or after the employees first wage entry, you may need to change their wage effective date first $user_obj = $this->getUserObject( $this->user_id ); $user_obj->setHireDate( strtotime( '07-Jun-2016' ) ); $this->assertEquals( true, $user_obj->isValid(), $user_obj->Validator->getTextErrors() ); if ( $user_obj->isValid() ) { $user_obj->Save( false ); } $result = $praef->calculateNextDate( null, strtotime( '07-Jun-2016' ) ); Debug::Arr( $result, 'SECOND RESULT: ', __FILE__, __LINE__, __METHOD__, 10 ); $this->assertEquals( date( 'r', $result['start_date'] ), date( 'r', strtotime( '05-Jun-2016 00:00:00' ) ), 'Start date Matches.' ); $this->assertEquals( date( 'r', $result['end_date'] ), date( 'r', strtotime( '14-Jun-2016 23:59:59' ) ), 'End date Matches.' ); $this->assertEquals( date( 'r', $result['due_date'] ), date( 'r', strtotime( '15-Jun-2016 12:00:00' ) ), 'Due date Matches.' ); $this->user_id = $dd->createUser( $this->company_id, $this->legal_entity_id, 999 ); Debug::text( 'User ID: ' . $this->user_id, __FILE__, __LINE__, __METHOD__, 10 ); $dd->createUserWage( $this->user_id, '17.77', strtotime( '20-Jun-2016' ) ); //Create wage on new hire date so we avoid the validation error of: Hire date must be on or after the employees first wage entry, you may need to change their wage effective date first $user_obj = $this->getUserObject( $this->user_id ); $user_obj->setHireDate( strtotime( '20-Jun-2016' ) ); $this->assertEquals( true, $user_obj->isValid() ); if ( $user_obj->isValid() ) { $user_obj->Save( false ); } $result = $praef->calculateNextDate( null, strtotime( '20-Jun-2016' ) ); Debug::Arr( $result, 'THIRD RESULT: ', __FILE__, __LINE__, __METHOD__, 10 ); $this->assertEquals( date( 'r', $result['start_date'] ), date( 'r', strtotime( '20-Jun-2016 00:00:00' ) ), 'Start date Matches.' ); $this->assertEquals( date( 'r', $result['end_date'] ), date( 'r', strtotime( '29-Jun-2016 23:59:59' ) ), 'End date Matches.' ); $this->assertEquals( date( 'r', $result['due_date'] ), date( 'r', strtotime( '30-Jun-2016 12:00:00' ) ), 'Due date Matches.' ); } /** * @group PayrollRemittanceAgencyEvent_testOnHireGaps */ function testOnHireGaps() { global $dd; $now = TTDate::getMiddleDayEpoch( time() ); Debug::text( 'Running setUp(): ', __FILE__, __LINE__, __METHOD__, 10 ); //ensure that we set the admin user's hire date to some time in the past so it doesn't interfere with the following tests. $user_obj = $this->getUserObject( $this->user_id ); $user_obj->setHireDate( TTDate::incrementDate( $now, -5, 'month' ) ); $this->assertEquals( true, $user_obj->isValid() ); if ( $user_obj->isValid() ) { $user_obj->Save( false ); } $this->user_id = $dd->createUser( $this->company_id, $this->legal_entity_id, 999 ); Debug::text( 'User ID: ' . $this->user_id, __FILE__, __LINE__, __METHOD__, 10 ); $user_obj = $this->getUserObject( $this->user_id ); $user_obj->setHireDate( TTDate::incrementDate( $now, -5, 'day' ) ); Debug::Text( 'FIRST User Hire Date: ' . TTDate::getDate( 'DATE+TIME', $user_obj->getHireDate() ), __FILE__, __LINE__, __METHOD__, 10 ); $this->assertEquals( true, $user_obj->isValid() ); if ( $user_obj->isValid() ) { $user_obj->Save( false ); } $praef = TTnew( 'PayrollRemittanceAgencyEventFactory' ); /** @var PayrollRemittanceAgencyEventFactory $praef */ $praef->setPayrollRemittanceAgencyId( $this->agency_id ); $praef->setDueDateDelayDays( 10 ); $praef->setStatus( 10 ); //enabled $praef->setType( 'T4' ); $praef->setReminderDays( 0 ); $praef->setFrequency( 90100 ); //On Hire Event Frequency $praef->setEffectiveDate( $now ); $this->assertEquals( true, $praef->isValid() ); if ( $praef->isValid() ) { $praef->Save( false ); } $praef->getPayrollRemittanceAgencyObject()->setAlwaysOnWeekDay( 0 ); $praef->getPayrollRemittanceAgencyObject()->save(); $result = $praef->calculateNextDate( null, $now ); //Debug::Arr( $result, 'FIRST RESULT: ', __FILE__, __LINE__, __METHOD__, 10 ); //sanity check $this->assertEquals( true, is_array( $result ), '$result should be an array.' ); $this->assertCount( 3, $result, '$result should have 3 elements.' ); $this->assertNotEmpty( $result['start_date'], '$result elements should not be empty.' ); $this->assertNotEmpty( $result['end_date'], '$result elements should not be empty.' ); $this->assertNotEmpty( $result['due_date'], '$result elements should not be empty.' ); $this->assertEquals( date( 'r', $result['start_date'] ), date( 'r', TTDate::getBeginDayEpoch( TTDate::incrementDate( $now, -5, 'day' ) ) ), 'Start date Matches.' ); $this->assertEquals( date( 'r', $result['end_date'] ), date( 'r', TTDate::getEndDayEpoch( TTDate::incrementDate( $now, 4, 'day' ) ) ), 'End date Matches.' ); $this->assertEquals( date( 'r', $result['due_date'] ), date( 'r', TTDate::getMiddleDayEpoch( TTDate::incrementDate( $result['end_date'], 1, 'day' ) ) ), 'Due date Matches.' ); $this->user_id = $dd->createUser( $this->company_id, $this->legal_entity_id, 999 ); Debug::text( 'User ID: ' . $this->user_id, __FILE__, __LINE__, __METHOD__, 10 ); $user_obj = $this->getUserObject( $this->user_id ); $user_obj->setHireDate( $now ); Debug::Text( 'SECOND User Hire Date: ' . TTDate::getDate( 'DATE+TIME', $user_obj->getHireDate() ), __FILE__, __LINE__, __METHOD__, 10 ); $this->assertEquals( true, $user_obj->isValid() ); if ( $user_obj->isValid() ) { $user_obj->Save( false ); } $result = $praef->calculateNextDate( null, $now ); //Debug::Arr( $result, 'SECOND RESULT: ', __FILE__, __LINE__, __METHOD__, 10 ); $this->assertEquals( date( 'r', $result['start_date'] ), date( 'r', TTDate::getBeginDayEpoch( TTDate::incrementDate( $now, -5, 'day' ) ) ), 'Start date Matches.' ); $this->assertEquals( date( 'r', $result['end_date'] ), date( 'r', TTDate::getEndDayEpoch( TTDate::incrementDate( $now, 4, 'day' ) ) ), 'End date Matches.' ); $this->assertEquals( date( 'r', $result['due_date'] ), date( 'r', TTDate::getMiddleDayEpoch( TTDate::incrementDate( $now, 5, 'day' ) ) ), 'Due date Matches.' ); $this->user_id = $dd->createUser( $this->company_id, $this->legal_entity_id, 999 ); Debug::Text( 'User ID: ' . $this->user_id, __FILE__, __LINE__, __METHOD__, 10 ); $user_obj = $this->getUserObject( $this->user_id ); $user_obj->setHireDate( TTDate::incrementDate( $now, 30, 'day' ) ); Debug::Text( 'THIRD User Hire Date: ' . TTDate::getDate( 'DATE+TIME', $user_obj->getHireDate() ) . ' User ID: ' . $this->user_id, __FILE__, __LINE__, __METHOD__, 10 ); $this->assertEquals( true, $user_obj->isValid() ); if ( $user_obj->isValid() ) { $user_obj->Save( false ); } $result = $praef->calculateNextDate( null, $now ); //Debug::Arr( $result, 'THIRD RESULT: ', __FILE__, __LINE__, __METHOD__, 10 ); $this->assertEquals( date( 'r', $result['start_date'] ), date( 'r', TTDate::getBeginDayEpoch( TTDate::incrementDate( $now, -5, 'day' ) ) ), 'Start date Matches.' ); $this->assertEquals( date( 'r', $result['end_date'] ), date( 'r', TTDate::getEndDayEpoch( TTDate::incrementDate( $now, 4, 'day' ) ) ), 'End date Matches.' ); $this->assertEquals( date( 'r', $result['due_date'] ), date( 'r', TTDate::getMiddleDayEpoch( TTDate::incrementDate( $result['end_date'], 1, 'day' ) ) ), 'Due date Matches.' ); //test gap. should return empty dates $praef->setEnableRecalculateDates( true ); if ( $praef->isValid() ) { $praef->Save( false ); } $result = $praef->calculateNextDate( null, TTDate::incrementDate( $now, 20, 'day' ) ); //Debug::Arr( $result, 'FOURTH RESULT: ', __FILE__, __LINE__, __METHOD__, 10 ); $this->assertEquals( true, is_array( $result ), '$result should be an array.' ); $this->assertCount( 3, $result, '$result should have 3 elements.' ); $this->assertEmpty( $result['start_date'], '$result elements should be empty.' ); $this->assertEmpty( $result['end_date'], '$result elements should be empty.' ); $this->assertEmpty( $result['due_date'], '$result elements should be empty.' ); $praef->setEnableRecalculateDates( true ); if ( $praef->isValid() ) { $praef->Save( false ); } Debug::Text( 'Expected User ID: ' . $this->user_id, __FILE__, __LINE__, __METHOD__, 10 ); $result = $praef->calculateNextDate( null, TTDate::incrementDate( $now, 31, 'day' ) ); //Debug::Arr( $result, 'FIFTH RESULT: ', __FILE__, __LINE__, __METHOD__, 10 ); $this->assertEquals( true, is_array( $result ), '$result should be an array.' ); $this->assertCount( 3, $result, '$result should have 3 elements.' ); $this->assertNotEmpty( $result['start_date'], '$result elements should not be empty.' ); $this->assertNotEmpty( $result['end_date'], '$result elements should not be empty.' ); $this->assertNotEmpty( $result['due_date'], '$result elements should not be empty.' ); $this->assertEquals( date( 'r', $result['start_date'] ), date( 'r', TTDate::getBeginDayEpoch( TTDate::incrementDate( $now, 30, 'day' ) ) ), 'Start date Matches.' ); $this->assertEquals( date( 'r', $result['end_date'] ), date( 'r', TTDate::getEndDayEpoch( TTDate::incrementDate( $now, 39, 'day' ) ) ), 'End date Matches.' ); $this->assertEquals( date( 'r', $result['due_date'] ), date( 'r', TTDate::getMiddleDayEpoch( TTDate::incrementDate( $result['end_date'], 1, 'day' ) ) ), 'Due date Matches.' ); } /** * @group PayrollRemittanceAgencyEvent_testOnTermination */ function testOnTermination() { global $dd; Debug::text( 'Running setUp(): ', __FILE__, __LINE__, __METHOD__, 10 ); $this->user_id = $dd->createUser( $this->company_id, $this->legal_entity_id, 999, null, null, null, null, null, null, null, null, null, null, null, strtotime( '24-Jan-2014' ) ); Debug::text( 'User ID: ' . $this->user_id, __FILE__, __LINE__, __METHOD__, 10 ); $user_obj = $this->getUserObject( $this->user_id ); $user_obj->setTerminationDate( strtotime( '05-Jun-2016' ) ); $this->assertEquals( true, $user_obj->isValid(), $user_obj->Validator->getTextErrors() ); if ( $user_obj->isValid() ) { $user_obj->Save( false ); } $praef = TTnew( 'PayrollRemittanceAgencyEventFactory' ); /** @var PayrollRemittanceAgencyEventFactory $praef */ $praef->setPayrollRemittanceAgencyId( $this->agency_id ); $praef->setDueDateDelayDays( 10 ); $praef->setStatus( 10 ); //enabled $praef->setType( 'T4' ); $praef->setReminderDays( 0 ); $praef->setFrequency( 90200 ); //On Termination Event Frequency $praef->setEffectiveDate( strtotime( '05-Jun-2016' ) ); $this->assertEquals( true, $praef->isValid() ); if ( $praef->isValid() ) { $praef->Save( false ); } $praef->getPayrollRemittanceAgencyObject()->setAlwaysOnWeekDay( 0 ); $praef->getPayrollRemittanceAgencyObject()->save(); $result = $praef->calculateNextDate( null, strtotime( '05-Jun-2016' ) ); Debug::Arr( $result, 'FIRST RESULT: ', __FILE__, __LINE__, __METHOD__, 10 ); //sanity check $this->assertEquals( true, is_array( $result ), '$result should be an array.' ); $this->assertCount( 3, $result, '$result should have 3 elements.' ); $this->assertNotEmpty( $result['start_date'], '$result elements should not be empty.' ); $this->assertNotEmpty( $result['end_date'], '$result elements should not be empty.' ); $this->assertNotEmpty( $result['due_date'], '$result elements should not be empty.' ); $this->assertEquals( date( 'r', $result['start_date'] ), date( 'r', strtotime( '05-Jun-2016 00:00:00' ) ), 'Start date Matches.' ); $this->assertEquals( date( 'r', $result['end_date'] ), date( 'r', strtotime( '14-Jun-2016 23:59:59' ) ), 'End date Matches.' ); $this->assertEquals( date( 'r', $result['due_date'] ), date( 'r', strtotime( '15-Jun-2016 12:00:00' ) ), 'Due date Matches.' ); $this->user_id = $dd->createUser( $this->company_id, $this->legal_entity_id, 999, null, null, null, null, null, null, null, null, null, null, null, strtotime( '24-Jan-2014' ) ); Debug::text( 'User ID: ' . $this->user_id, __FILE__, __LINE__, __METHOD__, 10 ); $user_obj = $this->getUserObject( $this->user_id ); $user_obj->setTerminationDate( strtotime( '07-Jun-2016' ) ); $this->assertEquals( true, $user_obj->isValid(), $user_obj->Validator->getTextErrors() ); if ( $user_obj->isValid() ) { $user_obj->Save( false ); } $result = $praef->calculateNextDate( null, strtotime( '07-Jun-2016' ) ); Debug::Arr( $result, 'SECOND RESULT: ', __FILE__, __LINE__, __METHOD__, 10 ); $this->assertEquals( date( 'r', $result['start_date'] ), date( 'r', strtotime( '05-Jun-2016 00:00:00' ) ), 'Start date Matches.' ); $this->assertEquals( date( 'r', $result['end_date'] ), date( 'r', strtotime( '14-Jun-2016 23:59:59' ) ), 'End date Matches.' ); $this->assertEquals( date( 'r', $result['due_date'] ), date( 'r', strtotime( '15-Jun-2016 12:00:00' ) ), 'Due date Matches.' ); $this->user_id = $dd->createUser( $this->company_id, $this->legal_entity_id, 999, null, null, null, null, null, null, null, null, null, null, null, strtotime( '24-Jan-2014' ) ); Debug::text( 'User ID: ' . $this->user_id, __FILE__, __LINE__, __METHOD__, 10 ); $user_obj = $this->getUserObject( $this->user_id ); $user_obj->setTerminationDate( strtotime( '20-Jun-2016' ) ); $this->assertEquals( true, $user_obj->isValid(), $user_obj->Validator->getTextErrors() ); if ( $user_obj->isValid() ) { $user_obj->Save( false ); } $result = $praef->calculateNextDate( null, strtotime( '20-Jun-2016' ) ); Debug::Arr( $result, 'THIRD RESULT: ', __FILE__, __LINE__, __METHOD__, 10 ); $this->assertEquals( date( 'r', $result['start_date'] ), date( 'r', strtotime( '20-Jun-2016 00:00:00' ) ), 'Start date Matches.' ); $this->assertEquals( date( 'r', $result['end_date'] ), date( 'r', strtotime( '29-Jun-2016 23:59:59' ) ), 'End date Matches.' ); $this->assertEquals( date( 'r', $result['due_date'] ), date( 'r', strtotime( '30-Jun-2016 12:00:00' ) ), 'Due date Matches.' ); } /** * @group PayrollRemittanceAgencyEvent_testOnTerminationGaps */ function testOnTerminationGaps() { global $dd; $now = TTDate::getMiddleDayEpoch( time() ); Debug::text( 'Running setUp(): ', __FILE__, __LINE__, __METHOD__, 10 ); $this->user_id = $dd->createUser( $this->company_id, $this->legal_entity_id, 999, null, null, null, null, null, null, null, null, null, null, null, strtotime( '24-Jan-2014' ) ); Debug::text( 'User ID: ' . $this->user_id, __FILE__, __LINE__, __METHOD__, 10 ); $user_obj = $this->getUserObject( $this->user_id ); $user_obj->setTerminationDate( TTDate::incrementDate( $now, -5, 'day' ) ); Debug::Text( 'FIRST User Hire Date: ' . TTDate::getDate( 'DATE+TIME', $user_obj->getHireDate() ), __FILE__, __LINE__, __METHOD__, 10 ); $this->assertEquals( true, $user_obj->isValid(), $user_obj->Validator->getTextErrors() ); if ( $user_obj->isValid() ) { $user_obj->Save( false ); } $praef = TTnew( 'PayrollRemittanceAgencyEventFactory' ); /** @var PayrollRemittanceAgencyEventFactory $praef */ $praef->setPayrollRemittanceAgencyId( $this->agency_id ); $praef->setDueDateDelayDays( 10 ); $praef->setStatus( 10 ); //enabled $praef->setType( 'T4' ); $praef->setReminderDays( 0 ); $praef->setFrequency( 90200 ); //On Hire Event Frequency $praef->setEffectiveDate( $now ); $this->assertEquals( true, $praef->isValid() ); if ( $praef->isValid() ) { $praef->Save( false ); } $result = $praef->calculateNextDate(); //Debug::Arr( $result, 'FIRST RESULT: ', __FILE__, __LINE__, __METHOD__, 10 ); //sanity check $this->assertEquals( true, is_array( $result ), '$result should be an array.' ); $this->assertCount( 3, $result, '$result should have 3 elements.' ); $this->assertNotEmpty( $result['start_date'], '$result elements should not be empty.' ); $this->assertNotEmpty( $result['end_date'], '$result elements should not be empty.' ); $this->assertNotEmpty( $result['due_date'], '$result elements should not be empty.' ); $this->assertEquals( date( 'r', $result['start_date'] ), date( 'r', TTDate::getBeginDayEpoch( TTDate::incrementDate( $now, -5, 'day' ) ) ), 'Start date Matches.' ); $this->assertEquals( date( 'r', $result['end_date'] ), date( 'r', TTDate::getEndDayEpoch( TTDate::incrementDate( $now, 4, 'day' ) ) ), 'End date Matches.' ); $this->assertEquals( date( 'r', $result['due_date'] ), date( 'r', TTDate::incrementDate( $now, 5, 'day' ) ), 'Due date Matches.' ); $this->user_id = $dd->createUser( $this->company_id, $this->legal_entity_id, 999, null, null, null, null, null, null, null, null, null, null, null, strtotime( '24-Jan-2014' ) ); Debug::text( 'User ID: ' . $this->user_id, __FILE__, __LINE__, __METHOD__, 10 ); $user_obj = $this->getUserObject( $this->user_id ); $user_obj->setTerminationDate( $now ); Debug::Text( 'SECOND User Hire Date: ' . TTDate::getDate( 'DATE+TIME', $user_obj->getHireDate() ), __FILE__, __LINE__, __METHOD__, 10 ); $this->assertEquals( true, $user_obj->isValid(), $user_obj->Validator->getTextErrors() ); if ( $user_obj->isValid() ) { $user_obj->Save( false ); } $result = $praef->calculateNextDate(); //Debug::Arr( $result, 'SECOND RESULT: ', __FILE__, __LINE__, __METHOD__, 10 ); $this->assertEquals( date( 'r', $result['start_date'] ), date( 'r', TTDate::getBeginDayEpoch( TTDate::incrementDate( $now, -5, 'day' ) ) ), 'Start date Matches.' ); $this->assertEquals( date( 'r', $result['end_date'] ), date( 'r', TTDate::getEndDayEpoch( TTDate::incrementDate( $now, 4, 'day' ) ) ), 'End date Matches.' ); $this->assertEquals( date( 'r', $result['due_date'] ), date( 'r', TTDate::incrementDate( $now, 5, 'day' ) ), 'Due date Matches.' ); $this->user_id = $dd->createUser( $this->company_id, $this->legal_entity_id, 999, null, null, null, null, null, null, null, null, null, null, null, strtotime( '24-Jan-2014' ) ); Debug::Text( 'User ID: ' . $this->user_id, __FILE__, __LINE__, __METHOD__, 10 ); $user_obj = $this->getUserObject( $this->user_id ); $user_obj->setTerminationDate( TTDate::incrementDate( $now, 30, 'day' ) ); Debug::Text( 'THIRD User Hire Date: ' . TTDate::getDate( 'DATE+TIME', $user_obj->getHireDate() ), __FILE__, __LINE__, __METHOD__, 10 ); $this->assertEquals( true, $user_obj->isValid(), $user_obj->Validator->getTextErrors() ); if ( $user_obj->isValid() ) { $user_obj->Save( false ); } $result = $praef->calculateNextDate(); //Debug::Arr( $result, 'THIRD RESULT: ', __FILE__, __LINE__, __METHOD__, 10 ); $this->assertEquals( date( 'r', $result['start_date'] ), date( 'r', TTDate::getBeginDayEpoch( TTDate::incrementDate( $now, -5, 'day' ) ) ), 'Start date Matches.' ); $this->assertEquals( date( 'r', $result['end_date'] ), date( 'r', TTDate::getEndDayEpoch( TTDate::incrementDate( $now, 4, 'day' ) ) ), 'End date Matches.' ); $this->assertEquals( date( 'r', $result['due_date'] ), date( 'r', TTDate::incrementDate( $now, 5, 'day' ) ), 'Due date Matches.' ); //test gap. should return empty dates $praef->setEnableRecalculateDates( true ); if ( $praef->isValid() ) { $praef->Save( false ); } $result = $praef->calculateNextDate( null, TTDate::incrementDate( $now, 20, 'day' ) ); //Debug::Arr( $result, 'FOURTH RESULT: ', __FILE__, __LINE__, __METHOD__, 10 ); $this->assertEquals( true, is_array( $result ), '$result should be an array.' ); $this->assertCount( 3, $result, '$result should have 3 elements.' ); $this->assertEmpty( $result['start_date'], '$result elements should be empty.' ); $this->assertEmpty( $result['end_date'], '$result elements should be empty.' ); $this->assertEmpty( $result['due_date'], '$result elements should be empty.' ); $praef->setEnableRecalculateDates( true ); if ( $praef->isValid() ) { $praef->Save( false ); } $result = $praef->calculateNextDate( null, TTDate::incrementDate( $now, 31, 'day' ) ); //Debug::Arr( $result, 'FIFTH RESULT: ', __FILE__, __LINE__, __METHOD__, 10 ); $this->assertEquals( true, is_array( $result ), '$result should be an array.' ); $this->assertCount( 3, $result, '$result should have 3 elements.' ); $this->assertNotEmpty( $result['start_date'], '$result elements should not be empty.' ); $this->assertNotEmpty( $result['end_date'], '$result elements should not be empty.' ); $this->assertNotEmpty( $result['due_date'], '$result elements should not be empty.' ); $this->assertEquals( date( 'r', $result['start_date'] ), date( 'r', TTDate::getBeginDayEpoch( TTDate::incrementDate( $now, 30, 'day' ) ) ), 'Start date Matches.' ); $this->assertEquals( date( 'r', $result['end_date'] ), date( 'r', TTDate::getEndDayEpoch( TTDate::incrementDate( $now, 39, 'day' ) ) ), 'End date Matches.' ); $this->assertEquals( date( 'r', $result['due_date'] ), date( 'r', TTDate::incrementDate( $now, 40, 'day' ) ), 'Due date Matches.' ); } /** * @group PayrollRemittanceAgencyEvent_testOnTerminationByPayPeriod */ function testOnTerminationByPayPeriod() { global $dd; $test_start_date = strtotime( '01-Jan-2017 12:00PM' ); //should be day before first pay perdio start date. $ppsf_id = $this->setupPayPeriodTest( $test_start_date ); $this->assertEquals( true, TTUUID::isUUID( $ppsf_id ), 'Pay period schedule id must be a UUID.' ); $praef = TTnew( 'PayrollRemittanceAgencyEventFactory' ); /** @var PayrollRemittanceAgencyEventFactory $praef */ $praef->setPayrollRemittanceAgencyId( $this->agency_id ); $praef->setFrequency( 90310 ); //On Hire Event Frequency $praef->setDueDateDelayDays( 10 ); $praef->setReminderDays( 3 ); $praef->setType( 'T4' ); $praef->setStatus( 10 ); //enabled $praef->setEffectiveDate( strtotime( '01-Jan-2017' ) ); if ( $praef->isValid() ) { $praef->Save( false, true ); } //workaround for set requiring an object_id $praef->setPayPeriodSchedule( [ $ppsf_id ] ); if ( $praef->isValid() ) { $praef->Save( false, true ); } $user_id = $dd->createUser( $this->company_id, $this->legal_entity_id, 999, null, null, null, null, null, null, null, null, null, null, null, strtotime( '24-Jan-2014' ) ); Debug::text( 'User ID: ' . $user_id, __FILE__, __LINE__, __METHOD__, 10 ); $user_obj = $this->getUserObject( $user_id ); $user_obj->setTerminationDate( strtotime( '01-Jan-2017' ) ); $this->assertEquals( true, $user_obj->isValid(), $user_obj->Validator->getTextErrors() ); if ( $user_obj->isValid() ) { $user_obj->Save(); } $this->addUserToPayPeriodSchedule( $ppsf_id, $user_id ); $fake_time = strtotime( '01-Jan-2017' ); $result = $praef->calculateNextDate( null, $fake_time ); Debug::Arr( $result, 'FIRST RESULT: ', __FILE__, __LINE__, __METHOD__, 10 ); //sanity check $this->assertEquals( true, is_array( $result ), '$result should be an array.' ); $this->assertCount( 3, $result, '$result should have 3 elements.' ); //failure. $this->assertNotEmpty( $result['start_date'], '$result elements should not be empty.' ); $this->assertNotEmpty( $result['end_date'], '$result elements should not be empty.' ); $this->assertNotEmpty( $result['due_date'], '$result elements should not be empty.' ); $this->assertEquals( date( 'r', $result['start_date'] ), date( 'r', strtotime( '01-Jan-2017 00:00:00' ) ), 'Start date Matches.' ); $this->assertEquals( date( 'r', $result['end_date'] ), date( 'r', strtotime( '14-Jan-2017 23:59:59' ) ), 'End date Matches.' ); $this->assertEquals( date( 'r', $result['due_date'] ), date( 'r', strtotime( '24-Jan-2017 12:00:00' ) ), 'Due date Matches.' ); $user_id = $dd->createUser( $this->company_id, $this->legal_entity_id, 999, null, null, null, null, null, null, null, null, null, null, null, strtotime( '24-Jan-2014' ) ); Debug::text( 'User ID: ' . $user_id, __FILE__, __LINE__, __METHOD__, 10 ); $user_obj = $this->getUserObject( $user_id ); $user_obj->setTerminationDate( strtotime( '10-Jan-2017' ) ); $this->assertEquals( true, $user_obj->isValid(), $user_obj->Validator->getTextErrors() ); if ( $user_obj->isValid() ) { $user_obj->Save(); } $this->addUserToPayPeriodSchedule( $ppsf_id, $user_id ); $fake_time = strtotime( '01-Jan-2017' ); $result = $praef->calculateNextDate( null, $fake_time ); Debug::Arr( $result, 'SECOND RESULT: ', __FILE__, __LINE__, __METHOD__, 10 ); $this->assertEquals( date( 'r', $result['start_date'] ), date( 'r', strtotime( '01-Jan-2017 00:00:00' ) ), 'Start date Matches.' ); $this->assertEquals( date( 'r', $result['end_date'] ), date( 'r', strtotime( '14-Jan-2017 23:59:59' ) ), 'End date Matches.' ); $this->assertEquals( date( 'r', $result['due_date'] ), date( 'r', strtotime( '24-Jan-2017 12:00:00' ) ), 'Due date Matches.' ); $user_id = $dd->createUser( $this->company_id, $this->legal_entity_id, 999, null, null, null, null, null, null, null, null, null, null, null, strtotime( '24-Jan-2014' ) ); Debug::text( 'User ID: ' . $user_id, __FILE__, __LINE__, __METHOD__, 10 ); $user_obj = $this->getUserObject( $user_id ); $user_obj->setTerminationDate( strtotime( '10-Feb-2017' ) ); $this->assertEquals( true, $user_obj->isValid(), $user_obj->Validator->getTextErrors() ); if ( $user_obj->isValid() ) { $user_obj->Save(); } $this->addUserToPayPeriodSchedule( $ppsf_id, $user_id ); $fake_time = strtotime( '10-Jan-2017' ); $result = $praef->calculateNextDate( null, $fake_time ); Debug::Arr( $result, 'SECOND RESULT: ', __FILE__, __LINE__, __METHOD__, 10 ); $this->assertEquals( date( 'r', $result['start_date'] ), date( 'r', strtotime( '01-Jan-2017 00:00:00' ) ), 'Start date Matches.' ); $this->assertEquals( date( 'r', $result['end_date'] ), date( 'r', strtotime( '14-Jan-2017 23:59:59' ) ), 'End date Matches.' ); $this->assertEquals( date( 'r', $result['due_date'] ), date( 'r', strtotime( '24-Jan-2017 12:00:00' ) ), 'Due date Matches.' ); $praef->setEnableRecalculateDates( true ); if ( $praef->isValid() ) { $praef->Save( false ); } $fake_time = strtotime( '25-Jan-2017' ); $result = $praef->calculateNextDate( null, $fake_time ); $this->assertEquals( true, is_array( $result ), '$result should be an array.' ); $this->assertCount( 3, $result, '$result should have 3 elements.' ); $this->assertEmpty( $result['start_date'], '$result elements should be empty.' ); $this->assertEmpty( $result['end_date'], '$result elements should be empty.' ); $this->assertEmpty( $result['due_date'], '$result elements should be empty.' ); $fake_time = strtotime( '09-Feb-2017' ); $result = $praef->calculateNextDate( null, $fake_time ); //$result = $praef->calculateNextDate(); Debug::Arr( $result, 'THIRD RESULT: ', __FILE__, __LINE__, __METHOD__, 10 ); //LEFT OFF HERE $this->assertEquals( date( 'r', (int)$result['start_date'] ), date( 'r', strtotime( '29-Jan-2017 00:00:00' ) ), 'Start date Matches.' ); $this->assertEquals( date( 'r', (int)$result['end_date'] ), date( 'r', strtotime( '11-Feb-2017 23:59:59' ) ), 'End date Matches.' ); $this->assertEquals( date( 'r', (int)$result['due_date'] ), date( 'r', strtotime( '21-Feb-2017 12:00:00' ) ), 'Due date Matches.' ); } /** * @group PayrollRemittanceAgencyEvent_testPreSave */ function testPreSave() { //testing that recalc is happening properly on save. $praef = TTnew( 'PayrollRemittanceAgencyEventFactory' ); /** @var PayrollRemittanceAgencyEventFactory $praef */ $praef->setPayrollRemittanceAgencyId( $this->agency_id ); $praef->setFrequency( 4100 ); //monthly $praef->setPrimaryDayOfMonth( 10 ); $praef->setEffectiveDate( strtotime( '01-Nov-2016' ) ); $praef->setDueDateDelayDays( 0 ); $praef->setReminderDays( 3 ); $praef->setType( 'T4' ); $praef->setStatus( 10 ); //enabled if ( $praef->isValid() ) { $praef->Save( false, true ); } $this->assertEquals( date( 'r', $praef->getStartDate() ), date( 'r', strtotime( '01-Nov-2016 12:00AM' ) ) ); $this->assertEquals( date( 'r', $praef->getEndDate() ), date( 'r', strtotime( '30-Nov-2016 11:59:59PM' ) ) ); $this->assertEquals( date( 'r', $praef->getDueDate() ), date( 'r', strtotime( '10-Dec-2016 12:00PM' ) ) ); $praef->setEffectiveDate( strtotime( '01-Dec-2016' ) ); $praef->setEnableRecalculateDates( true ); if ( $praef->isValid() ) { $praef->Save( false, true ); } $this->assertEquals( date( 'r', $praef->getStartDate() ), date( 'r', strtotime( '01-Dec-2016 12:00AM' ) ) ); $this->assertEquals( date( 'r', $praef->getEndDate() ), date( 'r', strtotime( '31-Dec-2016 11:59:59PM' ) ) ); $this->assertEquals( date( 'r', $praef->getDueDate() ), date( 'r', strtotime( '10-Jan-2017 12:00PM' ) ) ); $praef->setEffectiveDate( strtotime( '01-Jan-2017' ) ); $praef->setEnableRecalculateDates( true ); if ( $praef->isValid() ) { $praef->Save( false, true ); } $this->assertEquals( date( 'r', $praef->getStartDate() ), date( 'r', strtotime( '01-Jan-2017 12:00AM' ) ) ); $this->assertEquals( date( 'r', $praef->getEndDate() ), date( 'r', strtotime( '31-Jan-2017 11:59:59PM' ) ) ); $this->assertEquals( date( 'r', $praef->getDueDate() ), date( 'r', strtotime( '10-Feb-2017 12:00PM' ) ) ); $praef->setEffectiveDate( strtotime( '01-Feb-2017' ) ); $praef->setEnableRecalculateDates( true ); if ( $praef->isValid() ) { $praef->Save( false, true ); } $this->assertEquals( date( 'r', $praef->getStartDate() ), date( 'r', strtotime( '01-Feb-2017 12:00AM' ) ) ); $this->assertEquals( date( 'r', $praef->getEndDate() ), date( 'r', strtotime( '28-Feb-2017 11:59:59PM' ) ) ); $this->assertEquals( date( 'r', $praef->getDueDate() ), date( 'r', strtotime( '10-Mar-2017 12:00PM' ) ) ); $praef->setEffectiveDate( strtotime( '01-Mar-2017' ) ); $praef->setEnableRecalculateDates( true ); if ( $praef->isValid() ) { $praef->Save( false, true ); } $this->assertEquals( date( 'r', $praef->getStartDate() ), date( 'r', strtotime( '01-Mar-2017 12:00AM' ) ) ); $this->assertEquals( date( 'r', $praef->getEndDate() ), date( 'r', strtotime( '31-Mar-2017 11:59:59PM' ) ) ); $this->assertEquals( date( 'r', $praef->getDueDate() ), date( 'r', strtotime( '10-Apr-2017 12:00PM' ) ) ); } /** * @group PayrollRemittanceAgencyEvent_testReminderDays */ function testReminderDays() { $praef = TTnew( 'PayrollRemittanceAgencyEventFactory' ); /** @var PayrollRemittanceAgencyEventFactory $praef */ $praef->setPayrollRemittanceAgencyId( $this->agency_id ); $praef->setFrequency( 4100 ); //monthly $praef->setPrimaryDayOfMonth( 10 ); $praef->setEffectiveDate( strtotime( '01-Jan-2016' ) ); $praef->setDueDateDelayDays( 0 ); $praef->setType( 'T4' ); $praef->setStatus( 10 ); //enabled $praef->setReminderDays( 0 ); $praef->setEffectiveDate( strtotime( '01-Jan-2016' ) ); $praef->setEnableRecalculateDates( true ); if ( $praef->isValid() ) { $praef->Save( false, true ); } $this->assertEquals( date( 'r', $praef->getNextReminderDate() ), date( 'r', strtotime( '10-Feb-2016 12:00PM' ) ) ); $praef = TTnew( 'PayrollRemittanceAgencyEventFactory' ); /** @var PayrollRemittanceAgencyEventFactory $praef */ $praef->setPayrollRemittanceAgencyId( $this->agency_id ); $praef->setFrequency( 4100 ); //monthly $praef->setPrimaryDayOfMonth( 10 ); $praef->setEffectiveDate( strtotime( '01-Jan-2016' ) ); $praef->setDueDateDelayDays( 0 ); $praef->setType( 'T4' ); $praef->setStatus( 10 ); //enabled $praef->setReminderDays( 3 ); $praef->setEffectiveDate( strtotime( '01-Jan-2016' ) ); $praef->setEnableRecalculateDates( true ); if ( $praef->isValid() ) { $praef->Save( false, true ); } $this->assertEquals( date( 'r', $praef->getNextReminderDate() ), date( 'r', strtotime( '07-Feb-2016 12:00PM' ) ) ); $praef = TTnew( 'PayrollRemittanceAgencyEventFactory' ); /** @var PayrollRemittanceAgencyEventFactory $praef */ $praef->setPayrollRemittanceAgencyId( $this->agency_id ); $praef->setFrequency( 4100 ); //monthly $praef->setPrimaryDayOfMonth( 10 ); $praef->setEffectiveDate( strtotime( '01-Jan-2016' ) ); $praef->setDueDateDelayDays( 0 ); $praef->setType( 'T4' ); $praef->setStatus( 10 ); //enabled $praef->setReminderDays( 5 ); $praef->setEffectiveDate( strtotime( '01-Jan-2016' ) ); $praef->setEnableRecalculateDates( true ); if ( $praef->isValid() ) { $praef->Save( false, true ); } $this->assertEquals( date( 'r', $praef->getNextReminderDate() ), date( 'r', strtotime( '05-Feb-2016 12:00PM' ) ) ); $praef = TTnew( 'PayrollRemittanceAgencyEventFactory' ); /** @var PayrollRemittanceAgencyEventFactory $praef */ $praef->setPayrollRemittanceAgencyId( $this->agency_id ); $praef->setFrequency( 4100 ); //monthly $praef->setPrimaryDayOfMonth( 10 ); $praef->setEffectiveDate( strtotime( '01-Jan-2016' ) ); $praef->setDueDateDelayDays( 0 ); $praef->setType( 'T4' ); $praef->setStatus( 10 ); //enabled $praef->setReminderDays( -5 ); $praef->setEffectiveDate( strtotime( '01-Jan-2016' ) ); $praef->setEnableRecalculateDates( true ); if ( $praef->isValid() ) { $praef->Save( false, true ); } $this->assertEquals( date( 'r', $praef->getNextReminderDate( true ) ), date( 'r', strtotime( '15-Feb-2016 12:00PM' ) ) ); //Make sure you test the case where this is no due date, and therefore no reminder date. $praef = TTnew( 'PayrollRemittanceAgencyEventFactory' ); /** @var PayrollRemittanceAgencyEventFactory $praef */ $praef->setPayrollRemittanceAgencyId( $this->agency_id ); $praef->setFrequency( 4100 ); //monthly $praef->setPrimaryDayOfMonth( 10 ); $praef->setEffectiveDate( strtotime( '01-Jan-2016' ) ); $praef->setDueDateDelayDays( 0 ); $praef->setType( 'T4' ); $praef->setStatus( 10 ); //enabled $praef->setReminderDays( -5 ); $praef->setEffectiveDate( strtotime( '01-Jan-2016' ) ); //not saved. no due date means no reminder date. $this->assertEquals( false, $praef->getNextReminderDate( true ) ); //Make sure you test the case where this is no due date, and therefore no reminder date. $praef = TTnew( 'PayrollRemittanceAgencyEventFactory' ); /** @var PayrollRemittanceAgencyEventFactory $praef */ $praef->setPayrollRemittanceAgencyId( $this->agency_id ); $praef->setFrequency( 1000 ); //each pay period (with no pay period set) $praef->setDueDateDelayDays( 0 ); $praef->setType( 'T4' ); $praef->setStatus( 10 ); //enabled $praef->setReminderDays( -5 ); $praef->setEffectiveDate( strtotime( '01-Jan-2016' ) ); //not saved. no due date means no reminder date. $this->assertEquals( false, $praef->getNextReminderDate( true ) ); $praef->setEnableRecalculateDates( true ); if ( $praef->isValid() ) { $praef->Save( false, true ); } //saved. should not be able to calculate a due date because no payperiods exist. $this->assertEquals( false, $praef->getNextReminderDate( true ) ); } } ?>