<?php /** @noinspection PhpMissingDocCommentInspection */

/*********************************************************************************
 *
 * TimeTrex is a Workforce Management program developed by
 * TimeTrex Software Inc. Copyright (C) 2003 - 2021 TimeTrex Software Inc.
 *
 * This program is free software; you can redistribute it and/or modify it under
 * the terms of the GNU Affero General Public License version 3 as published by
 * the Free Software Foundation with the addition of the following permission
 * added to Section 15 as permitted in Section 7(a): FOR ANY PART OF THE COVERED
 * WORK IN WHICH THE COPYRIGHT IS OWNED BY TIMETREX, TIMETREX DISCLAIMS THE
 * WARRANTY OF NON INFRINGEMENT OF THIRD PARTY RIGHTS.
 *
 * This program is distributed in the hope that it will be useful, but WITHOUT
 * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS
 * FOR A PARTICULAR PURPOSE.  See the GNU Affero General Public License for more
 * details.
 *
 *
 * You should have received a copy of the GNU Affero General Public License along
 * with this program; if not, see http://www.gnu.org/licenses or write to the Free
 * Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA
 * 02110-1301 USA.
 *
 *
 * You can contact TimeTrex headquarters at Unit 22 - 2475 Dobbin Rd. Suite
 * #292 West Kelowna, BC V4T 2E9, Canada or at email address info@timetrex.com.
 *
 *
 * The interactive user interfaces in modified source and object code versions
 * of this program must display Appropriate Legal Notices, as required under
 * Section 5 of the GNU Affero General Public License version 3.
 *
 *
 * In accordance with Section 7(b) of the GNU Affero General Public License
 * version 3, these Appropriate Legal Notices must retain the display of the
 * "Powered by TimeTrex" logo. If the display of the logo is not reasonably
 * feasible for technical reasons, the Appropriate Legal Notices must display
 * the words "Powered by TimeTrex".
 *
 ********************************************************************************/

class OverTimePolicyTest extends PHPUnit\Framework\TestCase {
	protected $company_id = null;
	protected $user_id = null;
	protected $pay_period_schedule_id = null;
	protected $pay_period_objs = null;
	protected $pay_stub_account_link_arr = null;

	public function setUp(): void {
		global $dd;
		Debug::text( 'Running setUp(): ', __FILE__, __LINE__, __METHOD__, 10 );

		TTDate::setTimeZone( 'America/Vancouver', true ); //Due to being a singleton and PHPUnit resetting the state, always force the timezone to be set.

		$dd = new DemoData();
		$dd->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 );

		//$dd->createPermissionGroups( $this->company_id, 40 ); //Administrator only.

		$dd->createCurrency( $this->company_id, 10 );

		$dd->createPayStubAccount( $this->company_id );
		$this->createPayStubAccounts();
		//$this->createPayStubAccrualAccount();
		$dd->createPayStubAccountLink( $this->company_id );
		$this->getPayStubAccountLinkArray();

		$dd->createUserWageGroups( $this->company_id );
		$this->user_wage_groups = $dd->user_wage_groups;

		$this->user_id = $dd->createUser( $this->company_id, $this->legal_entity_id, 100 );

		$this->createPayPeriodSchedule();
		$this->createPayPeriods();
		$this->getAllPayPeriods();


		$this->policy_ids['accrual_policy_account'][10] = $dd->createAccrualPolicyAccount( $this->company_id, 10 ); //Bank
		$this->policy_ids['accrual_policy_account'][20] = $dd->createAccrualPolicyAccount( $this->company_id, 20 ); //Vacation
		$this->policy_ids['accrual_policy_account'][30] = $dd->createAccrualPolicyAccount( $this->company_id, 30 ); //Sick

		$this->policy_ids['pay_formula_policy'][100] = $dd->createPayFormulaPolicy( $this->company_id, 100 ); //Reg 1.0x
		$this->policy_ids['pay_formula_policy'][910] = $this->createPayFormulaPolicy( $this->company_id, 910, $this->policy_ids['accrual_policy_account'][10] ); //Bank
		$this->policy_ids['pay_formula_policy'][1101] = $this->createPayFormulaPolicy( $this->company_id, 1101 ); //Reg Alt Wage #1
		$this->policy_ids['pay_formula_policy'][1102] = $this->createPayFormulaPolicy( $this->company_id, 1102 ); //Reg Alt Wage #2

		$this->policy_ids['pay_code'][100] = $dd->createPayCode( $this->company_id, 100, $this->policy_ids['pay_formula_policy'][100] ); //Regular
		$this->policy_ids['pay_code'][101] = $dd->createPayCode( $this->company_id, 101, $this->policy_ids['pay_formula_policy'][1101] ); //Regular B1 Alt Wage #1
		$this->policy_ids['pay_code'][102] = $dd->createPayCode( $this->company_id, 102, $this->policy_ids['pay_formula_policy'][1102] ); //Regular B2 Alt Wage #2
		$this->policy_ids['pay_code'][190] = $dd->createPayCode( $this->company_id, 190, $this->policy_ids['pay_formula_policy'][100] ); //Lunch
		$this->policy_ids['pay_code'][192] = $dd->createPayCode( $this->company_id, 192, $this->policy_ids['pay_formula_policy'][100] ); //Break
		$this->policy_ids['pay_code'][300] = $dd->createPayCode( $this->company_id, 300, $this->policy_ids['pay_formula_policy'][100] ); //Prem1
		$this->policy_ids['pay_code'][310] = $dd->createPayCode( $this->company_id, 310, $this->policy_ids['pay_formula_policy'][100] ); //Prem2
		$this->policy_ids['pay_code'][900] = $dd->createPayCode( $this->company_id, 900, $this->policy_ids['pay_formula_policy'][910] ); //Vacation
		$this->policy_ids['pay_code'][910] = $dd->createPayCode( $this->company_id, 910, $this->policy_ids['pay_formula_policy'][100] ); //Bank
		$this->policy_ids['pay_code'][920] = $dd->createPayCode( $this->company_id, 920, $this->policy_ids['pay_formula_policy'][100] ); //Sick

		$this->policy_ids['contributing_pay_code_policy'][10] = $dd->createContributingPayCodePolicy( $this->company_id, 10, [ $this->policy_ids['pay_code'][100], $this->policy_ids['pay_code'][101], $this->policy_ids['pay_code'][102] ] ); //Regular
		$this->policy_ids['contributing_pay_code_policy'][12] = $dd->createContributingPayCodePolicy( $this->company_id, 12, [ $this->policy_ids['pay_code'][100], $this->policy_ids['pay_code'][101], $this->policy_ids['pay_code'][102], $this->policy_ids['pay_code'][190], $this->policy_ids['pay_code'][192] ] ); //Regular+Meal/Break
		$this->policy_ids['contributing_pay_code_policy'][14] = $dd->createContributingPayCodePolicy( $this->company_id, 14, [ $this->policy_ids['pay_code'][100], $this->policy_ids['pay_code'][101], $this->policy_ids['pay_code'][102], $this->policy_ids['pay_code'][190], $this->policy_ids['pay_code'][192], $this->policy_ids['pay_code'][900] ] ); //Regular+Meal/Break+Absence
		$this->policy_ids['contributing_pay_code_policy'][90] = $dd->createContributingPayCodePolicy( $this->company_id, 90, [ $this->policy_ids['pay_code'][900] ] ); //Absence
		$this->policy_ids['contributing_pay_code_policy'][99] = $dd->createContributingPayCodePolicy( $this->company_id, 99, $this->policy_ids['pay_code'] ); //All Time

		$this->policy_ids['contributing_shift_policy'][10] = $dd->createContributingShiftPolicy( $this->company_id, 10, $this->policy_ids['contributing_pay_code_policy'][10] ); //Regular
		$this->policy_ids['contributing_shift_policy'][12] = $dd->createContributingShiftPolicy( $this->company_id, 20, $this->policy_ids['contributing_pay_code_policy'][12] ); //Regular+Meal/Break
		$this->policy_ids['contributing_shift_policy'][14] = $dd->createContributingShiftPolicy( $this->company_id, 40, $this->policy_ids['contributing_pay_code_policy'][14] ); //Regular+Meal/Break+Absence
		$this->policy_ids['contributing_shift_policy'][90] = $dd->createContributingShiftPolicy( $this->company_id, 90, $this->policy_ids['contributing_pay_code_policy'][90] ); //Absence

		$this->policy_ids['regular'][10] = $dd->createRegularTimePolicy( $this->company_id, 10, $this->policy_ids['contributing_shift_policy'][10], $this->policy_ids['pay_code'][100] );
		$this->policy_ids['regular'][12] = $dd->createRegularTimePolicy( $this->company_id, 20, $this->policy_ids['contributing_shift_policy'][12], $this->policy_ids['pay_code'][100] );

		$this->policy_ids['absence'][10] = $dd->createAbsencePolicy( $this->company_id, 10, $this->policy_ids['pay_code'][900] ); //Vacation
		$this->policy_ids['absence'][11] = $dd->createAbsencePolicy( $this->company_id, 11, $this->policy_ids['pay_code'][900] ); //Vacation (B)

		$this->branch_ids[] = $dd->createBranch( $this->company_id, 10 );
		$this->branch_ids[] = $dd->createBranch( $this->company_id, 20 );

		$this->assertTrue( TTUUID::isUUID( $this->company_id ) );
		$this->assertTrue( TTUUID::isUUID( $this->user_id ) );
	}

	public function tearDown(): void {
		Debug::text( 'Running tearDown(): ', __FILE__, __LINE__, __METHOD__, 10 );
	}

	function getPayStubAccountLinkArray() {
		$this->pay_stub_account_link_arr = [
				'total_gross'           => CompanyDeductionFactory::getPayStubEntryAccountByCompanyIDAndTypeAndFuzzyName( $this->company_id, 40, 'Total Gross' ),
				'total_deductions'      => CompanyDeductionFactory::getPayStubEntryAccountByCompanyIDAndTypeAndFuzzyName( $this->company_id, 40, 'Total Deductions' ),
				'employer_contribution' => CompanyDeductionFactory::getPayStubEntryAccountByCompanyIDAndTypeAndFuzzyName( $this->company_id, 40, 'Employer Total Contributions' ),
				'net_pay'               => CompanyDeductionFactory::getPayStubEntryAccountByCompanyIDAndTypeAndFuzzyName( $this->company_id, 40, 'Net Pay' ),
				'regular_time'          => CompanyDeductionFactory::getPayStubEntryAccountByCompanyIDAndTypeAndFuzzyName( $this->company_id, 10, 'Regular Time' ),
		];

		return true;
	}

	function createPayStubAccounts() {
		Debug::text( 'Saving.... Employee Deduction - Other', __FILE__, __LINE__, __METHOD__, 10 );
		$pseaf = new PayStubEntryAccountFactory();
		$pseaf->setCompany( $this->company_id );
		$pseaf->setStatus( 10 );
		$pseaf->setType( 20 );
		$pseaf->setName( 'Other' );
		$pseaf->setOrder( 290 );

		if ( $pseaf->isValid() ) {
			$pseaf->Save();
		}

		Debug::text( 'Saving.... Employee Deduction - Other2', __FILE__, __LINE__, __METHOD__, 10 );
		$pseaf = new PayStubEntryAccountFactory();
		$pseaf->setCompany( $this->company_id );
		$pseaf->setStatus( 10 );
		$pseaf->setType( 20 );
		$pseaf->setName( 'Other2' );
		$pseaf->setOrder( 291 );

		if ( $pseaf->isValid() ) {
			$pseaf->Save();
		}

		Debug::text( 'Saving.... Employee Deduction - 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::incrementDate( time(), -42, 'day' ) ); //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->setShiftAssignedDay( 10 );

		$ppsf->setEnableInitialPayPeriods( false );
		if ( $ppsf->isValid() ) {
			$insert_id = $ppsf->Save( false );
			Debug::Text( 'Pay Period Schedule ID: ' . $insert_id, __FILE__, __LINE__, __METHOD__, 10 );

			$ppsf->setUser( [ $this->user_id ] );
			$ppsf->Save();

			$this->pay_period_schedule_id = $insert_id;

			return $insert_id;
		}

		Debug::Text( 'Failed Creating Pay Period Schedule!', __FILE__, __LINE__, __METHOD__, 10 );

		return false;
	}

	function createPayPeriods() {
		$max_pay_periods = 35;

		$ppslf = new PayPeriodScheduleListFactory();
		$ppslf->getById( $this->pay_period_schedule_id );
		if ( $ppslf->getRecordCount() > 0 ) {
			$pps_obj = $ppslf->getCurrent();

			$end_date = null;
			for ( $i = 0; $i < $max_pay_periods; $i++ ) {
				if ( $i == 0 ) {
					$end_date = TTDate::getBeginWeekEpoch( ( TTDate::getBeginWeekEpoch( time() ) - ( 86400 * ( 7 * 52 ) ) ) ); //Go back 52 weeks.
				} else {
					$end_date = TTDate::incrementDate( $end_date, 14, 'day' );
				}

				Debug::Text( 'I: ' . $i . ' End Date: ' . TTDate::getDate( 'DATE+TIME', $end_date ), __FILE__, __LINE__, __METHOD__, 10 );

				$pps_obj->createNextPayPeriod( $end_date, ( 86400 + 3600 ), false ); //Don't import punches, as that causes deadlocks when running tests in parallel.
			}
		}

		return true;
	}

	function getAllPayPeriods() {
		$pplf = new PayPeriodListFactory();
		//$pplf->getByCompanyId( $this->company_id );
		$pplf->getByPayPeriodScheduleId( $this->pay_period_schedule_id );
		if ( $pplf->getRecordCount() > 0 ) {
			foreach ( $pplf as $pp_obj ) {
				Debug::text( 'Pay Period... Start: ' . TTDate::getDate( 'DATE+TIME', $pp_obj->getStartDate() ) . ' End: ' . TTDate::getDate( 'DATE+TIME', $pp_obj->getEndDate() ), __FILE__, __LINE__, __METHOD__, 10 );

				$this->pay_period_objs[] = $pp_obj;
			}
		}

		$this->pay_period_objs = array_reverse( $this->pay_period_objs );

		return true;
	}

	function getCurrentPayPeriod( $epoch = null ) {
		if ( $epoch == '' ) {
			$epoch = time();
		}

		$this->getAllPayPeriods(); //This doesn't return the pay periods, just populates an array and returns TRUE.
		$pay_periods = $this->pay_period_objs;
		if ( is_array( $pay_periods ) ) {
			foreach ( $pay_periods as $pp_obj ) {
				if ( $pp_obj->getStartDate() <= $epoch && $pp_obj->getEndDate() >= $epoch ) {
					Debug::text( 'Current Pay Period... Start: ' . TTDate::getDate( 'DATE+TIME', $pp_obj->getStartDate() ) . ' End: ' . TTDate::getDate( 'DATE+TIME', $pp_obj->getEndDate() ), __FILE__, __LINE__, __METHOD__, 10 );

					return $pp_obj;
				}
			}
		}

		Debug::text( 'Current Pay Period not found! Epoch: ' . TTDate::getDate( 'DATE+TIME', $epoch ), __FILE__, __LINE__, __METHOD__, 10 );

		return false;
	}

	function createSchedulePolicy( $type, $meal_policy_id ) {
		$spf = TTnew( 'SchedulePolicyFactory' ); /** @var SchedulePolicyFactory $spf */
		$spf->setCompany( $this->company_id );

		switch ( $type ) {
			case 10: //Normal
				$spf->setName( 'Schedule Policy' );
				//$spf->setAbsencePolicyID( 0 );
				$spf->setStartStopWindow( ( 3600 * 2 ) );
				break;
			case 20: //No Lunch
				$spf->setName( 'No Lunch' );
				//$spf->setAbsencePolicyID( 0 );
				$spf->setStartStopWindow( ( 3600 * 2 ) );
				break;
		}

		if ( $spf->isValid() ) {
			$insert_id = $spf->Save( false );

			$spf->setMealPolicy( $meal_policy_id );

			Debug::Text( 'Schedule Policy ID: ' . $insert_id, __FILE__, __LINE__, __METHOD__, 10 );

			return $insert_id;
		}

		Debug::Text( 'Failed Creating Schedule Policy!', __FILE__, __LINE__, __METHOD__, 10 );

		return false;
	}

	function createSchedule( $user_id, $date_stamp, $data = null ) {
		$sf = TTnew( 'ScheduleFactory' ); /** @var ScheduleFactory $sf */
		$sf->setCompany( $this->company_id );
		$sf->setUser( $user_id );
		//$sf->setUserDateId( UserDateFactory::findOrInsertUserDate( $user_id, $date_stamp) );

		if ( isset( $data['status_id'] ) ) {
			$sf->setStatus( $data['status_id'] );
		} else {
			$sf->setStatus( 10 );
		}

		if ( isset( $data['schedule_policy_id'] ) ) {
			$sf->setSchedulePolicyID( $data['schedule_policy_id'] );
		}

		if ( isset( $data['absence_policy_id'] ) ) {
			$sf->setAbsencePolicyID( $data['absence_policy_id'] );
		}
		if ( isset( $data['branch_id'] ) ) {
			$sf->setBranch( $data['branch_id'] );
		}
		if ( isset( $data['department_id'] ) ) {
			$sf->setDepartment( $data['department_id'] );
		}

		if ( isset( $data['job_id'] ) ) {
			$sf->setJob( $data['job_id'] );
		}

		if ( isset( $data['job_item_id'] ) ) {
			$sf->setJobItem( $data['job_item_id'] );
		}

		if ( isset( $data['punch_tag_id'] ) ) {
			$sf->setPunchTag( $data['punch_tag_id'] );
		}

		if ( $data['start_time'] != '' ) {
			$start_time = strtotime( $data['start_time'], $date_stamp );
		}
		if ( $data['end_time'] != '' ) {
			Debug::Text( 'End Time: ' . $data['end_time'] . ' Date Stamp: ' . $date_stamp, __FILE__, __LINE__, __METHOD__, 10 );
			$end_time = strtotime( $data['end_time'], $date_stamp );
			Debug::Text( 'bEnd Time: ' . $data['end_time'] . ' - ' . TTDate::getDate( 'DATE+TIME', $data['end_time'] ), __FILE__, __LINE__, __METHOD__, 10 );
		}

		$sf->setStartTime( $start_time );
		$sf->setEndTime( $end_time );

		if ( $sf->isValid() ) {
			$sf->setEnableReCalculateDay( true ); //This is needed to calculate accrual balances.
			$insert_id = $sf->Save();
			Debug::Text( 'Schedule ID: ' . $insert_id, __FILE__, __LINE__, __METHOD__, 10 );

			return $insert_id;
		}

		Debug::Text( 'Failed Creating Schedule!', __FILE__, __LINE__, __METHOD__, 10 );

		return false;
	}

	function createMealPolicy( $company_id, $type ) {
		$mpf = new MealPolicyFactory();
		$mpf->setCompany( $company_id );

		switch ( $type ) {
			case 100: //Normal 1hr lunch
				$mpf->setName( 'Normal' );
				$mpf->setType( 20 );
				$mpf->setTriggerTime( ( 3600 * 6 ) );
				$mpf->setAmount( 3600 );
				$mpf->setIncludeLunchPunchTime( false );
				$mpf->setPayCode( $this->policy_ids['pay_code'][190] );
				break;
			case 110: //AutoAdd 1hr
				$mpf->setName( 'AutoAdd 1hr' );
				$mpf->setType( 15 );
				$mpf->setTriggerTime( ( 3600 * 6 ) );
				$mpf->setAmount( 3600 );
				$mpf->setIncludeLunchPunchTime( false );
				$mpf->setPayCode( $this->policy_ids['pay_code'][190] );
				break;
			case 115: //AutoAdd 1hr
				$mpf->setName( 'AutoAdd 1hr' );
				$mpf->setType( 15 );
				$mpf->setTriggerTime( ( 3600 * 6 ) );
				$mpf->setAmount( 3600 );
				$mpf->setIncludeLunchPunchTime( true );
				$mpf->setPayCode( $this->policy_ids['pay_code'][190] );
				break;
			case 120: //AutoDeduct 1hr
				$mpf->setName( 'AutoDeduct 1hr' );
				$mpf->setType( 10 );
				$mpf->setTriggerTime( ( 3600 * 6 ) );
				$mpf->setAmount( 3600 );
				$mpf->setIncludeLunchPunchTime( false );
				$mpf->setPayCode( $this->policy_ids['pay_code'][190] );
				break;
			case 130: //AutoDeduct 1hr at Active After Time
				$mpf->setName( 'AutoDeduct 1hr' );
				$mpf->setType( 10 );
				$mpf->setAllocationType( 100 ); //At Active After Time.
				$mpf->setTriggerTime( ( 3600 * 6 ) );
				$mpf->setAmount( 3600 );
				$mpf->setIncludeLunchPunchTime( false );
				$mpf->setPayCode( $this->policy_ids['pay_code'][190] );
				break;
		}

		if ( $mpf->isValid() ) {
			$insert_id = $mpf->Save();
			Debug::Text( 'Meal Policy ID: ' . $insert_id, __FILE__, __LINE__, __METHOD__, 10 );

			return $insert_id;
		}

		Debug::Text( 'Failed Creating Meal Policy!', __FILE__, __LINE__, __METHOD__, 10 );

		return false;
	}

	function createBreakPolicy( $company_id, $type ) {
		$bpf = new BreakPolicyFactory();
		$bpf->setCompany( $company_id );

		switch ( $type ) {
//			case 100: //Normal 15min break
//				$bpf->setName( 'Normal' );
//				$bpf->setType( 20 );
//				$bpf->setTriggerTime( (3600 * 6) );
//				$bpf->setAmount( 60 * 15 );
//				$bpf->setIncludeBreakPunchTime( FALSE );
//				$bpf->setIncludeMultipleBreaks( FALSE );
//				$bpf->setPayCode( $this->policy_ids['pay_code'][192] );
//				break;
//			case 110: //AutoAdd 15min
//				$bpf->setName( 'AutoAdd 15min' );
//				$bpf->setType( 15 );
//				$bpf->setTriggerTime( (3600 * 1) );
//				$bpf->setAmount( 60 * 15 );
//				$bpf->setIncludeBreakPunchTime( FALSE );
//				$bpf->setIncludeMultipleBreaks( FALSE );
//				$bpf->setPayCode( $this->policy_ids['pay_code'][192] );
//				break;
//			case 115: //AutoAdd 15min
//				$bpf->setName( 'AutoAdd 15min (Include Punch Time)' );
//				$bpf->setType( 15 );
//				$bpf->setTriggerTime( (3600 * 1) );
//				$bpf->setAmount( 60 * 15 );
//				$bpf->setIncludeBreakPunchTime( TRUE );
//				$bpf->setIncludeMultipleBreaks( FALSE );
//				$bpf->setPayCode( $this->policy_ids['pay_code'][192] );
//				break;

			case 120: //AutoDeduct 15min
				$bpf->setName( 'AutoDeduct 15min' );
				$bpf->setType( 10 );
				$bpf->setTriggerTime( ( 3600 * 6 ) );
				$bpf->setAmount( 15 * 60 );
				$bpf->setIncludeBreakPunchTime( false );
				$bpf->setIncludeMultipleBreaks( false );
				$bpf->setPayCode( $this->policy_ids['pay_code'][192] );
				break;
//			case 121: //AutoDeduct 15min
//				$bpf->setName( 'AutoDeduct 15min (b)' );
//				$bpf->setType( 10 );
//				$bpf->setTriggerTime( (3600 * 6) );
//				$bpf->setAmount( 15 * 60 );
//				$bpf->setIncludeBreakPunchTime( FALSE );
//				$bpf->setIncludeMultipleBreaks( FALSE );
//				$bpf->setPayCode( $this->policy_ids['pay_code'][192] );
//				break;
			case 130: //AutoDeduct 30min
				$bpf->setName( 'AutoDeduct 30min' );
				$bpf->setType( 10 );
				$bpf->setTriggerTime( ( 3600 * 6 ) );
				$bpf->setAmount( 30 * 60 );
				$bpf->setIncludeBreakPunchTime( false );
				$bpf->setIncludeMultipleBreaks( false );
				$bpf->setPayCode( $this->policy_ids['pay_code'][192] );
				break;

			case 150: //AutoAdd 15min
				$bpf->setName( 'AutoAdd 15min (Include Both)' );
				$bpf->setType( 15 );
				$bpf->setTriggerTime( ( 3600 * 1 ) );
				$bpf->setAmount( 60 * 15 );
				$bpf->setIncludeBreakPunchTime( true );
				$bpf->setIncludeMultipleBreaks( true );
				$bpf->setPayCode( $this->policy_ids['pay_code'][192] );
				break;
			case 152: //AutoAdd 30min
				$bpf->setName( 'AutoAdd 15min (Include Both) [2]' );
				$bpf->setType( 15 );
				$bpf->setTriggerTime( ( 3600 * 3 ) );
				$bpf->setAmount( 60 * 30 );
				$bpf->setIncludeBreakPunchTime( true );
				$bpf->setIncludeMultipleBreaks( true );
				$bpf->setPayCode( $this->policy_ids['pay_code'][192] );
				break;
//			case 154: //AutoAdd 15min
//				$bpf->setName( 'AutoAdd 15min (Include Both) [3]' );
//				$bpf->setType( 15 );
//				$bpf->setTriggerTime( (3600 * 5) );
//				$bpf->setAmount( 60 * 15 );
//				$bpf->setIncludeBreakPunchTime( TRUE );
//				$bpf->setIncludeMultipleBreaks( TRUE );
//				$bpf->setPayCode( $this->policy_ids['pay_code'][192] );
//				break;
//			case 156: //AutoAdd 15min
//				$bpf->setName( 'AutoAdd 15min (Include Both) [4]' );
//				$bpf->setType( 15 );
//				$bpf->setTriggerTime( (3600 * 10) );
//				$bpf->setAmount( 60 * 15 );
//				$bpf->setIncludeBreakPunchTime( TRUE );
//				$bpf->setIncludeMultipleBreaks( TRUE );
//				$bpf->setPayCode( $this->policy_ids['pay_code'][192] );
//				break;
		}

		if ( $bpf->isValid() ) {
			$insert_id = $bpf->Save();
			Debug::Text( 'Break Policy ID: ' . $insert_id, __FILE__, __LINE__, __METHOD__, 10 );

			return $insert_id;
		}

		Debug::Text( 'Failed Creating Break Policy!', __FILE__, __LINE__, __METHOD__, 10 );

		return false;
	}

	function getCurrentAccrualBalance( $user_id, $accrual_policy_account_id = null ) {
		if ( $user_id == '' ) {
			return false;
		}

		if ( $accrual_policy_account_id == '' ) {
			$accrual_policy_account_id = $this->getId();
		}

		//Check min/max times of accrual policy.
		$ablf = TTnew( 'AccrualBalanceListFactory' ); /** @var AccrualBalanceListFactory $ablf */
		$ablf->getByUserIdAndAccrualPolicyAccount( $user_id, $accrual_policy_account_id );
		if ( $ablf->getRecordCount() > 0 ) {
			$accrual_balance = $ablf->getCurrent()->getBalance();
		} else {
			$accrual_balance = 0;
		}

		Debug::Text( '&nbsp;&nbsp; Current Accrual Balance: ' . $accrual_balance, __FILE__, __LINE__, __METHOD__, 10 );

		return $accrual_balance;
	}

	function getUserDateTotalArray( $start_date, $end_date ) {
		$udtlf = new UserDateTotalListFactory();

		$date_totals = [];

		//Get only system totals.
		$udtlf->getByCompanyIDAndUserIdAndObjectTypeAndStartDateAndEndDate( $this->company_id, $this->user_id, [ 5, 20, 25, 30, 40, 100, 110 ], $start_date, $end_date );
		if ( $udtlf->getRecordCount() > 0 ) {
			foreach ( $udtlf as $udt_obj ) {
				Debug::Text( 'Date: ' . TTDate::getDate( 'DATE+TIME', $udt_obj->getDateStamp() ) . ' Total Records: ' . $udtlf->getRecordCount(), __FILE__, __LINE__, __METHOD__, 10 );

				$date_totals[$udt_obj->getDateStamp()][] = [
					//'date_stamp' => $udt_obj->getColumn('user_date_stamp'),
					'date_stamp'    => $udt_obj->getDateStamp(),
					'id'            => $udt_obj->getId(),

					//Keep legacy status_id/type_id for now, so we don't have to change as many unit tests.
					'status_id'     => $udt_obj->getStatus(),
					'type_id'       => $udt_obj->getType(),
					'src_object_id' => $udt_obj->getSourceObject(),

					'object_type_id' => $udt_obj->getObjectType(),
					'pay_code_id'    => $udt_obj->getPayCode(),

					'branch_id'     => TTUUID::castUUID( $udt_obj->getBranch() ),
					'department_id' => $udt_obj->getDepartment(),
					'punch_tag_id'  => $udt_obj->getPunchTag(),
					'total_time'    => $udt_obj->getTotalTime(),
					'name'          => $udt_obj->getName(),

					'start_time_stamp' => $udt_obj->getStartTimeStamp(),
					'end_time_stamp'   => $udt_obj->getEndTimeStamp(),

					//'start_time_stamp_display' => date('r', $udt_obj->getStartTimeStamp() ),
					//'end_time_stamp_display' => date('r', $udt_obj->getEndTimeStamp() ),

					'quantity'     => $udt_obj->getQuantity(),
					'bad_quantity' => $udt_obj->getBadQuantity(),

					'hourly_rate'             => $udt_obj->getHourlyRate(),
					'hourly_rate_with_burden' => $udt_obj->getHourlyRateWithBurden(),
					//Override only shows for SYSTEM override columns...
					//Need to check Worked overrides too.
					'tmp_override'            => $udt_obj->getOverride(),
				];
			}
		}

		return $date_totals;
	}

	function createPayCode( $company_id, $type, $pay_formula_policy_id = 0 ) {
		$pcf = TTnew( 'PayCodeFactory' ); /** @var PayCodeFactory $pcf */
		$pcf->setCompany( $company_id );

		switch ( $type ) {
			case 100:
				$pcf->setName( 'Daily (>8hrs)' );
				//$pcf->setRate( '1.5' );
				break;
			case 110:
				$pcf->setName( 'Daily (>9hrs)' );
				//$pcf->setRate( '2.0' );
				break;
			case 120:
				$pcf->setName( 'Daily (>10hrs)' );
				//$pcf->setRate( '2.5' );
				break;
			case 190:
				$pcf->setName( 'Lunch' );
				//$pcf->setRate( '2.5' );
				break;
			case 200:
				$pcf->setName( 'Weekly (>47hrs)' );
				//$pcf->setRate( '1.5' );
				break;
			case 210:
				$pcf->setName( 'Weekly (>59hrs)' );
				//$pcf->setRate( '2.0' );
				break;
			case 220:
				$pcf->setName( 'Weekly (>71hrs)' );
				//$pcf->setRate( '2.5' );
				break;
			case 230:
				$pcf->setName( 'Weekly (>31hrs)' );
				//$pcf->setRate( '1.5' );
				break;
			case 240:
				$pcf->setName( 'Weekly (>39hrs)' );
				//$pcf->setRate( '2.0' );
				break;
			case 250:
				$pcf->setName( 'Weekly (>47hrs)' );
				//$pcf->setRate( '2.5' );
				break;
			case 300:
				$pcf->setName( 'BiWeekly (>80hrs)' );
				//$pcf->setRate( '1.5' );
				break;
			case 310:
				$pcf->setName( 'BiWeekly (>84hrs)' );
				//$pcf->setRate( '2.0' );
				break;
			case 320:
				$pcf->setName( 'BiWeekly (>86hrs)' );
				//$pcf->setRate( '2.5' );
				break;

			case 350:
				$pcf->setName( 'Every 4 Weeks' );
				//$pcf->setRate( '2.5' );
				break;

			case 500:
				$pcf->setName( 'Holiday' );
				//$pcf->setRate( '1.5' );
				break;
			case 510:
				$pcf->setName( 'Holiday' );
				//$pcf->setRate( '4.0' ); //This should have the highest rate as it always takes precedance.
				break;
		}

		$pcf->setCode( md5( $pcf->getName() ) );
		$pcf->setType( 10 ); //Paid
		//$pcf->setAccrualPolicyID( $accrual_policy_id );
		$pcf->setPayFormulaPolicy( $pay_formula_policy_id );
		$pcf->setPayStubEntryAccountID( CompanyDeductionFactory::getPayStubEntryAccountByCompanyIDAndTypeAndFuzzyName( $company_id, 10, 'Over Time 1' ) );
		//$pcf->setAccrualRate( 1.0 );

		if ( $pcf->isValid() ) {
			$insert_id = $pcf->Save();
			Debug::Text( 'Pay Code ID: ' . $insert_id, __FILE__, __LINE__, __METHOD__, 10 );

			return $insert_id;
		}

		Debug::Text( 'Failed Creating Pay Code!', __FILE__, __LINE__, __METHOD__, 10 );

		return false;
	}

	function createRegularTimePolicy( $company_id, $type, $contributing_shift_policy_id = 0, $pay_code_id = 0 ) {
		$rtpf = TTnew( 'RegularTimePolicyFactory' ); /** @var RegularTimePolicyFactory $rtpf */
		$rtpf->setId( $rtpf->getNextInsertId() ); //Make sure we can define the differential criteria before calling isValid()
		$rtpf->setCompany( $company_id );

		switch ( $type ) {
			case 10:
				$rtpf->setName( 'Regular Time' );
				$rtpf->setContributingShiftPolicy( $contributing_shift_policy_id );
				$rtpf->setPayCode( $pay_code_id );
				$rtpf->setCalculationOrder( 9999 );
				break;
			case 20:
				$rtpf->setName( 'Regular Time (2)' );
				$rtpf->setContributingShiftPolicy( $contributing_shift_policy_id );
				$rtpf->setPayCode( $pay_code_id );
				$rtpf->setCalculationOrder( 9999 );
				break;

			case 1010:
				$rtpf->setName( 'Regular Time (B1)' );
				$rtpf->setContributingShiftPolicy( $contributing_shift_policy_id );
				$rtpf->setPayCode( $pay_code_id );
				$rtpf->setCalculationOrder( 1000 );

				$rtpf->setBranchSelectionType( 20 );
				$rtpf->setBranch( [ $this->branch_ids[0] ] );
				break;
			case 1020:
				$rtpf->setName( 'Regular Time (B2)' );
				$rtpf->setContributingShiftPolicy( $contributing_shift_policy_id );
				$rtpf->setPayCode( $pay_code_id );
				$rtpf->setCalculationOrder( 1001 );

				$rtpf->setBranchSelectionType( 20 );
				$rtpf->setBranch( [ $this->branch_ids[1] ] );
				break;
		}

		if ( $rtpf->isValid() ) {
			$insert_id = $rtpf->Save( true, true );
			Debug::Text( 'Regular Time Policy ID: ' . $insert_id, __FILE__, __LINE__, __METHOD__, 10 );

			return $insert_id;
		}

		Debug::Text( 'Failed Creating Regular Policy!', __FILE__, __LINE__, __METHOD__, 10 );

		return false;
	}

	function updatePayFormulaPolicy( $id, $accrual_policy_account_id = 0, $wage_source_contributing_shift_policy_id = 0, $time_source_contributing_shift_policy_id = 0 ) {
		$pfplf = TTnew( 'PayFormulaPolicyListFactory' ); /** @var PayFormulaPolicyListFactory $pfplf */
		$pfplf->getById( $id );
		if ( $pfplf->getRecordCount() == 1 ) {
			$pfpf = $pfplf->getCurrent();

			$pfpf->setWageSourceContributingShiftPolicy( $wage_source_contributing_shift_policy_id );
			$pfpf->setTimeSourceContributingShiftPolicy( $time_source_contributing_shift_policy_id );
			$pfpf->setAccrualPolicyAccount( $accrual_policy_account_id );
			if ( $pfpf->isValid() ) {
				$pfpf->Save();
				Debug::Text( 'Updating Pay Formula Policy! ID: ' . $id, __FILE__, __LINE__, __METHOD__, 10 );

				return true;
			}
		}

		Debug::Text( 'Failed Updating Pay Formula Policy!', __FILE__, __LINE__, __METHOD__, 10 );

		return false;
	}

	function createPayFormulaPolicy( $company_id, $type, $accrual_policy_account_id = 0, $wage_source_contributing_shift_policy_id = 0, $time_source_contributing_shift_policy_id = 0 ) {
		$pfpf = TTnew( 'PayFormulaPolicyFactory' ); /** @var PayFormulaPolicyFactory $pfpf */
		$pfpf->setCompany( $company_id );

		switch ( $type ) {
			case 10:
				$pfpf->setName( 'None ($0)' );
				$pfpf->setPayType( 10 ); //Pay Multiplied By Factor
				$pfpf->setRate( 0 );
				$pfpf->setAccrualPolicyAccount( $accrual_policy_account_id );
				$pfpf->setAccrualRate( 0 );
				$pfpf->setAccrualBalanceThreshold( 0 ); //Don't use default lower threshold of 0.
				break;
			case 100:
				$pfpf->setName( 'Regular' );
				$pfpf->setPayType( 10 ); //Pay Multiplied By Factor
				$pfpf->setRate( 1.0 );
				$pfpf->setAccrualPolicyAccount( $accrual_policy_account_id );
				$pfpf->setAccrualRate( 1.0 );
				$pfpf->setAccrualBalanceThreshold( (86400 * 999) ); //Don't use default lower threshold of 0.
				break;
			case 200:
				$pfpf->setName( 'OverTime (1.5x)' );
				$pfpf->setPayType( 10 ); //Pay Multiplied By Factor
				$pfpf->setRate( 1.5 );
				$pfpf->setAccrualPolicyAccount( $accrual_policy_account_id );
				$pfpf->setAccrualRate( 1.0 );
				$pfpf->setAccrualBalanceThreshold( (86400 * 999) ); //Don't use default lower threshold of 0.
				break;
			case 210:
				$pfpf->setName( 'OverTime (2.0x)' );
				$pfpf->setPayType( 10 ); //Pay Multiplied By Factor
				$pfpf->setRate( 2.0 );
				$pfpf->setAccrualPolicyAccount( $accrual_policy_account_id );
				$pfpf->setAccrualRate( 1.0 );
				$pfpf->setAccrualBalanceThreshold( (86400 * 999) ); //Don't use default lower threshold of 0.
				break;
			case 220:
				$pfpf->setName( 'OverTime (2.5x)' );
				$pfpf->setPayType( 10 ); //Pay Multiplied By Factor
				$pfpf->setRate( 2.5 );
				$pfpf->setAccrualPolicyAccount( $accrual_policy_account_id );
				$pfpf->setAccrualRate( 1.0 );
				$pfpf->setAccrualBalanceThreshold( (86400 * 999) ); //Don't use default lower threshold of 0.
				break;
			case 510:
				$pfpf->setName( 'OverTime (4.0x)' );
				$pfpf->setPayType( 10 ); //Pay Multiplied By Factor
				$pfpf->setRate( 4.0 );
				$pfpf->setAccrualPolicyAccount( $accrual_policy_account_id );
				$pfpf->setAccrualRate( 1.0 );
				$pfpf->setAccrualBalanceThreshold( (86400 * 999) ); //Don't use default lower threshold of 0.
				break;
			case 910:
				$pfpf->setName( 'Bank' );
				$pfpf->setPayType( 10 ); //Pay Multiplied By Factor
				$pfpf->setRate( 1.0 );
				$pfpf->setAccrualPolicyAccount( $accrual_policy_account_id );
				$pfpf->setAccrualRate( -1.0 );
				$pfpf->setAccrualBalanceThreshold( (86400 * -999) ); //Don't use default lower threshold of 0.
				break;
			case 1101:
				$pfpf->setName( 'Regular (Alt Wage #1)' );
				$pfpf->setPayType( 10 ); //Pay Multiplied By Factor
				$pfpf->setRate( 1.0 );
				$pfpf->setWageGroup( $this->user_wage_groups[0] );
				$pfpf->setAccrualPolicyAccount( $accrual_policy_account_id );
				$pfpf->setAccrualRate( 1.0 );
				$pfpf->setAccrualBalanceThreshold( (86400 * 999) ); //Don't use default lower threshold of 0.
				break;
			case 1102:
				$pfpf->setName( 'Regular (Alt Wage #2)' );
				$pfpf->setPayType( 10 ); //Pay Multiplied By Factor
				$pfpf->setRate( 1.0 );
				$pfpf->setWageGroup( $this->user_wage_groups[1] );
				$pfpf->setAccrualPolicyAccount( $accrual_policy_account_id );
				$pfpf->setAccrualRate( 1.0 );
				$pfpf->setAccrualBalanceThreshold( (86400 * 999) ); //Don't use default lower threshold of 0.
				break;

			case 1200: //Overtime averaging.
				$pfpf->setName( 'OverTime Avg (1.5x)' );
				$pfpf->setPayType( 10 ); //Pay Multiplied By Factor
				$pfpf->setWageSourceType( 30 ); //Average of contributing pay codes.
				$pfpf->setWageSourceContributingShiftPolicy( $wage_source_contributing_shift_policy_id );
				$pfpf->setTimeSourceContributingShiftPolicy( $time_source_contributing_shift_policy_id );
				$pfpf->setRate( 1.5 );
				$pfpf->setAccrualPolicyAccount( $accrual_policy_account_id );
				$pfpf->setAccrualRate( 1.0 );
				$pfpf->setAccrualBalanceThreshold( (86400 * 999) ); //Don't use default lower threshold of 0.
				break;
			case 1210: //Overtime averaging.
				$pfpf->setName( 'OverTime Avg (2.0x)' );
				$pfpf->setPayType( 10 ); //Pay Multiplied By Factor
				$pfpf->setWageSourceType( 30 ); //Average of contributing pay codes.
				$pfpf->setWageSourceContributingShiftPolicy( $wage_source_contributing_shift_policy_id );
				$pfpf->setTimeSourceContributingShiftPolicy( $time_source_contributing_shift_policy_id );
				$pfpf->setRate( 2.0 );
				$pfpf->setAccrualPolicyAccount( $accrual_policy_account_id );
				$pfpf->setAccrualRate( 1.0 );
				$pfpf->setAccrualBalanceThreshold( (86400 * 999) ); //Don't use default lower threshold of 0.
				break;
			case 1220: //Overtime averaging.
				$pfpf->setName( 'OverTime Avg (2.5x)' );
				$pfpf->setPayType( 10 ); //Pay Multiplied By Factor
				$pfpf->setWageSourceType( 30 ); //Average of contributing pay codes.
				$pfpf->setWageSourceContributingShiftPolicy( $wage_source_contributing_shift_policy_id );
				$pfpf->setTimeSourceContributingShiftPolicy( $time_source_contributing_shift_policy_id );
				$pfpf->setRate( 2.5 );
				$pfpf->setAccrualPolicyAccount( $accrual_policy_account_id );
				$pfpf->setAccrualRate( 1.0 );
				$pfpf->setAccrualBalanceThreshold( (86400 * 999) ); //Don't use default lower threshold of 0.
				break;
			case 1300: //Daily Average Rate
				$pfpf->setName( 'Daily Avg' );
				$pfpf->setPayType( 70 ); //Daily Average
				$pfpf->setWageSourceContributingShiftPolicy( $wage_source_contributing_shift_policy_id );
				$pfpf->setTimeSourceContributingShiftPolicy( $time_source_contributing_shift_policy_id );
				//$pfpf->setRate( 0 );
				$pfpf->setAverageDays( 5 );
				$pfpf->setAccrualPolicyAccount( $accrual_policy_account_id );
				$pfpf->setAccrualRate( 1.0 );
				$pfpf->setAccrualBalanceThreshold( (86400 * 999) ); //Don't use default lower threshold of 0.
				break;
		}

		if ( $pfpf->isValid() ) {
			$insert_id = $pfpf->Save();
			Debug::Text( 'Pay Formula Policy ID: ' . $insert_id, __FILE__, __LINE__, __METHOD__, 10 );

			return $insert_id;
		}

		Debug::Text( 'Failed Creating Pay Formula Policy!', __FILE__, __LINE__, __METHOD__, 10 );

		return false;
	}

	function createOverTimePolicy( $company_id, $type, $contributing_shift_policy_id = 0, $pay_code_id = 0, $trigger_time_adjust_contributing_shift_policy_id = 0 ) {
		$otpf = new OverTimePolicyFactory();
		$otpf->setId( $otpf->getNextInsertId() ); //Make sure we can define the differential criteria before calling isValid()
		$otpf->setCompany( $company_id );

		switch ( $type ) {
			//
			//Changing the OT rates will make a big difference is how these tests are calculated.
			//
			case 10:
				$otpf->setName( 'Daily (>0hrs)' );
				$otpf->setType( 10 );
				$otpf->setTriggerTime( ( 3600 * 0 ) );
				break;
			case 90:
				$otpf->setName( 'Daily (>7hrs)' );
				$otpf->setType( 10 );
				$otpf->setTriggerTime( ( 3600 * 7 ) );
				break;
			case 100:
				$otpf->setName( 'Daily (>8hrs)' );
				$otpf->setType( 10 );
				$otpf->setTriggerTime( ( 3600 * 8 ) );
				break;
			case 110:
				$otpf->setName( 'Daily (>9hrs)' );
				$otpf->setType( 10 );
				$otpf->setTriggerTime( ( 3600 * 9 ) );
				break;
			case 120:
				$otpf->setName( 'Daily (>10hrs)' );
				$otpf->setType( 10 );
				$otpf->setTriggerTime( ( 3600 * 10 ) );
				break;
			case 200:
				$otpf->setName( 'Weekly (>47hrs)' );
				$otpf->setType( 20 );
				$otpf->setTriggerTime( ( 3600 * 47 ) );
				break;
			case 210:
				$otpf->setName( 'Weekly (>59hrs)' );
				$otpf->setType( 20 );
				$otpf->setTriggerTime( ( 3600 * 59 ) );
				break;
			case 220:
				$otpf->setName( 'Weekly (>71hrs)' );
				$otpf->setType( 20 );
				$otpf->setTriggerTime( ( 3600 * 71 ) );
				break;
			case 230:
				$otpf->setName( 'Weekly (>31hrs)' );
				$otpf->setType( 20 );
				$otpf->setTriggerTime( ( 3600 * 31 ) );
				break;
			case 240:
				$otpf->setName( 'Weekly (>39hrs)' );
				$otpf->setType( 20 );
				$otpf->setTriggerTime( ( 3600 * 39 ) );
				break;
			case 242:
				$otpf->setName( 'Weekly (>40hrs) [B]' );
				$otpf->setType( 20 );
				$otpf->setTriggerTime( ( 3600 * 40 ) );
				break;
			case 250:
				$otpf->setName( 'Weekly (>47hrs) [B]' );
				$otpf->setType( 20 );
				$otpf->setTriggerTime( ( 3600 * 47 ) );
				break;
			case 300:
				$otpf->setName( 'BiWeekly (>80hrs)' );
				$otpf->setType( 30 );
				$otpf->setTriggerTime( ( 3600 * 80 ) );
				break;
			case 310:
				$otpf->setName( 'BiWeekly (>84hrs)' );
				$otpf->setType( 30 );
				$otpf->setTriggerTime( ( 3600 * 84 ) );
				break;
			case 320:
				$otpf->setName( 'BiWeekly (>86hrs)' );
				$otpf->setType( 30 );
				$otpf->setTriggerTime( ( 3600 * 86 ) );
				break;
			case 500:
				$otpf->setName( 'Holiday' );
				$otpf->setType( 180 );
				$otpf->setTriggerTime( 0 );
				break;
			case 510:
				$otpf->setName( 'Holiday' );
				$otpf->setType( 180 );
				$otpf->setTriggerTime( 0 );
				//$otpf->setPayCode( $pay_code_id ); //Rate should be 4.0... This should have the highest rate as it always takes precedance.
				break;


			case 1000: //Differential
				$otpf->setName( 'Daily (>8hrs) [B1]' );
				$otpf->setType( 10 );
				$otpf->setTriggerTime( ( 3600 * 8 ) );

				$otpf->setBranchSelectionType( 20 );
				$otpf->setBranch( [ $this->branch_ids[0] ] );
				break;
			case 1001: //Differential
				$otpf->setName( 'Daily (>8hrs) [B2]' );
				$otpf->setType( 10 );
				$otpf->setTriggerTime( ( 3600 * 8 ) );

				$otpf->setBranchSelectionType( 20 );
				$otpf->setBranch( [ $this->branch_ids[1] ] );
				break;

			case 1230: //Differential
				$otpf->setName( 'Weekly (>31hrs) [B1]' );
				$otpf->setType( 20 );
				$otpf->setTriggerTime( ( 3600 * 31 ) );

				$otpf->setBranchSelectionType( 20 );
				$otpf->setBranch( [ $this->branch_ids[1] ] );
				break;
			case 1231: //Differential
				$otpf->setName( 'Weekly (>31hrs) [B2]' );
				$otpf->setType( 20 );
				$otpf->setTriggerTime( ( 3600 * 31 ) );

				$otpf->setBranchSelectionType( 20 );
				$otpf->setBranch( [ $this->branch_ids[0] ] );
				break;

			case 1240: //Differential
				$otpf->setName( 'Weekly (>39hrs) [B1]' );
				$otpf->setType( 20 );
				$otpf->setTriggerTime( ( 3600 * 39 ) );

				$otpf->setBranchSelectionType( 20 );
				$otpf->setBranch( [ $this->branch_ids[1] ] );
				break;
			case 1241: //Differential
				$otpf->setName( 'Weekly (>39hrs) [B2]' );
				$otpf->setType( 20 );
				$otpf->setTriggerTime( ( 3600 * 39 ) );

				$otpf->setBranchSelectionType( 20 );
				$otpf->setBranch( [ $this->branch_ids[0] ] );
				break;

			case 1250: //Differential
				$otpf->setName( 'Weekly (>40hrs) [B1]' );
				$otpf->setType( 20 );
				$otpf->setTriggerTime( ( 3600 * 40 ) );

				$otpf->setBranchSelectionType( 20 );
				$otpf->setBranch( [ $this->branch_ids[0] ] );
				break;
			case 1251: //Differential
				$otpf->setName( 'Weekly (>40hrs) [B2]' );
				$otpf->setType( 20 );
				$otpf->setTriggerTime( ( 3600 * 40 ) );

				$otpf->setBranchSelectionType( 20 );
				$otpf->setBranch( [ $this->branch_ids[1] ] );
				break;

			case 1300: //Differential
				$otpf->setName( 'BiWeekly (>80hrs) [B2]' );
				$otpf->setType( 30 );
				$otpf->setTriggerTime( ( 3600 * 80 ) );

				$otpf->setBranchSelectionType( 20 );
				$otpf->setBranch( [ $this->branch_ids[0] ] );
				break;
			case 1310: //Differential
				$otpf->setName( 'BiWeekly (>84hrs) [B2]' );
				$otpf->setType( 30 );
				$otpf->setTriggerTime( ( 3600 * 84 ) );

				$otpf->setBranchSelectionType( 20 );
				$otpf->setBranch( [ $this->branch_ids[0] ] );
				break;
			case 1320: //Differential
				$otpf->setName( 'BiWeekly (>86hrs) [B2]' );
				$otpf->setType( 30 );
				$otpf->setTriggerTime( ( 3600 * 86 ) );

				$otpf->setBranchSelectionType( 20 );
				$otpf->setBranch( [ $this->branch_ids[0] ] );
				break;

			case 1900: //Differential - Used to test mid-shift differential at a higher rate (ie: 2.0x) that just applies to an hour or so. The lower rate should then apply thereafter still.
				$otpf->setName( 'OT Differential [B1]' );
				$otpf->setType( 10 );
				$otpf->setTriggerTime( ( 3600 * 0 ) );

				$otpf->setBranchSelectionType( 20 );
				$otpf->setBranch( [ $this->branch_ids[0] ] );
				break;

			case 2150:
				$otpf->setName( '2 Or More Days/Week Consecutively Worked' );
				$otpf->setType( 150 );
				$otpf->setTriggerTime( 0 );
				break;
			case 2155:
				$otpf->setName( '7 Or More Days/Week Consecutively Worked' );
				$otpf->setType( 155 );
				$otpf->setTriggerTime( 0 );
				break;

			case 2300:
				$otpf->setName( '2 Or More Days Consecutively Worked' );
				$otpf->setType( 300 );
				$otpf->setTriggerTime( 0 );
				break;
			case 2305:
				$otpf->setName( '7 Or More Days Consecutively Worked' );
				$otpf->setType( 305 );
				$otpf->setTriggerTime( 0 );
				break;

			case 2400:
				$otpf->setName( '2 Or More Days/Week Worked' );
				$otpf->setType( 400 );
				$otpf->setTriggerTime( 0 );
				break;
			case 2404:
				$otpf->setName( '6 Or More Days/Week Worked' ); //7 or more doesn't really make much sense, since they are all consecutive anwyays.
				$otpf->setType( 404 );
				$otpf->setTriggerTime( 0 );
				break;

			case 5504:
				$otpf->setName( 'Every 4 Weeks' );
				$otpf->setType( 504 );
				$otpf->setTriggerTime( ( 234 * 3600 ) ); //5days/week at 12hr days.
				break;
		}

		$otpf->setPayCode( $pay_code_id );
		$otpf->setContributingShiftPolicy( $contributing_shift_policy_id );
		$otpf->setTriggerTimeAdjustContributingShiftPolicy( $trigger_time_adjust_contributing_shift_policy_id );

		if ( $otpf->isValid() ) {
			$insert_id = $otpf->Save( true, true );
			Debug::Text( 'Overtime Policy ID: ' . $insert_id, __FILE__, __LINE__, __METHOD__, 10 );

			return $insert_id;
		}

		Debug::Text( 'Failed Creating Overtime Policy!', __FILE__, __LINE__, __METHOD__, 10 );

		return false;
	}

	function createHolidayPolicy( $company_id, $type ) {
		$hpf = new HolidayPolicyFactory();
		$hpf->setCompany( $company_id );

		switch ( $type ) {
			case 10:
				$hpf->setName( 'Default' );
				$hpf->setType( 10 );

				$hpf->setDefaultScheduleStatus( 10 );
				$hpf->setMinimumEmployedDays( 0 );
				$hpf->setMinimumWorkedPeriodDays( 0 );
				$hpf->setMinimumWorkedDays( 0 );
				$hpf->setAverageTimeDays( 10 );
				$hpf->setAverageTimeWorkedDays( true );
				$hpf->setIncludeOverTime( true );
				$hpf->setIncludePaidAbsenceTime( true );
				$hpf->setForceOverTimePolicy( true );

				$hpf->setMinimumTime( 0 );
				$hpf->setMaximumTime( 0 );

				$hpf->setAbsencePolicyID( $this->policy_ids['absence'][10] );
				//$hpf->setRoundIntervalPolicyID( $data['round_interval_policy_id'] );

				break;
			case 20:
				$hpf->setName( 'Standard (8Hrs)' );
				$hpf->setType( 10 );

				$hpf->setDefaultScheduleStatus( 10 );
				$hpf->setMinimumEmployedDays( 0 );
				$hpf->setMinimumWorkedPeriodDays( 0 );
				$hpf->setMinimumWorkedDays( 0 );
				$hpf->setAverageTimeDays( 10 );
				$hpf->setAverageTimeWorkedDays( true );
				$hpf->setIncludeOverTime( true );
				$hpf->setIncludePaidAbsenceTime( true );
				$hpf->setForceOverTimePolicy( true );

				$hpf->setMinimumTime( ( 3600 * 8 ) );
				$hpf->setMaximumTime( ( 3600 * 8 ) );

				$hpf->setAbsencePolicyID( $this->policy_ids['absence'][10] );
				//$hpf->setRoundIntervalPolicyID( $data['round_interval_policy_id'] );

				break;
			case 100:
				$hpf->setName( 'Calendar Day Before/After' );
				$hpf->setType( 20 );

				$hpf->setDefaultScheduleStatus( 10 );
				$hpf->setMinimumEmployedDays( 0 );
				$hpf->setMinimumWorkedPeriodDays( 0 );
				$hpf->setMinimumWorkedDays( 0 );
				$hpf->setAverageTimeDays( 0 );
				$hpf->setAverageTimeWorkedDays( false );

				$hpf->setWorkedScheduledDays( 0 ); //0=Calendar Day
				$hpf->setMinimumWorkedDays( 1 ); //Before
				$hpf->setMinimumWorkedPeriodDays( 1 ); //Before

				$hpf->setWorkedAfterScheduledDays( 0 ); //0=Calendar Day
				$hpf->setMinimumWorkedAfterDays( 1 ); //After
				$hpf->setMinimumWorkedAfterPeriodDays( 1 ); //After

				$hpf->setForceOverTimePolicy( true );

				$hpf->setMinimumTime( ( 3600 * 8 ) );
				$hpf->setMaximumTime( ( 3600 * 8 ) );

				$hpf->setAbsencePolicyID( $this->policy_ids['absence'][10] );
				$hpf->setEligibleContributingShiftPolicy( $this->policy_ids['contributing_shift_policy'][10] );

				break;
			case 200:
				$hpf->setName( 'Scheduled Day Before/After' );
				$hpf->setType( 20 );

				$hpf->setDefaultScheduleStatus( 10 );
				$hpf->setMinimumEmployedDays( 0 );
				$hpf->setMinimumWorkedPeriodDays( 0 );
				$hpf->setMinimumWorkedDays( 0 );
				$hpf->setAverageTimeDays( 0 );
				$hpf->setAverageTimeWorkedDays( false );

				$hpf->setWorkedScheduledDays( 1 ); //1=Scheduled Day
				$hpf->setMinimumWorkedDays( 1 ); //Before
				$hpf->setMinimumWorkedPeriodDays( 1 ); //Before

				$hpf->setWorkedAfterScheduledDays( 1 ); //1=Scheduled Day
				$hpf->setMinimumWorkedAfterDays( 1 ); //After
				$hpf->setMinimumWorkedAfterPeriodDays( 1 ); //After

				$hpf->setForceOverTimePolicy( true );

				$hpf->setMinimumTime( ( 3600 * 8 ) );
				$hpf->setMaximumTime( ( 3600 * 8 ) );

				$hpf->setAbsencePolicyID( $this->policy_ids['absence'][10] );
				$hpf->setEligibleContributingShiftPolicy( $this->policy_ids['contributing_shift_policy'][10] );

				break;
			case 300:
				$hpf->setName( 'Holiday Weekday Day Before/After' );
				$hpf->setType( 20 );

				$hpf->setDefaultScheduleStatus( 10 );
				$hpf->setMinimumEmployedDays( 0 );
				$hpf->setMinimumWorkedPeriodDays( 0 );
				$hpf->setMinimumWorkedDays( 0 );
				$hpf->setAverageTimeDays( 0 );
				$hpf->setAverageTimeWorkedDays( false );

				$hpf->setWorkedScheduledDays( 2 ); //2=Holiday Weekday
				$hpf->setMinimumWorkedDays( 1 ); //Before
				$hpf->setMinimumWorkedPeriodDays( 1 ); //Before

				$hpf->setWorkedAfterScheduledDays( 2 ); //2=Holiday Weekday
				$hpf->setMinimumWorkedAfterDays( 1 ); //After
				$hpf->setMinimumWorkedAfterPeriodDays( 1 ); //After

				$hpf->setForceOverTimePolicy( true );

				$hpf->setMinimumTime( ( 3600 * 8 ) );
				$hpf->setMaximumTime( ( 3600 * 8 ) );

				$hpf->setAbsencePolicyID( $this->policy_ids['absence'][10] );
				$hpf->setEligibleContributingShiftPolicy( $this->policy_ids['contributing_shift_policy'][10] );

				break;
			case 400:
				$hpf->setName( 'Must Work On Holiday' );
				$hpf->setType( 20 );

				$hpf->setDefaultScheduleStatus( 10 );
				$hpf->setMinimumEmployedDays( 0 );
				$hpf->setMinimumWorkedPeriodDays( 0 );
				$hpf->setMinimumWorkedDays( 0 );
				$hpf->setAverageTimeDays( 0 );
				$hpf->setAverageTimeWorkedDays( false );

				$hpf->setWorkedScheduledDays( 0 ); //0=Calendar Day
				$hpf->setMinimumWorkedDays( 0 ); //Before
				$hpf->setMinimumWorkedPeriodDays( 0 ); //Before

				$hpf->setWorkedAfterScheduledDays( 0 ); //0=Calendar Day
				$hpf->setMinimumWorkedAfterDays( 0 ); //After
				$hpf->setMinimumWorkedAfterPeriodDays( 0 ); //After

				$hpf->setShiftOnHolidayType( 10 ); //10=Must Always Work

				$hpf->setForceOverTimePolicy( true );

				$hpf->setMinimumTime( ( 3600 * 8 ) );
				$hpf->setMaximumTime( ( 3600 * 8 ) );

				$hpf->setAbsencePolicyID( $this->policy_ids['absence'][10] );
				$hpf->setEligibleContributingShiftPolicy( $this->policy_ids['contributing_shift_policy'][10] );

				break;
			case 420:
				$hpf->setName( 'Must Never Work' );
				$hpf->setType( 20 );

				$hpf->setDefaultScheduleStatus( 10 );
				$hpf->setMinimumEmployedDays( 0 );
				$hpf->setMinimumWorkedPeriodDays( 0 );
				$hpf->setMinimumWorkedDays( 0 );
				$hpf->setAverageTimeDays( 0 );
				$hpf->setAverageTimeWorkedDays( false );

				$hpf->setWorkedScheduledDays( 0 ); //0=Calendar Day
				$hpf->setMinimumWorkedDays( 0 ); //Before
				$hpf->setMinimumWorkedPeriodDays( 0 ); //Before

				$hpf->setWorkedAfterScheduledDays( 0 ); //0=Calendar Day
				$hpf->setMinimumWorkedAfterDays( 0 ); //After
				$hpf->setMinimumWorkedAfterPeriodDays( 0 ); //After

				$hpf->setShiftOnHolidayType( 20 ); //30=Must Never Work

				$hpf->setForceOverTimePolicy( true );

				$hpf->setMinimumTime( ( 3600 * 8 ) );
				$hpf->setMaximumTime( ( 3600 * 8 ) );

				$hpf->setAbsencePolicyID( $this->policy_ids['absence'][10] );
				$hpf->setEligibleContributingShiftPolicy( $this->policy_ids['contributing_shift_policy'][10] );

				break;
			case 430:
				$hpf->setName( 'Must Work Only If Schedule' );
				$hpf->setType( 20 );

				$hpf->setDefaultScheduleStatus( 10 );
				$hpf->setMinimumEmployedDays( 0 );
				$hpf->setMinimumWorkedPeriodDays( 0 );
				$hpf->setMinimumWorkedDays( 0 );
				$hpf->setAverageTimeDays( 0 );
				$hpf->setAverageTimeWorkedDays( false );

				$hpf->setWorkedScheduledDays( 0 ); //0=Calendar Day
				$hpf->setMinimumWorkedDays( 0 ); //Before
				$hpf->setMinimumWorkedPeriodDays( 0 ); //Before

				$hpf->setWorkedAfterScheduledDays( 0 ); //0=Calendar Day
				$hpf->setMinimumWorkedAfterDays( 0 ); //After
				$hpf->setMinimumWorkedAfterPeriodDays( 0 ); //After

				$hpf->setShiftOnHolidayType( 30 ); //30=Must Work Only If Scheduled

				$hpf->setForceOverTimePolicy( true );

				$hpf->setMinimumTime( ( 3600 * 8 ) );
				$hpf->setMaximumTime( ( 3600 * 8 ) );

				$hpf->setAbsencePolicyID( $this->policy_ids['absence'][10] );
				$hpf->setEligibleContributingShiftPolicy( $this->policy_ids['contributing_shift_policy'][10] );

				break;
			case 440:
				$hpf->setName( 'Must Not Work Only If Scheduled Absent' );
				$hpf->setType( 20 );

				$hpf->setDefaultScheduleStatus( 10 );
				$hpf->setMinimumEmployedDays( 0 );
				$hpf->setMinimumWorkedPeriodDays( 0 );
				$hpf->setMinimumWorkedDays( 0 );
				$hpf->setAverageTimeDays( 0 );
				$hpf->setAverageTimeWorkedDays( false );

				$hpf->setWorkedScheduledDays( 0 ); //0=Calendar Day
				$hpf->setMinimumWorkedDays( 0 ); //Before
				$hpf->setMinimumWorkedPeriodDays( 0 ); //Before

				$hpf->setWorkedAfterScheduledDays( 0 ); //0=Calendar Day
				$hpf->setMinimumWorkedAfterDays( 0 ); //After
				$hpf->setMinimumWorkedAfterPeriodDays( 0 ); //After

				$hpf->setShiftOnHolidayType( 40 ); //40=Must Not Work (Only if Scheduled Absent)

				$hpf->setForceOverTimePolicy( true );

				$hpf->setMinimumTime( ( 3600 * 8 ) );
				$hpf->setMaximumTime( ( 3600 * 8 ) );

				$hpf->setAbsencePolicyID( $this->policy_ids['absence'][10] );
				$hpf->setEligibleContributingShiftPolicy( $this->policy_ids['contributing_shift_policy'][10] );

				break;
			case 472:
				$hpf->setName( 'Must Not Work (Must be Scheduled Absent)' );
				$hpf->setType( 20 );

				$hpf->setDefaultScheduleStatus( 10 );
				$hpf->setMinimumEmployedDays( 0 );
				$hpf->setMinimumWorkedPeriodDays( 0 );
				$hpf->setMinimumWorkedDays( 0 );
				$hpf->setAverageTimeDays( 0 );
				$hpf->setAverageTimeWorkedDays( false );

				$hpf->setWorkedScheduledDays( 0 ); //0=Calendar Day
				$hpf->setMinimumWorkedDays( 0 ); //Before
				$hpf->setMinimumWorkedPeriodDays( 0 ); //Before

				$hpf->setWorkedAfterScheduledDays( 0 ); //0=Calendar Day
				$hpf->setMinimumWorkedAfterDays( 0 ); //After
				$hpf->setMinimumWorkedAfterPeriodDays( 0 ); //After

				$hpf->setShiftOnHolidayType( 72 ); //72=Must Not Work (Must be Scheduled Absent)

				$hpf->setForceOverTimePolicy( true );

				$hpf->setMinimumTime( ( 3600 * 8 ) );
				$hpf->setMaximumTime( ( 3600 * 8 ) );

				$hpf->setAbsencePolicyID( $this->policy_ids['absence'][10] );
				$hpf->setEligibleContributingShiftPolicy( $this->policy_ids['contributing_shift_policy'][10] );

				break;
			case 475:
				$hpf->setName( 'Must Not Work (Must not be Scheduled)' );
				$hpf->setType( 20 );

				$hpf->setDefaultScheduleStatus( 10 );
				$hpf->setMinimumEmployedDays( 0 );
				$hpf->setMinimumWorkedPeriodDays( 0 );
				$hpf->setMinimumWorkedDays( 0 );
				$hpf->setAverageTimeDays( 0 );
				$hpf->setAverageTimeWorkedDays( false );

				$hpf->setWorkedScheduledDays( 0 ); //0=Calendar Day
				$hpf->setMinimumWorkedDays( 0 ); //Before
				$hpf->setMinimumWorkedPeriodDays( 0 ); //Before

				$hpf->setWorkedAfterScheduledDays( 0 ); //0=Calendar Day
				$hpf->setMinimumWorkedAfterDays( 0 ); //After
				$hpf->setMinimumWorkedAfterPeriodDays( 0 ); //After

				$hpf->setShiftOnHolidayType( 75 ); //75=Must Not Work (Must not be Scheduled)

				$hpf->setForceOverTimePolicy( true );

				$hpf->setMinimumTime( ( 3600 * 8 ) );
				$hpf->setMaximumTime( ( 3600 * 8 ) );

				$hpf->setAbsencePolicyID( $this->policy_ids['absence'][10] );
				$hpf->setEligibleContributingShiftPolicy( $this->policy_ids['contributing_shift_policy'][10] );

				break;
		}

		$hpf->setHolidayDisplayDays( 371 );

		if ( $hpf->isValid() ) {
			$insert_id = $hpf->Save();
			Debug::Text( 'Holiday Policy ID: ' . $insert_id, __FILE__, __LINE__, __METHOD__, 10 );

			return $insert_id;
		}

		Debug::Text( 'Failed Creating Holiday Policy!', __FILE__, __LINE__, __METHOD__, 10 );

		return false;
	}

	function createHoliday( $company_id, $type, $date, $holiday_policy_id ) {
		$hf = new HolidayFactory();

		switch ( $type ) {
			case 10:
				$hf->setHolidayPolicyId( $holiday_policy_id );
				$hf->setDateStamp( $date );
				$hf->setName( 'Test1' );

				break;
			case 20:
				$hf->setHolidayPolicyId( $holiday_policy_id );
				$hf->setDateStamp( $date );
				$hf->setName( 'Test2' );

				break;
		}

		if ( $hf->isValid() ) {
			$insert_id = $hf->Save();
			Debug::Text( 'Holiday ID: ' . $insert_id, __FILE__, __LINE__, __METHOD__, 10 );

			return $insert_id;
		}

		Debug::Text( 'Failed Creating Holiday!', __FILE__, __LINE__, __METHOD__, 10 );

		return false;
	}

	/*
	 Tests:
		No Overtime
		Daily OverTime (3 levels)
		Weekly OverTime (3 Levels)
		BiWeekly OverTime (3 Levels)
		Combination Daily+Weekly (3 Levels)
		Combination Daily+Weekly+Holiday (3 Levels)
	*/

	/**
	 * @group OvertimePolicy_testNoOverTimePolicyA
	 */
	function testNoOverTimePolicyA() {
		global $dd;

		$policy_ids['pay_formula_policy'][] = $this->createPayFormulaPolicy( $this->company_id, 200 );      //OT1.5
		$policy_ids['pay_formula_policy'][] = $this->createPayFormulaPolicy( $this->company_id, 210 );      //OT2.0
		$policy_ids['pay_formula_policy'][] = $this->createPayFormulaPolicy( $this->company_id, 220 );      //OT2.5

		$policy_ids['pay_code'][] = $this->createPayCode( $this->company_id, 100, $policy_ids['pay_formula_policy'][0] );
		$policy_ids['pay_code'][] = $this->createPayCode( $this->company_id, 110, $policy_ids['pay_formula_policy'][1] );
		$policy_ids['pay_code'][] = $this->createPayCode( $this->company_id, 120, $policy_ids['pay_formula_policy'][2] );

		$policy_ids['overtime'][] = $this->createOverTimePolicy( $this->company_id, 100, $this->policy_ids['contributing_shift_policy'][12], $policy_ids['pay_code'][0] );
		$policy_ids['overtime'][] = $this->createOverTimePolicy( $this->company_id, 110, $this->policy_ids['contributing_shift_policy'][12], $policy_ids['pay_code'][1] );
		$policy_ids['overtime'][] = $this->createOverTimePolicy( $this->company_id, 120, $this->policy_ids['contributing_shift_policy'][12], $policy_ids['pay_code'][2] );

		//Create Policy Group
		$dd->createPolicyGroup( $this->company_id,
								null, //Meal
								null, //Exception
								null, //Holiday
								$policy_ids['overtime'], //OT
								null, //Premium
								null, //Round
								[ $this->user_id ], //Users
								null, //Break
								null, //Accrual
								null, //Expense
								null, //Absence
								[ $this->policy_ids['regular'][12] ] //Regular
		);

		$date_epoch = TTDate::getMiddleDayEpoch( TTDate::getBeginWeekEpoch( time() ) );
		$date_stamp = TTDate::getDate( 'DATE', $date_epoch );

		$dd->createPunchPair( $this->user_id,
							  strtotime( $date_stamp . ' 8:00AM' ),
							  strtotime( $date_stamp . ' 3:00PM' ),
							  [
									  'in_type_id'    => 10,
									  'out_type_id'   => 10,
									  'branch_id'     => 0,
									  'department_id' => 0,
									  'job_id'        => 0,
									  'job_item_id'   => 0,
									  'punch_tag_id'  => []
							  ],
							  true
		);

		$udt_arr = $this->getUserDateTotalArray( $date_epoch, $date_epoch );
		//print_r($udt_arr);

		//Total Time
		$this->assertEquals( 5, $udt_arr[$date_epoch][0]['object_type_id'] );                               //5=System Total
		$this->assertEquals( $udt_arr[$date_epoch][0]['pay_code_id'], TTUUID::getZeroID() );
		$this->assertEquals( $udt_arr[$date_epoch][0]['total_time'], ( 7 * 3600 ) );
		$this->assertEquals( 0, $udt_arr[$date_epoch][0]['hourly_rate'] );
		$this->assertEquals( 0, $udt_arr[$date_epoch][0]['hourly_rate_with_burden'] );
		//Regular Time
		$this->assertEquals( 20, $udt_arr[$date_epoch][1]['object_type_id'] );                              //Regular Time
		$this->assertEquals( $udt_arr[$date_epoch][1]['pay_code_id'], $this->policy_ids['pay_code'][100] ); //Regular Time
		$this->assertEquals( $udt_arr[$date_epoch][1]['total_time'], ( 7 * 3600 ) );
		$this->assertEquals( 21.50, $udt_arr[$date_epoch][1]['hourly_rate'] );
		$this->assertEquals( 24.4025, $udt_arr[$date_epoch][1]['hourly_rate_with_burden'] );

		//Make sure no other hours
		$this->assertCount( 2, $udt_arr[$date_epoch] );

		return true;
	}

	/**
	 * @group OvertimePolicy_testDailyOverTimePolicyA
	 */
	function testDailyOverTimePolicyA() {
		global $dd;

		$policy_ids['pay_formula_policy'][] = $this->createPayFormulaPolicy( $this->company_id, 200 );      //OT1.5
		$policy_ids['pay_formula_policy'][] = $this->createPayFormulaPolicy( $this->company_id, 210 );      //OT2.0
		$policy_ids['pay_formula_policy'][] = $this->createPayFormulaPolicy( $this->company_id, 220 );      //OT2.5

		$policy_ids['pay_code'][] = $this->createPayCode( $this->company_id, 100, $policy_ids['pay_formula_policy'][0] );
		$policy_ids['pay_code'][] = $this->createPayCode( $this->company_id, 110, $policy_ids['pay_formula_policy'][1] );
		$policy_ids['pay_code'][] = $this->createPayCode( $this->company_id, 120, $policy_ids['pay_formula_policy'][2] );

		$policy_ids['overtime'][] = $this->createOverTimePolicy( $this->company_id, 100, $this->policy_ids['contributing_shift_policy'][12], $policy_ids['pay_code'][0] );
		$policy_ids['overtime'][] = $this->createOverTimePolicy( $this->company_id, 110, $this->policy_ids['contributing_shift_policy'][12], $policy_ids['pay_code'][1] );
		$policy_ids['overtime'][] = $this->createOverTimePolicy( $this->company_id, 120, $this->policy_ids['contributing_shift_policy'][12], $policy_ids['pay_code'][2] );

		//Create Policy Group
		$dd->createPolicyGroup( $this->company_id,
								null, //Meal
								null, //Exception
								null, //Holiday
								$policy_ids['overtime'], //OT
								null, //Premium
								null, //Round
								[ $this->user_id ], //Users
								null, //Break
								null, //Accrual
								null, //Expense
								null, //Absence
								[ $this->policy_ids['regular'][12] ] //Regular
		);


		$date_epoch = TTDate::getMiddleDayEpoch( TTDate::getBeginWeekEpoch( time() ) );
		$date_stamp = TTDate::getDate( 'DATE', $date_epoch );

		$dd->createPunchPair( $this->user_id,
							  strtotime( $date_stamp . ' 8:00AM' ),
							  strtotime( $date_stamp . ' 8:00PM' ),
							  [
									  'in_type_id'    => 10,
									  'out_type_id'   => 10,
									  'branch_id'     => 0,
									  'department_id' => 0,
									  'job_id'        => 0,
									  'job_item_id'   => 0,
									  'punch_tag_id'  => []
							  ],
							  true
		);

		$udt_arr = $this->getUserDateTotalArray( $date_epoch, $date_epoch );
		//print_r($udt_arr);

		//Total Time
		$this->assertEquals( 5, $udt_arr[$date_epoch][0]['object_type_id'] );                               //5=System Total
		$this->assertEquals( $udt_arr[$date_epoch][0]['pay_code_id'], TTUUID::getZeroID() );
		$this->assertEquals( $udt_arr[$date_epoch][0]['total_time'], ( 12 * 3600 ) );
		$this->assertEquals( $udt_arr[$date_epoch][0]['start_time_stamp'], strtotime( $date_stamp . ' 8:00AM' ) );
		$this->assertEquals( $udt_arr[$date_epoch][0]['end_time_stamp'], strtotime( $date_stamp . ' 8:00PM' ) );
		$this->assertEquals( 0, $udt_arr[$date_epoch][0]['hourly_rate'] );
		$this->assertEquals( 0, $udt_arr[$date_epoch][0]['hourly_rate_with_burden'] );
		//Regular Time
		$this->assertEquals( 20, $udt_arr[$date_epoch][1]['object_type_id'] );                              //Regular Time
		$this->assertEquals( $udt_arr[$date_epoch][1]['pay_code_id'], $this->policy_ids['pay_code'][100] ); //Regular Time
		$this->assertEquals( $udt_arr[$date_epoch][1]['total_time'], ( 8 * 3600 ) );
		$this->assertEquals( $udt_arr[$date_epoch][1]['start_time_stamp'], strtotime( $date_stamp . ' 8:00AM' ) );
		$this->assertEquals( $udt_arr[$date_epoch][1]['end_time_stamp'], strtotime( $date_stamp . ' 4:00PM' ) );
		$this->assertEquals( $udt_arr[$date_epoch][1]['hourly_rate'], ( 1 * 21.50 ) );
		$this->assertEquals( $udt_arr[$date_epoch][1]['hourly_rate_with_burden'], ( 1 * 21.50 * 1.135 ) ); //13.5%
		//Overtime 1
		$this->assertEquals( 30, $udt_arr[$date_epoch][4]['object_type_id'] );                             //OverTime
		$this->assertEquals( $udt_arr[$date_epoch][4]['pay_code_id'], $policy_ids['pay_code'][0] );
		$this->assertEquals( $udt_arr[$date_epoch][4]['total_time'], ( 1 * 3600 ) );
		$this->assertEquals( $udt_arr[$date_epoch][4]['start_time_stamp'], strtotime( $date_stamp . ' 4:00PM' ) );
		$this->assertEquals( $udt_arr[$date_epoch][4]['end_time_stamp'], strtotime( $date_stamp . ' 5:00PM' ) );
		$this->assertEquals( $udt_arr[$date_epoch][4]['hourly_rate'], ( 1.5 * 21.50 ) );
		$this->assertEquals( Misc::MoneyRound( $udt_arr[$date_epoch][4]['hourly_rate_with_burden'] ), Misc::MoneyRound( ( 1.5 * 21.50 * 1.135 ) ) ); //13.5%
		//Overtime 2
		$this->assertEquals( 30, $udt_arr[$date_epoch][3]['object_type_id'] );                                                                                       //OverTime
		$this->assertEquals( $udt_arr[$date_epoch][3]['pay_code_id'], $policy_ids['pay_code'][1] );
		$this->assertEquals( $udt_arr[$date_epoch][3]['total_time'], ( 1 * 3600 ) );
		$this->assertEquals( $udt_arr[$date_epoch][3]['start_time_stamp'], strtotime( $date_stamp . ' 5:00PM' ) );
		$this->assertEquals( $udt_arr[$date_epoch][3]['end_time_stamp'], strtotime( $date_stamp . ' 6:00PM' ) );
		$this->assertEquals( $udt_arr[$date_epoch][3]['hourly_rate'], ( 2.0 * 21.50 ) );
		$this->assertEquals( $udt_arr[$date_epoch][3]['hourly_rate_with_burden'], ( 2.0 * 21.50 * 1.135 ) ); //13.5%
		//Overtime 3
		$this->assertEquals( 30, $udt_arr[$date_epoch][2]['object_type_id'] );                               //OverTime
		$this->assertEquals( $udt_arr[$date_epoch][2]['pay_code_id'], $policy_ids['pay_code'][2] );
		$this->assertEquals( $udt_arr[$date_epoch][2]['total_time'], ( 2 * 3600 ) );
		$this->assertEquals( $udt_arr[$date_epoch][2]['start_time_stamp'], strtotime( $date_stamp . ' 6:00PM' ) );
		$this->assertEquals( $udt_arr[$date_epoch][2]['end_time_stamp'], strtotime( $date_stamp . ' 8:00PM' ) );
		$this->assertEquals( $udt_arr[$date_epoch][2]['hourly_rate'], ( 2.5 * 21.50 ) );
		$this->assertEquals( Misc::MoneyRound( $udt_arr[$date_epoch][2]['hourly_rate_with_burden'] ), Misc::MoneyRound( ( 2.5 * 21.50 * 1.135 ) ) ); //13.5%

		//Make sure no other hours
		$this->assertCount( 5, $udt_arr[$date_epoch] );

		return true;
	}

	/**
	 * @group OvertimePolicy_testDailyOverTimePolicyB
	 */
	function testDailyOverTimePolicyB() {
		global $dd;

		$policy_ids['pay_formula_policy'][] = $this->createPayFormulaPolicy( $this->company_id, 200 );      //OT1.5
		$policy_ids['pay_formula_policy'][] = $this->createPayFormulaPolicy( $this->company_id, 210 );      //OT2.0
		$policy_ids['pay_formula_policy'][] = $this->createPayFormulaPolicy( $this->company_id, 220 );      //OT2.5

		$policy_ids['pay_code'][] = $this->createPayCode( $this->company_id, 100, $policy_ids['pay_formula_policy'][0] );
		$policy_ids['pay_code'][] = $this->createPayCode( $this->company_id, 110, $policy_ids['pay_formula_policy'][1] );
		$policy_ids['pay_code'][] = $this->createPayCode( $this->company_id, 120, $policy_ids['pay_formula_policy'][2] );

		$policy_ids['overtime'][] = $this->createOverTimePolicy( $this->company_id, 100, $this->policy_ids['contributing_shift_policy'][12], $policy_ids['pay_code'][0] );
		$policy_ids['overtime'][] = $this->createOverTimePolicy( $this->company_id, 110, $this->policy_ids['contributing_shift_policy'][12], $policy_ids['pay_code'][1] );
		$policy_ids['overtime'][] = $this->createOverTimePolicy( $this->company_id, 120, $this->policy_ids['contributing_shift_policy'][12], $policy_ids['pay_code'][2] );

		//Create Policy Group
		$dd->createPolicyGroup( $this->company_id,
								null, //Meal
								null, //Exception
								null, //Holiday
								$policy_ids['overtime'], //OT
								null, //Premium
								null, //Round
								[ $this->user_id ], //Users
								null, //Break
								null, //Accrual
								null, //Expense
								null, //Absence
								[ $this->policy_ids['regular'][12] ] //Regular
		);


		$date_epoch = TTDate::getMiddleDayEpoch( TTDate::getBeginWeekEpoch( time() ) );
		$date_stamp = TTDate::getDate( 'DATE', $date_epoch );

		$dd->createPunchPair( $this->user_id,
							  strtotime( $date_stamp . ' 8:00AM' ),
							  strtotime( $date_stamp . ' 12:00PM' ),
							  [
									  'in_type_id'    => 10,
									  'out_type_id'   => 10,
									  'branch_id'     => 0,
									  'department_id' => 0,
									  'job_id'        => 0,
									  'job_item_id'   => 0,
									  'punch_tag_id'  => []
							  ],
							  true
		);
		$dd->createPunchPair( $this->user_id,
							  strtotime( $date_stamp . ' 12:30PM' ),
							  strtotime( $date_stamp . ' 5:00PM' ),
							  [
									  'in_type_id'    => 10,
									  'out_type_id'   => 10,
									  'branch_id'     => 0,
									  'department_id' => 0,
									  'job_id'        => 0,
									  'job_item_id'   => 0,
									  'punch_tag_id'  => []
							  ],
							  true
		);

		$udt_arr = $this->getUserDateTotalArray( $date_epoch, $date_epoch );
		//print_r($udt_arr);

		//Total Time
		$this->assertEquals( 5, $udt_arr[$date_epoch][0]['object_type_id'] );                               //5=System Total
		$this->assertEquals( $udt_arr[$date_epoch][0]['pay_code_id'], TTUUID::getZeroID() );
		$this->assertEquals( $udt_arr[$date_epoch][0]['total_time'], ( 8.5 * 3600 ) );
		$this->assertEquals( $udt_arr[$date_epoch][0]['start_time_stamp'], strtotime( $date_stamp . ' 8:00AM' ) );
		$this->assertEquals( $udt_arr[$date_epoch][0]['end_time_stamp'], strtotime( $date_stamp . ' 5:00PM' ) );
		//Regular Time
		$this->assertEquals( 20, $udt_arr[$date_epoch][1]['object_type_id'] );                              //Regular Time
		$this->assertEquals( $udt_arr[$date_epoch][1]['pay_code_id'], $this->policy_ids['pay_code'][100] ); //Regular Time
		$this->assertEquals( $udt_arr[$date_epoch][1]['total_time'], ( 4 * 3600 ) );
		$this->assertEquals( $udt_arr[$date_epoch][1]['start_time_stamp'], strtotime( $date_stamp . ' 8:00AM' ) );
		$this->assertEquals( $udt_arr[$date_epoch][1]['end_time_stamp'], strtotime( $date_stamp . ' 12:00PM' ) );
		//Regular Time
		$this->assertEquals( 20, $udt_arr[$date_epoch][2]['object_type_id'] );                              //Regular Time
		$this->assertEquals( $udt_arr[$date_epoch][2]['pay_code_id'], $this->policy_ids['pay_code'][100] ); //Regular Time
		$this->assertEquals( $udt_arr[$date_epoch][2]['total_time'], ( 4 * 3600 ) );
		$this->assertEquals( $udt_arr[$date_epoch][2]['start_time_stamp'], strtotime( $date_stamp . ' 12:30PM' ) );
		$this->assertEquals( $udt_arr[$date_epoch][2]['end_time_stamp'], strtotime( $date_stamp . ' 4:30PM' ) );
		//Overtime 1
		$this->assertEquals( 30, $udt_arr[$date_epoch][3]['object_type_id'] );                              //OverTime
		$this->assertEquals( $udt_arr[$date_epoch][3]['pay_code_id'], $policy_ids['pay_code'][0] );
		$this->assertEquals( $udt_arr[$date_epoch][3]['total_time'], ( 0.5 * 3600 ) );
		$this->assertEquals( $udt_arr[$date_epoch][3]['start_time_stamp'], strtotime( $date_stamp . ' 4:30PM' ) );
		$this->assertEquals( $udt_arr[$date_epoch][3]['end_time_stamp'], strtotime( $date_stamp . ' 5:00PM' ) );

		//Make sure no other hours
		$this->assertCount( 4, $udt_arr[$date_epoch] );

		return true;
	}

	/**
	 * @group OvertimePolicy_testDailyOverTimePolicyC
	 */
	function testDailyOverTimePolicyC() {
		global $dd;

		//Test multiple breaks and a lunch that are fairly close to one another.
		//This should cause UDT records to have to adjust their end_time_stamp in reverse to test a specific bug.

		$policy_ids['pay_formula_policy'][] = $this->createPayFormulaPolicy( $this->company_id, 200 ); //OT1.5
		$policy_ids['pay_formula_policy'][] = $this->createPayFormulaPolicy( $this->company_id, 210 ); //OT2.0
		$policy_ids['pay_formula_policy'][] = $this->createPayFormulaPolicy( $this->company_id, 220 ); //OT2.5

		$policy_ids['pay_code'][] = $this->createPayCode( $this->company_id, 100, $policy_ids['pay_formula_policy'][0] );
		$policy_ids['pay_code'][] = $this->createPayCode( $this->company_id, 110, $policy_ids['pay_formula_policy'][1] );
		$policy_ids['pay_code'][] = $this->createPayCode( $this->company_id, 120, $policy_ids['pay_formula_policy'][2] );

		$policy_ids['overtime'][] = $this->createOverTimePolicy( $this->company_id, 100, $this->policy_ids['contributing_shift_policy'][10], $policy_ids['pay_code'][0] ); //Don't include Meal/Break as thats already in Regular Time.
		//$policy_ids['overtime'][] = $this->createOverTimePolicy( $this->company_id, 110, $this->policy_ids['contributing_shift_policy'][12], $policy_ids['pay_code'][1] );
		//$policy_ids['overtime'][] = $this->createOverTimePolicy( $this->company_id, 120, $this->policy_ids['contributing_shift_policy'][12], $policy_ids['pay_code'][2] );

		$policy_ids['break'][] = $this->createBreakPolicy( $this->company_id, 152 );                        //AutoAdd 30min

		//Create Policy Group
		$dd->createPolicyGroup( $this->company_id,
								null, //Meal
								null, //Exception
								null, //Holiday
								$policy_ids['overtime'], //OT
								null, //Premium
								null, //Round
								[ $this->user_id ], //Users
								$policy_ids['break'], //Break
								null, //Accrual
								null, //Expense
								null, //Absence
								[ $this->policy_ids['regular'][12] ] //Regular
		);


		$date_epoch = TTDate::getMiddleDayEpoch( TTDate::getBeginWeekEpoch( time() ) );
		$date_stamp = TTDate::getDate( 'DATE', $date_epoch );

		$dd->createPunchPair( $this->user_id,
							  strtotime( $date_stamp . ' 8:00AM' ),
							  strtotime( $date_stamp . ' 10:00AM' ),
							  [
									  'in_type_id'    => 10,
									  'out_type_id'   => 30,
									  'branch_id'     => 0,
									  'department_id' => 0,
									  'job_id'        => 0,
									  'job_item_id'   => 0,
									  'punch_tag_id'  => []
							  ],
							  true
		);

		$dd->createPunchPair( $this->user_id,
							  strtotime( $date_stamp . ' 10:15AM' ),
							  strtotime( $date_stamp . ' 12:00PM' ),
							  [
									  'in_type_id'    => 30,
									  'out_type_id'   => 20,
									  'branch_id'     => 0,
									  'department_id' => 0,
									  'job_id'        => 0,
									  'job_item_id'   => 0,
									  'punch_tag_id'  => []
							  ],
							  true
		);

		$dd->createPunchPair( $this->user_id,
							  strtotime( $date_stamp . ' 12:30PM' ),
							  strtotime( $date_stamp . ' 2:00PM' ),
							  [
									  'in_type_id'    => 20,
									  'out_type_id'   => 30,
									  'branch_id'     => 0,
									  'department_id' => 0,
									  'job_id'        => 0,
									  'job_item_id'   => 0,
									  'punch_tag_id'  => []
							  ],
							  true
		);

		$dd->createPunchPair( $this->user_id,
							  strtotime( $date_stamp . ' 2:15PM' ),
							  strtotime( $date_stamp . ' 6:00PM' ),
							  [
									  'in_type_id'    => 30,
									  'out_type_id'   => 10,
									  'branch_id'     => 0,
									  'department_id' => 0,
									  'job_id'        => 0,
									  'job_item_id'   => 0,
									  'punch_tag_id'  => []
							  ],
							  true
		);

		$udt_arr = $this->getUserDateTotalArray( $date_epoch, $date_epoch );
		//print_r($udt_arr);

		//Total Time -- This was compacted out with compactUserDateTotalDataBasedOnTimeStamps()
		$this->assertEquals( 5, $udt_arr[$date_epoch][0]['object_type_id'] );                               //5=System Total
		$this->assertEquals( $udt_arr[$date_epoch][0]['pay_code_id'], TTUUID::getZeroID() );
		$this->assertEquals( $udt_arr[$date_epoch][0]['total_time'], ( 9.5 * 3600 ) );
		$this->assertEquals( $udt_arr[$date_epoch][0]['start_time_stamp'], strtotime( $date_stamp . ' 8:00AM' ) );
		$this->assertEquals( $udt_arr[$date_epoch][0]['end_time_stamp'], strtotime( $date_stamp . ' 6:00PM' ) );
		$this->assertEquals( 0, $udt_arr[$date_epoch][0]['hourly_rate'] );
		$this->assertEquals( 0, $udt_arr[$date_epoch][0]['hourly_rate_with_burden'] );

		////Regular Time -- This was compacted out with compactUserDateTotalDataBasedOnTimeStamps()
		//$this->assertEquals( 20, $udt_arr[$date_epoch][1]['object_type_id'] );                              //Regular Time
		//$this->assertEquals( $udt_arr[$date_epoch][1]['pay_code_id'], $this->policy_ids['pay_code'][100] ); //Regular Time
		//$this->assertEquals( 299, $udt_arr[$date_epoch][1]['total_time'] );
		//$this->assertEquals( $udt_arr[$date_epoch][1]['start_time_stamp'], strtotime( $date_stamp . ' 1:57:33PM' ) );
		//$this->assertEquals( $udt_arr[$date_epoch][1]['end_time_stamp'], strtotime( $date_stamp . ' 2:02:32PM' ) );
		//$this->assertEquals( $udt_arr[$date_epoch][1]['hourly_rate'], ( 1 * 21.50 ) );
		//$this->assertEquals( $udt_arr[$date_epoch][1]['hourly_rate_with_burden'], ( 1 * 21.50 * 1.135 ) );  //13.5%
		////Regular Time -- This was compacted out with compactUserDateTotalDataBasedOnTimeStamps()
		//$this->assertEquals( 20, $udt_arr[$date_epoch][2]['object_type_id'] );                              //Regular Time
		//$this->assertEquals( $udt_arr[$date_epoch][2]['pay_code_id'], $this->policy_ids['pay_code'][100] ); //Regular Time
		//$this->assertEquals( 349, $udt_arr[$date_epoch][2]['total_time'] );
		//$this->assertEquals( $udt_arr[$date_epoch][2]['start_time_stamp'], strtotime( $date_stamp . ' 2:02:32PM' ) );
		//$this->assertEquals( $udt_arr[$date_epoch][2]['end_time_stamp'], strtotime( $date_stamp . ' 2:08:21PM' ) );
		//$this->assertEquals( $udt_arr[$date_epoch][2]['hourly_rate'], ( 1 * 21.50 ) );
		//$this->assertEquals( $udt_arr[$date_epoch][2]['hourly_rate_with_burden'], ( 1 * 21.50 * 1.135 ) );  //13.5%
		////Regular Time -- This was compacted out with compactUserDateTotalDataBasedOnTimeStamps()
		//$this->assertEquals( 20, $udt_arr[$date_epoch][3]['object_type_id'] );                              //Regular Time
		//$this->assertEquals( $udt_arr[$date_epoch][3]['pay_code_id'], $this->policy_ids['pay_code'][100] ); //Regular Time
		//$this->assertEquals( 399, $udt_arr[$date_epoch][3]['total_time'] );
		//$this->assertEquals( $udt_arr[$date_epoch][3]['start_time_stamp'], strtotime( $date_stamp . ' 2:08:21PM' ) );
		//$this->assertEquals( $udt_arr[$date_epoch][3]['end_time_stamp'], strtotime( $date_stamp . ' 2:15:00PM' ) );
		//$this->assertEquals( $udt_arr[$date_epoch][3]['hourly_rate'], ( 1 * 21.50 ) );
		//$this->assertEquals( $udt_arr[$date_epoch][3]['hourly_rate_with_burden'], ( 1 * 21.50 * 1.135 ) );  //13.5%
		////Regular Time -- This was compacted out with compactUserDateTotalDataBasedOnTimeStamps()
		//$this->assertEquals( 20, $udt_arr[$date_epoch][4]['object_type_id'] );                              //Regular Time
		//$this->assertEquals( $udt_arr[$date_epoch][4]['pay_code_id'], $this->policy_ids['pay_code'][100] ); //Regular Time
		//$this->assertEquals( 753, $udt_arr[$date_epoch][4]['total_time'] );
		//$this->assertEquals( $udt_arr[$date_epoch][4]['start_time_stamp'], strtotime( $date_stamp . ' 1:45:00PM' ) );
		//$this->assertEquals( $udt_arr[$date_epoch][4]['end_time_stamp'], strtotime( $date_stamp . ' 1:57:33PM' ) );
		//$this->assertEquals( $udt_arr[$date_epoch][4]['hourly_rate'], ( 1 * 21.50 ) );
		//$this->assertEquals( $udt_arr[$date_epoch][4]['hourly_rate_with_burden'], ( 1 * 21.50 * 1.135 ) );  //13.5%
		//Regular Time
		$this->assertEquals( 20, $udt_arr[$date_epoch][1]['object_type_id'] );                              //Regular Time
		$this->assertEquals( $udt_arr[$date_epoch][1]['pay_code_id'], $this->policy_ids['pay_code'][100] ); //Regular Time
		$this->assertEquals( 1800, $udt_arr[$date_epoch][1]['total_time'] );
		$this->assertEquals( $udt_arr[$date_epoch][1]['start_time_stamp'], strtotime( $date_stamp . ' 1:45:00PM' ) );
		$this->assertEquals( $udt_arr[$date_epoch][1]['end_time_stamp'], strtotime( $date_stamp . ' 2:15:00PM' ) );
		$this->assertEquals( $udt_arr[$date_epoch][1]['hourly_rate'], ( 1 * 21.50 ) );
		$this->assertEquals( $udt_arr[$date_epoch][1]['hourly_rate_with_burden'], ( 1 * 21.50 * 1.135 ) );  //13.5%


		//Regular Time
		$this->assertEquals( 20, $udt_arr[$date_epoch][2]['object_type_id'] );                              //Regular Time
		$this->assertEquals( $udt_arr[$date_epoch][2]['pay_code_id'], $this->policy_ids['pay_code'][100] ); //Regular Time
		$this->assertEquals( 5400, $udt_arr[$date_epoch][2]['total_time'] );
		$this->assertEquals( $udt_arr[$date_epoch][2]['start_time_stamp'], strtotime( $date_stamp . ' 12:30:00PM' ) );
		$this->assertEquals( $udt_arr[$date_epoch][2]['end_time_stamp'], strtotime( $date_stamp . ' 2:00:00PM' ) );
		$this->assertEquals( $udt_arr[$date_epoch][2]['hourly_rate'], ( 1 * 21.50 ) );
		$this->assertEquals( $udt_arr[$date_epoch][2]['hourly_rate_with_burden'], ( 1 * 21.50 * 1.135 ) );  //13.5%
		//Regular Time
		$this->assertEquals( 20, $udt_arr[$date_epoch][3]['object_type_id'] );                              //Regular Time
		$this->assertEquals( $udt_arr[$date_epoch][3]['pay_code_id'], $this->policy_ids['pay_code'][100] ); //Regular Time
		$this->assertEquals( 6300, $udt_arr[$date_epoch][3]['total_time'] );
		$this->assertEquals( $udt_arr[$date_epoch][3]['start_time_stamp'], strtotime( $date_stamp . ' 10:15:00AM' ) );
		$this->assertEquals( $udt_arr[$date_epoch][3]['end_time_stamp'], strtotime( $date_stamp . ' 12:00:00PM' ) );
		$this->assertEquals( $udt_arr[$date_epoch][3]['hourly_rate'], ( 1 * 21.50 ) );
		$this->assertEquals( $udt_arr[$date_epoch][3]['hourly_rate_with_burden'], ( 1 * 21.50 * 1.135 ) );  //13.5%
		//Regular Time
		$this->assertEquals( 20, $udt_arr[$date_epoch][4]['object_type_id'] );                              //Regular Time
		$this->assertEquals( $udt_arr[$date_epoch][4]['pay_code_id'], $this->policy_ids['pay_code'][100] ); //Regular Time
		$this->assertEquals( 7200, $udt_arr[$date_epoch][4]['total_time'] );
		$this->assertEquals( $udt_arr[$date_epoch][4]['start_time_stamp'], strtotime( $date_stamp . ' 8:00:00AM' ) );
		$this->assertEquals( $udt_arr[$date_epoch][4]['end_time_stamp'], strtotime( $date_stamp . ' 10:00:00AM' ) );
		$this->assertEquals( $udt_arr[$date_epoch][4]['hourly_rate'], ( 1 * 21.50 ) );
		$this->assertEquals( $udt_arr[$date_epoch][4]['hourly_rate_with_burden'], ( 1 * 21.50 * 1.135 ) );  //13.5%
		//Regular Time
		$this->assertEquals( 20, $udt_arr[$date_epoch][5]['object_type_id'] );                              //Regular Time
		$this->assertEquals( $udt_arr[$date_epoch][5]['pay_code_id'], $this->policy_ids['pay_code'][100] ); //Regular Time
		$this->assertEquals( 8100, $udt_arr[$date_epoch][5]['total_time'] );
		$this->assertEquals( $udt_arr[$date_epoch][5]['start_time_stamp'], strtotime( $date_stamp . ' 2:15:00PM' ) );
		$this->assertEquals( $udt_arr[$date_epoch][5]['end_time_stamp'], strtotime( $date_stamp . ' 4:30:00PM' ) );
		$this->assertEquals( $udt_arr[$date_epoch][5]['hourly_rate'], ( 1 * 21.50 ) );
		$this->assertEquals( $udt_arr[$date_epoch][5]['hourly_rate_with_burden'], ( 1 * 21.50 * 1.135 ) ); //13.5%
		//OverTime
		$this->assertEquals( 30, $udt_arr[$date_epoch][6]['object_type_id'] );                             //OverTime
		$this->assertEquals( $udt_arr[$date_epoch][6]['pay_code_id'], $policy_ids['pay_code'][0] );        //Overtime
		$this->assertEquals( 5400, $udt_arr[$date_epoch][6]['total_time'] );
		$this->assertEquals( $udt_arr[$date_epoch][6]['start_time_stamp'], strtotime( $date_stamp . ' 4:30:00PM' ) );
		$this->assertEquals( $udt_arr[$date_epoch][6]['end_time_stamp'], strtotime( $date_stamp . ' 6:00:00PM' ) );
		$this->assertEquals( $udt_arr[$date_epoch][6]['hourly_rate'], ( 1.5 * 21.50 ) );
		$this->assertEquals( 36.6038, $udt_arr[$date_epoch][6]['hourly_rate_with_burden'] );                 //13.5%

		////Regular Time -- This was compacted out with compactUserDateTotalDataBasedOnTimeStamps()
		//$this->assertEquals( 110, $udt_arr[$date_epoch][10]['object_type_id'] );                             //Break Time
		//$this->assertEquals( $udt_arr[$date_epoch][10]['pay_code_id'], $this->policy_ids['pay_code'][192] ); //Break Time
		//$this->assertEquals( 299, $udt_arr[$date_epoch][10]['total_time'] );
		//$this->assertEquals( $udt_arr[$date_epoch][10]['start_time_stamp'], strtotime( $date_stamp . ' 1:57:33PM' ) );
		//$this->assertEquals( $udt_arr[$date_epoch][10]['end_time_stamp'], strtotime( $date_stamp . ' 2:02:32PM' ) );
		//$this->assertEquals( $udt_arr[$date_epoch][10]['hourly_rate'], ( 1 * 21.50 ) );
		//$this->assertEquals( $udt_arr[$date_epoch][10]['hourly_rate_with_burden'], ( 1 * 21.50 * 1.135 ) );  //13.5%
		////Regular Time -- This was compacted out with compactUserDateTotalDataBasedOnTimeStamps()
		//$this->assertEquals( 110, $udt_arr[$date_epoch][11]['object_type_id'] );                             //Break Time
		//$this->assertEquals( $udt_arr[$date_epoch][11]['pay_code_id'], $this->policy_ids['pay_code'][192] ); //Break Time
		//$this->assertEquals( 349, $udt_arr[$date_epoch][11]['total_time'] );
		//$this->assertEquals( $udt_arr[$date_epoch][11]['start_time_stamp'], strtotime( $date_stamp . ' 2:02:32PM' ) );
		//$this->assertEquals( $udt_arr[$date_epoch][11]['end_time_stamp'], strtotime( $date_stamp . ' 2:08:21PM' ) );
		//$this->assertEquals( $udt_arr[$date_epoch][11]['hourly_rate'], ( 1 * 21.50 ) );
		//$this->assertEquals( $udt_arr[$date_epoch][11]['hourly_rate_with_burden'], ( 1 * 21.50 * 1.135 ) );  //13.5%
		////Regular Time -- This was compacted out with compactUserDateTotalDataBasedOnTimeStamps()
		//$this->assertEquals( 110, $udt_arr[$date_epoch][12]['object_type_id'] );                             //Break Time
		//$this->assertEquals( $udt_arr[$date_epoch][12]['pay_code_id'], $this->policy_ids['pay_code'][192] ); //Break Time
		//$this->assertEquals( 399, $udt_arr[$date_epoch][12]['total_time'] );
		//$this->assertEquals( $udt_arr[$date_epoch][12]['start_time_stamp'], strtotime( $date_stamp . ' 2:08:21PM' ) );
		//$this->assertEquals( $udt_arr[$date_epoch][12]['end_time_stamp'], strtotime( $date_stamp . ' 2:15:00PM' ) );
		//$this->assertEquals( $udt_arr[$date_epoch][12]['hourly_rate'], ( 1 * 21.50 ) );
		//$this->assertEquals( $udt_arr[$date_epoch][12]['hourly_rate_with_burden'], ( 1 * 21.50 * 1.135 ) );  //13.5%
		////Regular Time -- This was compacted out with compactUserDateTotalDataBasedOnTimeStamps()
		//$this->assertEquals( 110, $udt_arr[$date_epoch][13]['object_type_id'] );                             //Break Time
		//$this->assertEquals( $udt_arr[$date_epoch][13]['pay_code_id'], $this->policy_ids['pay_code'][192] ); //Break Time
		//$this->assertEquals( 753, $udt_arr[$date_epoch][13]['total_time'] );
		//$this->assertEquals( $udt_arr[$date_epoch][13]['start_time_stamp'], strtotime( $date_stamp . ' 1:45:00PM' ) );
		//$this->assertEquals( $udt_arr[$date_epoch][13]['end_time_stamp'], strtotime( $date_stamp . ' 1:57:33PM' ) );
		//$this->assertEquals( $udt_arr[$date_epoch][13]['hourly_rate'], ( 1 * 21.50 ) );
		//$this->assertEquals( $udt_arr[$date_epoch][13]['hourly_rate_with_burden'], ( 1 * 21.50 * 1.135 ) ); //13.5%
		//Regular Time
		$this->assertEquals( 110, $udt_arr[$date_epoch][7]['object_type_id'] );                             //Break Time
		$this->assertEquals( $udt_arr[$date_epoch][7]['pay_code_id'], $this->policy_ids['pay_code'][192] ); //Break Time
		$this->assertEquals( 1800, $udt_arr[$date_epoch][7]['total_time'] );
		$this->assertEquals( $udt_arr[$date_epoch][7]['start_time_stamp'], strtotime( $date_stamp . ' 1:45:00PM' ) );
		$this->assertEquals( $udt_arr[$date_epoch][7]['end_time_stamp'], strtotime( $date_stamp . ' 2:15:00PM' ) );
		$this->assertEquals( $udt_arr[$date_epoch][7]['hourly_rate'], ( 1 * 21.50 ) );
		$this->assertEquals( $udt_arr[$date_epoch][7]['hourly_rate_with_burden'], ( 1 * 21.50 * 1.135 ) ); //13.5%

		//Make sure no other hours
		$this->assertCount( 8, $udt_arr[$date_epoch] );

		return true;
	}

	/**
	 * @group OvertimePolicy_testDailyOverTimePolicyD1
	 */
	function testDailyOverTimePolicyD1() {
		global $dd;

		//Test a single overtime policy active after 0hrs in the day, and a pay rate of $0/hr.
		$policy_ids['pay_formula_policy'][] = $this->createPayFormulaPolicy( $this->company_id, 10 ); //$0/hr

		$policy_ids['pay_code'][] = $this->createPayCode( $this->company_id, 100, $policy_ids['pay_formula_policy'][0] );

		$policy_ids['overtime'][] = $this->createOverTimePolicy( $this->company_id, 10, $this->policy_ids['contributing_shift_policy'][12], $policy_ids['pay_code'][0] );

		//Create Policy Group
		$dd->createPolicyGroup( $this->company_id,
								null, //Meal
								null, //Exception
								null, //Holiday
								$policy_ids['overtime'], //OT
								null, //Premium
								null, //Round
								[ $this->user_id ], //Users
								null, //Break
								null, //Accrual
								null, //Expense
								null, //Absence
								[ $this->policy_ids['regular'][12] ] //Regular
		);


		$date_epoch = TTDate::getMiddleDayEpoch( TTDate::getBeginWeekEpoch( time() ) );
		$date_stamp = TTDate::getDate( 'DATE', $date_epoch );

		$dd->createPunchPair( $this->user_id,
							  strtotime( $date_stamp . ' 8:00AM' ),
							  strtotime( $date_stamp . ' 8:00PM' ),
							  [
									  'in_type_id'    => 10,
									  'out_type_id'   => 10,
									  'branch_id'     => 0,
									  'department_id' => 0,
									  'job_id'        => 0,
									  'job_item_id'   => 0,
									  'punch_tag_id'  => []
							  ],
							  true
		);

		$udt_arr = $this->getUserDateTotalArray( $date_epoch, $date_epoch );
		//print_r($udt_arr);

		//Total Time
		$this->assertEquals( 5, $udt_arr[$date_epoch][0]['object_type_id'] );                         //5=System Total
		$this->assertEquals( $udt_arr[$date_epoch][0]['pay_code_id'], TTUUID::getZeroID() );
		$this->assertEquals( $udt_arr[$date_epoch][0]['total_time'], ( 12 * 3600 ) );
		$this->assertEquals( $udt_arr[$date_epoch][0]['start_time_stamp'], strtotime( $date_stamp . ' 8:00AM' ) );
		$this->assertEquals( $udt_arr[$date_epoch][0]['end_time_stamp'], strtotime( $date_stamp . ' 8:00PM' ) );
		$this->assertEquals( 0, $udt_arr[$date_epoch][0]['hourly_rate'] );
		$this->assertEquals( 0, $udt_arr[$date_epoch][0]['hourly_rate_with_burden'] );
		//Overtime 1
		$this->assertEquals( 30, $udt_arr[$date_epoch][1]['object_type_id'] );                        //OverTime
		$this->assertEquals( $udt_arr[$date_epoch][1]['pay_code_id'], $policy_ids['pay_code'][0] );
		$this->assertEquals( $udt_arr[$date_epoch][1]['total_time'], ( 12 * 3600 ) );
		$this->assertEquals( $udt_arr[$date_epoch][1]['start_time_stamp'], strtotime( $date_stamp . ' 8:00AM' ) );
		$this->assertEquals( $udt_arr[$date_epoch][1]['end_time_stamp'], strtotime( $date_stamp . ' 8:00PM' ) );
		$this->assertEquals( $udt_arr[$date_epoch][1]['hourly_rate'], ( 0 * 21.50 ) );
		$this->assertEquals( Misc::MoneyRound( $udt_arr[$date_epoch][1]['hourly_rate_with_burden'] ), Misc::MoneyRound( ( 0 * 21.50 * 1.135 ) ) ); //13.5%

		//Make sure no other hours
		$this->assertCount( 2, $udt_arr[$date_epoch] );

		return true;
	}

	/**
	 * @group OvertimePolicy_testDailyOverTimePolicyD2
	 */
	function testDailyOverTimePolicyD2() {
		global $dd;

		//Test a single overtime policy active after 0hrs in the day, and a pay rate of 1.5x
		$policy_ids['pay_formula_policy'][] = $this->createPayFormulaPolicy( $this->company_id, 200 ); //1.5x

		$policy_ids['pay_code'][] = $this->createPayCode( $this->company_id, 100, $policy_ids['pay_formula_policy'][0] );

		$policy_ids['overtime'][] = $this->createOverTimePolicy( $this->company_id, 10, $this->policy_ids['contributing_shift_policy'][12], $policy_ids['pay_code'][0] );

		//Create Policy Group
		$dd->createPolicyGroup( $this->company_id,
								null, //Meal
								null, //Exception
								null, //Holiday
								$policy_ids['overtime'], //OT
								null, //Premium
								null, //Round
								[ $this->user_id ], //Users
								null, //Break
								null, //Accrual
								null, //Expense
								null, //Absence
								[ $this->policy_ids['regular'][12] ] //Regular
		);


		$date_epoch = TTDate::getMiddleDayEpoch( TTDate::getBeginWeekEpoch( time() ) );
		$date_stamp = TTDate::getDate( 'DATE', $date_epoch );

		$dd->createPunchPair( $this->user_id,
							  strtotime( $date_stamp . ' 8:00AM' ),
							  strtotime( $date_stamp . ' 8:00PM' ),
							  [
									  'in_type_id'    => 10,
									  'out_type_id'   => 10,
									  'branch_id'     => 0,
									  'department_id' => 0,
									  'job_id'        => 0,
									  'job_item_id'   => 0,
									  'punch_tag_id'  => []
							  ],
							  true
		);

		$udt_arr = $this->getUserDateTotalArray( $date_epoch, $date_epoch );
		//print_r($udt_arr);

		//Total Time
		$this->assertEquals( 5, $udt_arr[$date_epoch][0]['object_type_id'] );                          //5=System Total
		$this->assertEquals( $udt_arr[$date_epoch][0]['pay_code_id'], TTUUID::getZeroID() );
		$this->assertEquals( $udt_arr[$date_epoch][0]['total_time'], ( 12 * 3600 ) );
		$this->assertEquals( $udt_arr[$date_epoch][0]['start_time_stamp'], strtotime( $date_stamp . ' 8:00AM' ) );
		$this->assertEquals( $udt_arr[$date_epoch][0]['end_time_stamp'], strtotime( $date_stamp . ' 8:00PM' ) );
		$this->assertEquals( 0, $udt_arr[$date_epoch][0]['hourly_rate'] );
		$this->assertEquals( 0, $udt_arr[$date_epoch][0]['hourly_rate_with_burden'] );
		//Overtime 1
		$this->assertEquals( 30, $udt_arr[$date_epoch][1]['object_type_id'] );                         //OverTime
		$this->assertEquals( $udt_arr[$date_epoch][1]['pay_code_id'], $policy_ids['pay_code'][0] );
		$this->assertEquals( $udt_arr[$date_epoch][1]['total_time'], ( 12 * 3600 ) );
		$this->assertEquals( $udt_arr[$date_epoch][1]['start_time_stamp'], strtotime( $date_stamp . ' 8:00AM' ) );
		$this->assertEquals( $udt_arr[$date_epoch][1]['end_time_stamp'], strtotime( $date_stamp . ' 8:00PM' ) );
		$this->assertEquals( $udt_arr[$date_epoch][1]['hourly_rate'], ( 1.5 * 21.50 ) );
		$this->assertEquals( Misc::MoneyRound( $udt_arr[$date_epoch][1]['hourly_rate_with_burden'] ), Misc::MoneyRound( ( 1.5 * 21.50 * 1.135 ) ) ); //13.5%

		//Make sure no other hours
		$this->assertCount( 2, $udt_arr[$date_epoch] );

		return true;
	}

	/**
	 * @group OvertimePolicy_testWeeklyOverTimePolicyA
	 */
	function testWeeklyOverTimePolicyA() {
		global $dd;

		$policy_ids['pay_formula_policy'][] = $this->createPayFormulaPolicy( $this->company_id, 200 );      //OT1.5
		$policy_ids['pay_formula_policy'][] = $this->createPayFormulaPolicy( $this->company_id, 210 );      //OT2.0
		$policy_ids['pay_formula_policy'][] = $this->createPayFormulaPolicy( $this->company_id, 220 );      //OT2.5

		$policy_ids['pay_code'][] = $this->createPayCode( $this->company_id, 200, $policy_ids['pay_formula_policy'][0] );
		$policy_ids['pay_code'][] = $this->createPayCode( $this->company_id, 210, $policy_ids['pay_formula_policy'][1] );
		$policy_ids['pay_code'][] = $this->createPayCode( $this->company_id, 220, $policy_ids['pay_formula_policy'][2] );

		$policy_ids['overtime'][] = $this->createOverTimePolicy( $this->company_id, 200, $this->policy_ids['contributing_shift_policy'][12], $policy_ids['pay_code'][0] );
		$policy_ids['overtime'][] = $this->createOverTimePolicy( $this->company_id, 210, $this->policy_ids['contributing_shift_policy'][12], $policy_ids['pay_code'][1] );
		$policy_ids['overtime'][] = $this->createOverTimePolicy( $this->company_id, 220, $this->policy_ids['contributing_shift_policy'][12], $policy_ids['pay_code'][2] );
		//print_r($policy_ids['overtime']);

		//Create Policy Group
		$dd->createPolicyGroup( $this->company_id,
								null, //Meal
								null, //Exception
								null, //Holiday
								$policy_ids['overtime'], //OT
								null, //Premium
								null, //Round
								[ $this->user_id ], //Users
								null, //Break
								null, //Accrual
								null, //Expense
								null, //Absence
								[ $this->policy_ids['regular'][12] ] //Regular
		);

		$date_epoch = TTDate::getMiddleDayEpoch( TTDate::getBeginWeekEpoch( time() ) );
		$date_stamp = TTDate::getDate( 'DATE', $date_epoch );

		//
		//Day of Week: 1
		//
		$dd->createPunchPair( $this->user_id,
							  strtotime( $date_stamp . ' 8:00AM' ),
							  strtotime( $date_stamp . ' 8:00PM' ),
							  [
									  'in_type_id'    => 10,
									  'out_type_id'   => 10,
									  'branch_id'     => 0,
									  'department_id' => 0,
									  'job_id'        => 0,
									  'job_item_id'   => 0,
									  'punch_tag_id'  => []
							  ],
							  true
		);

		$udt_arr = $this->getUserDateTotalArray( $date_epoch, $date_epoch );
		//print_r($udt_arr);
		//Total Time
		$this->assertEquals( 5, $udt_arr[$date_epoch][0]['object_type_id'] );                               //5=System Total
		$this->assertEquals( $udt_arr[$date_epoch][0]['pay_code_id'], TTUUID::getZeroID() );
		$this->assertEquals( $udt_arr[$date_epoch][0]['total_time'], ( 12 * 3600 ) );
		//Regular Time
		$this->assertEquals( 20, $udt_arr[$date_epoch][1]['object_type_id'] );                              //Regular Time
		$this->assertEquals( $udt_arr[$date_epoch][1]['pay_code_id'], $this->policy_ids['pay_code'][100] ); //Regular Time
		$this->assertEquals( $udt_arr[$date_epoch][1]['total_time'], ( 12 * 3600 ) );
		//Make sure no other hours
		$this->assertCount( 2, $udt_arr[$date_epoch] );
		//
		//Day of Week: 2
		//
		$date_epoch = TTDate::incrementDate( TTDate::getMiddleDayEpoch( TTDate::getBeginWeekEpoch( time() ) ), 1, 'day' );
		$date_stamp = TTDate::getDate( 'DATE', $date_epoch );

		$dd->createPunchPair( $this->user_id,
							  strtotime( $date_stamp . ' 8:00AM' ),
							  strtotime( $date_stamp . ' 8:00PM' ),
							  [
									  'in_type_id'    => 10,
									  'out_type_id'   => 10,
									  'branch_id'     => 0,
									  'department_id' => 0,
									  'job_id'        => 0,
									  'job_item_id'   => 0,
									  'punch_tag_id'  => []
							  ],
							  true
		);

		$udt_arr = $this->getUserDateTotalArray( $date_epoch, $date_epoch );
		//Total Time
		$this->assertEquals( 5, $udt_arr[$date_epoch][0]['object_type_id'] );                               //5=System Total
		$this->assertEquals( $udt_arr[$date_epoch][0]['pay_code_id'], TTUUID::getZeroID() );
		$this->assertEquals( $udt_arr[$date_epoch][0]['total_time'], ( 12 * 3600 ) );
		//Regular Time
		$this->assertEquals( 20, $udt_arr[$date_epoch][1]['object_type_id'] );                              //Regular Time
		$this->assertEquals( $udt_arr[$date_epoch][1]['pay_code_id'], $this->policy_ids['pay_code'][100] ); //Regular Time
		$this->assertEquals( $udt_arr[$date_epoch][1]['total_time'], ( 12 * 3600 ) );
		//Make sure no other hours
		$this->assertCount( 2, $udt_arr[$date_epoch] );

		//
		//Day of Week: 3
		//
		$date_epoch = TTDate::incrementDate( TTDate::getMiddleDayEpoch( TTDate::getBeginWeekEpoch( time() ) ), 2, 'day' );
		$date_stamp = TTDate::getDate( 'DATE', $date_epoch );

		$dd->createPunchPair( $this->user_id,
							  strtotime( $date_stamp . ' 8:00AM' ),
							  strtotime( $date_stamp . ' 8:00PM' ),
							  [
									  'in_type_id'    => 10,
									  'out_type_id'   => 10,
									  'branch_id'     => 0,
									  'department_id' => 0,
									  'job_id'        => 0,
									  'job_item_id'   => 0,
									  'punch_tag_id'  => []
							  ],
							  true
		);

		$udt_arr = $this->getUserDateTotalArray( $date_epoch, $date_epoch );
		//Total Time
		$this->assertEquals( 5, $udt_arr[$date_epoch][0]['object_type_id'] );                               //5=System Total
		$this->assertEquals( $udt_arr[$date_epoch][0]['pay_code_id'], TTUUID::getZeroID() );
		$this->assertEquals( $udt_arr[$date_epoch][0]['total_time'], ( 12 * 3600 ) );
		//Regular Time
		$this->assertEquals( 20, $udt_arr[$date_epoch][1]['object_type_id'] );                              //Regular Time
		$this->assertEquals( $udt_arr[$date_epoch][1]['pay_code_id'], $this->policy_ids['pay_code'][100] ); //Regular Time
		$this->assertEquals( $udt_arr[$date_epoch][1]['total_time'], ( 12 * 3600 ) );
		//Make sure no other hours
		$this->assertCount( 2, $udt_arr[$date_epoch] );

		//
		//Day of Week: 4
		//
		$date_epoch = TTDate::incrementDate( TTDate::getMiddleDayEpoch( TTDate::getBeginWeekEpoch( time() ) ), 3, 'day' );
		$date_stamp = TTDate::getDate( 'DATE', $date_epoch );

		$dd->createPunchPair( $this->user_id,
							  strtotime( $date_stamp . ' 8:00AM' ),
							  strtotime( $date_stamp . ' 8:00PM' ),
							  [
									  'in_type_id'    => 10,
									  'out_type_id'   => 10,
									  'branch_id'     => 0,
									  'department_id' => 0,
									  'job_id'        => 0,
									  'job_item_id'   => 0,
									  'punch_tag_id'  => []
							  ],
							  true
		);

		$udt_arr = $this->getUserDateTotalArray( $date_epoch, $date_epoch );
		//print_r($udt_arr);
		//Total Time
		$this->assertEquals( 5, $udt_arr[$date_epoch][0]['object_type_id'] );                               //5=System Total
		$this->assertEquals( $udt_arr[$date_epoch][0]['pay_code_id'], TTUUID::getZeroID() );
		$this->assertEquals( $udt_arr[$date_epoch][0]['total_time'], ( 12 * 3600 ) );
		//Regular Time
		$this->assertEquals( 20, $udt_arr[$date_epoch][1]['object_type_id'] );                              //Regular Time
		$this->assertEquals( $udt_arr[$date_epoch][1]['pay_code_id'], $this->policy_ids['pay_code'][100] ); //Regular Time
		$this->assertEquals( $udt_arr[$date_epoch][1]['total_time'], ( 11 * 3600 ) );
		//Overtime 1
		$this->assertEquals( 30, $udt_arr[$date_epoch][2]['object_type_id'] );                              //OverTime
		$this->assertEquals( $udt_arr[$date_epoch][2]['pay_code_id'], $policy_ids['pay_code'][0] );
		$this->assertEquals( $udt_arr[$date_epoch][2]['total_time'], ( 1 * 3600 ) );
		//Make sure no other hours
		$this->assertCount( 3, $udt_arr[$date_epoch] );

		//
		//Day of Week: 5
		//
		$date_epoch = TTDate::incrementDate( TTDate::getMiddleDayEpoch( TTDate::getBeginWeekEpoch( time() ) ), 4, 'day' );
		$date_stamp = TTDate::getDate( 'DATE', $date_epoch );

		$dd->createPunchPair( $this->user_id,
							  strtotime( $date_stamp . ' 8:00AM' ),
							  strtotime( $date_stamp . ' 8:00PM' ),
							  [
									  'in_type_id'    => 10,
									  'out_type_id'   => 10,
									  'branch_id'     => 0,
									  'department_id' => 0,
									  'job_id'        => 0,
									  'job_item_id'   => 0,
									  'punch_tag_id'  => []
							  ],
							  true
		);

		$udt_arr = $this->getUserDateTotalArray( $date_epoch, $date_epoch );
		//print_r($udt_arr);
		//Total Time
		$this->assertEquals( 5, $udt_arr[$date_epoch][0]['object_type_id'] );                               //5=System Total
		$this->assertEquals( $udt_arr[$date_epoch][0]['pay_code_id'], TTUUID::getZeroID() );
		$this->assertEquals( $udt_arr[$date_epoch][0]['total_time'], ( 12 * 3600 ) );
		//Overtime 1
		$this->assertEquals( 30, $udt_arr[$date_epoch][2]['object_type_id'] );                              //OverTime
		$this->assertEquals( $udt_arr[$date_epoch][2]['pay_code_id'], $policy_ids['pay_code'][0] );
		$this->assertEquals( $udt_arr[$date_epoch][2]['total_time'], ( 11 * 3600 ) );
		//Overtime 2
		$this->assertEquals( 30, $udt_arr[$date_epoch][1]['object_type_id'] );                              //OverTime
		$this->assertEquals( $udt_arr[$date_epoch][1]['pay_code_id'], $policy_ids['pay_code'][1] );
		$this->assertEquals( $udt_arr[$date_epoch][1]['total_time'], ( 1 * 3600 ) );
		//Make sure no other hours
		$this->assertCount( 3, $udt_arr[$date_epoch] );

		//
		//Day of Week: 6
		//
		$date_epoch = TTDate::incrementDate( TTDate::getMiddleDayEpoch( TTDate::getBeginWeekEpoch( time() ) ), 5, 'day' );
		$date_stamp = TTDate::getDate( 'DATE', $date_epoch );

		$dd->createPunchPair( $this->user_id,
							  strtotime( $date_stamp . ' 8:00AM' ),
							  strtotime( $date_stamp . ' 8:00PM' ),
							  [
									  'in_type_id'    => 10,
									  'out_type_id'   => 10,
									  'branch_id'     => 0,
									  'department_id' => 0,
									  'job_id'        => 0,
									  'job_item_id'   => 0,
									  'punch_tag_id'  => []
							  ],
							  true
		);

		$udt_arr = $this->getUserDateTotalArray( $date_epoch, $date_epoch );
		//print_r($udt_arr);
		//Total Time
		$this->assertEquals( 5, $udt_arr[$date_epoch][0]['object_type_id'] );                               //5=System Total
		$this->assertEquals( $udt_arr[$date_epoch][0]['pay_code_id'], TTUUID::getZeroID() );
		$this->assertEquals( $udt_arr[$date_epoch][0]['total_time'], ( 12 * 3600 ) );
		//Overtime 1
		$this->assertEquals( 30, $udt_arr[$date_epoch][2]['object_type_id'] );                              //OverTime
		$this->assertEquals( $udt_arr[$date_epoch][2]['pay_code_id'], $policy_ids['pay_code'][1] );
		$this->assertEquals( $udt_arr[$date_epoch][2]['total_time'], ( 11 * 3600 ) );
		//Overtime 2
		$this->assertEquals( 30, $udt_arr[$date_epoch][1]['object_type_id'] );                              //OverTime
		$this->assertEquals( $udt_arr[$date_epoch][1]['pay_code_id'], $policy_ids['pay_code'][2] );
		$this->assertEquals( $udt_arr[$date_epoch][1]['total_time'], ( 1 * 3600 ) );
		//Make sure no other hours
		$this->assertCount( 3, $udt_arr[$date_epoch] );

		return true;
	}

	/**
	 * @group OvertimePolicy_testDuplicateWeeklyOverTimePolicyA
	 */
	function testDuplicateWeeklyOverTimePolicyA() {
		global $dd;

		$policy_ids['pay_formula_policy'][] = $this->createPayFormulaPolicy( $this->company_id, 200 );      //OT1.5
		$policy_ids['pay_formula_policy'][] = $this->createPayFormulaPolicy( $this->company_id, 210 );      //OT2.0
		$policy_ids['pay_formula_policy'][] = $this->createPayFormulaPolicy( $this->company_id, 220 );      //OT2.5

		$policy_ids['pay_code'][] = $this->createPayCode( $this->company_id, 200, $policy_ids['pay_formula_policy'][0] );
		$policy_ids['pay_code'][] = $this->createPayCode( $this->company_id, 210, $policy_ids['pay_formula_policy'][1] );
		$policy_ids['pay_code'][] = $this->createPayCode( $this->company_id, 220, $policy_ids['pay_formula_policy'][2] );

		//Duplicate Weekly OT policies, they should BOTH be attempted to calculate due to differential criteria.
		$policy_ids['overtime'][] = $this->createOverTimePolicy( $this->company_id, 242, $this->policy_ids['contributing_shift_policy'][12], $policy_ids['pay_code'][0] );
		$policy_ids['overtime'][] = $this->createOverTimePolicy( $this->company_id, 250, $this->policy_ids['contributing_shift_policy'][12], $policy_ids['pay_code'][0] );
		$policy_ids['overtime'][] = $this->createOverTimePolicy( $this->company_id, 200, $this->policy_ids['contributing_shift_policy'][12], $policy_ids['pay_code'][0] );
		$policy_ids['overtime'][] = $this->createOverTimePolicy( $this->company_id, 220, $this->policy_ids['contributing_shift_policy'][12], $policy_ids['pay_code'][1] );
		//print_r($policy_ids['overtime']);

		//Create Policy Group
		$dd->createPolicyGroup( $this->company_id,
								null, //Meal
								null, //Exception
								null, //Holiday
								$policy_ids['overtime'], //OT
								null, //Premium
								null, //Round
								[ $this->user_id ], //Users
								null, //Break
								null, //Accrual
								null, //Expense
								null, //Absence
								[ $this->policy_ids['regular'][12] ] //Regular
		);

		$date_epoch = TTDate::getMiddleDayEpoch( TTDate::getBeginWeekEpoch( time() ) );
		$date_stamp = TTDate::getDate( 'DATE', $date_epoch );

		//
		//Day of Week: 1
		//
		$dd->createPunchPair( $this->user_id,
							  strtotime( $date_stamp . ' 8:00AM' ),
							  strtotime( $date_stamp . ' 8:00PM' ),
							  [
									  'in_type_id'    => 10,
									  'out_type_id'   => 10,
									  'branch_id'     => 0,
									  'department_id' => 0,
									  'job_id'        => 0,
									  'job_item_id'   => 0,
									  'punch_tag_id'  => []
							  ],
							  true
		);

		$udt_arr = $this->getUserDateTotalArray( $date_epoch, $date_epoch );
		//print_r($udt_arr);
		//Total Time
		$this->assertEquals( 5, $udt_arr[$date_epoch][0]['object_type_id'] );                               //5=System Total
		$this->assertEquals( $udt_arr[$date_epoch][0]['pay_code_id'], TTUUID::getZeroID() );
		$this->assertEquals( $udt_arr[$date_epoch][0]['total_time'], ( 12 * 3600 ) );
		//Regular Time
		$this->assertEquals( 20, $udt_arr[$date_epoch][1]['object_type_id'] );                              //Regular Time
		$this->assertEquals( $udt_arr[$date_epoch][1]['pay_code_id'], $this->policy_ids['pay_code'][100] ); //Regular Time
		$this->assertEquals( $udt_arr[$date_epoch][1]['total_time'], ( 12 * 3600 ) );
		//Make sure no other hours
		$this->assertCount( 2, $udt_arr[$date_epoch] );
		//
		//Day of Week: 2
		//
		$date_epoch = TTDate::incrementDate( TTDate::getMiddleDayEpoch( TTDate::getBeginWeekEpoch( time() ) ), 1, 'day' );
		$date_stamp = TTDate::getDate( 'DATE', $date_epoch );

		$dd->createPunchPair( $this->user_id,
							  strtotime( $date_stamp . ' 8:00AM' ),
							  strtotime( $date_stamp . ' 8:00PM' ),
							  [
									  'in_type_id'    => 10,
									  'out_type_id'   => 10,
									  'branch_id'     => 0,
									  'department_id' => 0,
									  'job_id'        => 0,
									  'job_item_id'   => 0,
									  'punch_tag_id'  => []
							  ],
							  true
		);

		$udt_arr = $this->getUserDateTotalArray( $date_epoch, $date_epoch );
		//Total Time
		$this->assertEquals( 5, $udt_arr[$date_epoch][0]['object_type_id'] );                               //5=System Total
		$this->assertEquals( $udt_arr[$date_epoch][0]['pay_code_id'], TTUUID::getZeroID() );
		$this->assertEquals( $udt_arr[$date_epoch][0]['total_time'], ( 12 * 3600 ) );
		//Regular Time
		$this->assertEquals( 20, $udt_arr[$date_epoch][1]['object_type_id'] );                              //Regular Time
		$this->assertEquals( $udt_arr[$date_epoch][1]['pay_code_id'], $this->policy_ids['pay_code'][100] ); //Regular Time
		$this->assertEquals( $udt_arr[$date_epoch][1]['total_time'], ( 12 * 3600 ) );
		//Make sure no other hours
		$this->assertCount( 2, $udt_arr[$date_epoch] );

		//
		//Day of Week: 3
		//
		$date_epoch = TTDate::incrementDate( TTDate::getMiddleDayEpoch( TTDate::getBeginWeekEpoch( time() ) ), 2, 'day' );
		$date_stamp = TTDate::getDate( 'DATE', $date_epoch );

		$dd->createPunchPair( $this->user_id,
							  strtotime( $date_stamp . ' 8:00AM' ),
							  strtotime( $date_stamp . ' 8:00PM' ),
							  [
									  'in_type_id'    => 10,
									  'out_type_id'   => 10,
									  'branch_id'     => 0,
									  'department_id' => 0,
									  'job_id'        => 0,
									  'job_item_id'   => 0,
									  'punch_tag_id'  => []
							  ],
							  true
		);

		$udt_arr = $this->getUserDateTotalArray( $date_epoch, $date_epoch );
		//Total Time
		$this->assertEquals( 5, $udt_arr[$date_epoch][0]['object_type_id'] );                               //5=System Total
		$this->assertEquals( $udt_arr[$date_epoch][0]['pay_code_id'], TTUUID::getZeroID() );
		$this->assertEquals( $udt_arr[$date_epoch][0]['total_time'], ( 12 * 3600 ) );
		//Regular Time
		$this->assertEquals( 20, $udt_arr[$date_epoch][1]['object_type_id'] );                              //Regular Time
		$this->assertEquals( $udt_arr[$date_epoch][1]['pay_code_id'], $this->policy_ids['pay_code'][100] ); //Regular Time
		$this->assertEquals( $udt_arr[$date_epoch][1]['total_time'], ( 12 * 3600 ) );
		//Make sure no other hours
		$this->assertCount( 2, $udt_arr[$date_epoch] );

		//
		//Day of Week: 4
		//
		$date_epoch = TTDate::incrementDate( TTDate::getMiddleDayEpoch( TTDate::getBeginWeekEpoch( time() ) ), 3, 'day' );
		$date_stamp = TTDate::getDate( 'DATE', $date_epoch );

		$dd->createPunchPair( $this->user_id,
							  strtotime( $date_stamp . ' 8:00AM' ),
							  strtotime( $date_stamp . ' 8:00PM' ),
							  [
									  'in_type_id'    => 10,
									  'out_type_id'   => 10,
									  'branch_id'     => 0,
									  'department_id' => 0,
									  'job_id'        => 0,
									  'job_item_id'   => 0,
									  'punch_tag_id'  => []
							  ],
							  true
		);

		$udt_arr = $this->getUserDateTotalArray( $date_epoch, $date_epoch );
		//print_r($udt_arr);

		//Total Time
		$this->assertEquals( 5, $udt_arr[$date_epoch][0]['object_type_id'] );                               //5=System Total
		$this->assertEquals( $udt_arr[$date_epoch][0]['pay_code_id'], TTUUID::getZeroID() );
		$this->assertEquals( $udt_arr[$date_epoch][0]['total_time'], ( 12 * 3600 ) );
		//Regular Time
		$this->assertEquals( 20, $udt_arr[$date_epoch][1]['object_type_id'] );                              //Regular Time
		$this->assertEquals( $udt_arr[$date_epoch][1]['pay_code_id'], $this->policy_ids['pay_code'][100] ); //Regular Time
		$this->assertEquals( $udt_arr[$date_epoch][1]['total_time'], ( 4 * 3600 ) );
		//Overtime 2
		$this->assertEquals( 30, $udt_arr[$date_epoch][2]['object_type_id'] );                              //OverTime
		$this->assertEquals( $udt_arr[$date_epoch][2]['pay_code_id'], $policy_ids['pay_code'][0] );
		$this->assertEquals( $udt_arr[$date_epoch][2]['total_time'], ( 1 * 3600 ) );
		//Overtime 1
		$this->assertEquals( 30, $udt_arr[$date_epoch][3]['object_type_id'] );                              //OverTime
		$this->assertEquals( $udt_arr[$date_epoch][3]['pay_code_id'], $policy_ids['pay_code'][0] );
		$this->assertEquals( $udt_arr[$date_epoch][3]['total_time'], ( 7 * 3600 ) );

		//Make sure no other hours
		$this->assertCount( 4, $udt_arr[$date_epoch] );

		//
		//Day of Week: 5
		//
		$date_epoch = TTDate::incrementDate( TTDate::getMiddleDayEpoch( TTDate::getBeginWeekEpoch( time() ) ), 4, 'day' );
		$date_stamp = TTDate::getDate( 'DATE', $date_epoch );

		$dd->createPunchPair( $this->user_id,
							  strtotime( $date_stamp . ' 8:00AM' ),
							  strtotime( $date_stamp . ' 8:00PM' ),
							  [
									  'in_type_id'    => 10,
									  'out_type_id'   => 10,
									  'branch_id'     => 0,
									  'department_id' => 0,
									  'job_id'        => 0,
									  'job_item_id'   => 0,
									  'punch_tag_id'  => []
							  ],
							  true
		);

		$udt_arr = $this->getUserDateTotalArray( $date_epoch, $date_epoch );
		//print_r($udt_arr);
		//Total Time
		$this->assertEquals( 5, $udt_arr[$date_epoch][0]['object_type_id'] );                               //5=System Total
		$this->assertEquals( $udt_arr[$date_epoch][0]['pay_code_id'], TTUUID::getZeroID() );
		$this->assertEquals( $udt_arr[$date_epoch][0]['total_time'], ( 12 * 3600 ) );
		//Overtime 1
		$this->assertEquals( 30, $udt_arr[$date_epoch][1]['object_type_id'] );                              //OverTime
		$this->assertEquals( $udt_arr[$date_epoch][1]['pay_code_id'], $policy_ids['pay_code'][0] );
		$this->assertEquals( $udt_arr[$date_epoch][1]['total_time'], ( 12 * 3600 ) );
		//Make sure no other hours
		$this->assertCount( 2, $udt_arr[$date_epoch] );

		//
		//Day of Week: 6
		//
		$date_epoch = TTDate::incrementDate( TTDate::getMiddleDayEpoch( TTDate::getBeginWeekEpoch( time() ) ), 5, 'day' );
		$date_stamp = TTDate::getDate( 'DATE', $date_epoch );

		$dd->createPunchPair( $this->user_id,
							  strtotime( $date_stamp . ' 8:00AM' ),
							  strtotime( $date_stamp . ' 8:00PM' ),
							  [
									  'in_type_id'    => 10,
									  'out_type_id'   => 10,
									  'branch_id'     => 0,
									  'department_id' => 0,
									  'job_id'        => 0,
									  'job_item_id'   => 0,
									  'punch_tag_id'  => []
							  ],
							  true
		);

		$udt_arr = $this->getUserDateTotalArray( $date_epoch, $date_epoch );
		//print_r($udt_arr);
		//Total Time
		$this->assertEquals( 5, $udt_arr[$date_epoch][0]['object_type_id'] );                               //5=System Total
		$this->assertEquals( $udt_arr[$date_epoch][0]['pay_code_id'], TTUUID::getZeroID() );
		$this->assertEquals( $udt_arr[$date_epoch][0]['total_time'], ( 12 * 3600 ) );
		//Overtime 2
		$this->assertEquals( 30, $udt_arr[$date_epoch][1]['object_type_id'] );                              //OverTime
		$this->assertEquals( $udt_arr[$date_epoch][1]['pay_code_id'], $policy_ids['pay_code'][1] );
		$this->assertEquals( $udt_arr[$date_epoch][1]['total_time'], ( 1 * 3600 ) );
		//Overtime 1
		$this->assertEquals( 30, $udt_arr[$date_epoch][2]['object_type_id'] );                              //OverTime
		$this->assertEquals( $udt_arr[$date_epoch][2]['pay_code_id'], $policy_ids['pay_code'][0] );
		$this->assertEquals( $udt_arr[$date_epoch][2]['total_time'], ( 11 * 3600 ) );
		//Make sure no other hours
		$this->assertCount( 3, $udt_arr[$date_epoch] );

		return true;
	}


	/**
	 * @group OvertimePolicy_testDailyOverTimeWithTimeBank
	 */
	function testDailyOverTimeWithTimeBank() {
		//Test handling daily OT with absences and the Start/End timestamps for each UDT record.
		global $dd;

		//$policy_ids['pay_formula_policy'][]  = $this->createPayFormulaPolicy( $this->company_id, 910 ); //OT1.5 BANK
		//$policy_ids['pay_formula_policy'][]  = $this->createPayFormulaPolicy( $this->company_id, 210 ); //OT2.0
		//$policy_ids['pay_formula_policy'][]  = $this->createPayFormulaPolicy( $this->company_id, 220 ); //OT2.5

		$policy_ids['pay_code'][] = $this->createPayCode( $this->company_id, 100, $this->policy_ids['pay_formula_policy'][910] );
		//$policy_ids['pay_code'][]  = $this->createPayCode( $this->company_id, 110, $policy_ids['pay_formula_policy'][1] );
		//$policy_ids['pay_code'][]  = $this->createPayCode( $this->company_id, 120, $policy_ids['pay_formula_policy'][2] );

		$policy_ids['overtime'][] = $this->createOverTimePolicy( $this->company_id, 100, $this->policy_ids['contributing_shift_policy'][14], $policy_ids['pay_code'][0] );
		//$policy_ids['overtime'][] = $this->createOverTimePolicy( $this->company_id, 110, $this->policy_ids['contributing_shift_policy'][14], $policy_ids['pay_code'][1] );
		//$policy_ids['overtime'][] = $this->createOverTimePolicy( $this->company_id, 120, $this->policy_ids['contributing_shift_policy'][14], $policy_ids['pay_code'][2] );

		//Create Policy Group
		$dd->createPolicyGroup( $this->company_id,
								null, //Meal
								null, //Exception
								null, //Holiday
								$policy_ids['overtime'], //OT
								null, //Premium
								null, //Round
								[ $this->user_id ], //Users
								null, //Break
								null, //Accrual
								null, //Expense
								[ $this->policy_ids['absence'][10] ], //Absence
								[ $this->policy_ids['regular'][12] ] //Regular
		);


		$date_epoch = TTDate::getMiddleDayEpoch( TTDate::getBeginWeekEpoch( time(), 1 ) );                  //Start on Monday to avoid DST issues on Sunday morning.
		$date_stamp = TTDate::getDate( 'DATE', $date_epoch );

		$this->assertEquals( $this->getCurrentAccrualBalance( $this->user_id, $this->policy_ids['accrual_policy_account'][10] ), ( 0 * 3600 ) );

		$dd->createPunchPair( $this->user_id,
							  strtotime( $date_stamp . ' 8:00AM' ),
							  strtotime( $date_stamp . ' 5:00PM' ),
							  [
									  'in_type_id'    => 10,
									  'out_type_id'   => 10,
									  'branch_id'     => 0,
									  'department_id' => 0,
									  'job_id'        => 0,
									  'job_item_id'   => 0,
									  'punch_tag_id'  => []
							  ],
							  true
		);

		$dd->createPunchPair( $this->user_id,
							  strtotime( $date_stamp . ' 5:00PM' ),
							  strtotime( $date_stamp . ' 6:30PM' ),
							  [
									  'in_type_id'    => 10,
									  'out_type_id'   => 10,
									  'branch_id'     => 0,
									  'department_id' => 0,
									  'job_id'        => 0,
									  'job_item_id'   => 0,
									  'punch_tag_id'  => []
							  ],
							  true
		);

		$this->assertEquals( $this->getCurrentAccrualBalance( $this->user_id, $this->policy_ids['accrual_policy_account'][10] ), ( -2.5 * 3600 ) );

		$udt_arr = $this->getUserDateTotalArray( $date_epoch, $date_epoch );
		//print_r($udt_arr);

		//Total Time
		$this->assertEquals( 5, $udt_arr[$date_epoch][0]['object_type_id'] );                               //5=System Total
		$this->assertEquals( $udt_arr[$date_epoch][0]['pay_code_id'], TTUUID::getZeroID() );
		$this->assertEquals( $udt_arr[$date_epoch][0]['total_time'], ( 10.5 * 3600 ) );
		$this->assertEquals( $udt_arr[$date_epoch][0]['start_time_stamp'], strtotime( $date_stamp . ' 8:00AM' ) );
		$this->assertEquals( $udt_arr[$date_epoch][0]['end_time_stamp'], strtotime( $date_stamp . ' 6:30PM' ) );
		$this->assertEquals( 0, $udt_arr[$date_epoch][0]['hourly_rate'] );

		//Regular Time
		$this->assertEquals( 20, $udt_arr[$date_epoch][1]['object_type_id'] );                              //Regular Time
		$this->assertEquals( $udt_arr[$date_epoch][1]['pay_code_id'], $this->policy_ids['pay_code'][100] ); //Regular Time
		$this->assertEquals( $udt_arr[$date_epoch][1]['total_time'], ( 8 * 3600 ) );
		$this->assertEquals( $udt_arr[$date_epoch][1]['start_time_stamp'], strtotime( $date_stamp . ' 8:00AM' ) );
		$this->assertEquals( $udt_arr[$date_epoch][1]['end_time_stamp'], strtotime( $date_stamp . ' 4:00PM' ) );
		$this->assertEquals( $udt_arr[$date_epoch][1]['hourly_rate'], ( 1 * 21.50 ) );

		////Overtime 1(a) -- This was compacted out with compactUserDateTotalDataBasedOnTimeStamps()
		//$this->assertEquals( 30, $udt_arr[$date_epoch][2]['object_type_id'] );                              //OverTime
		//$this->assertEquals( $udt_arr[$date_epoch][2]['pay_code_id'], $policy_ids['pay_code'][0] );
		//$this->assertEquals( $udt_arr[$date_epoch][2]['total_time'], ( 1 * 3600 ) );
		//$this->assertEquals( $udt_arr[$date_epoch][2]['start_time_stamp'], strtotime( $date_stamp . ' 4:00PM' ) );
		//$this->assertEquals( $udt_arr[$date_epoch][2]['end_time_stamp'], strtotime( $date_stamp . ' 5:00PM' ) );
		//$this->assertEquals( $udt_arr[$date_epoch][2]['hourly_rate'], ( 1.0 * 21.50 ) );
		////Overtime 1 -- This was compacted out with compactUserDateTotalDataBasedOnTimeStamps()
		//$this->assertEquals( 30, $udt_arr[$date_epoch][3]['object_type_id'] );                              //OverTime
		//$this->assertEquals( $udt_arr[$date_epoch][3]['pay_code_id'], $policy_ids['pay_code'][0] );
		//$this->assertEquals( $udt_arr[$date_epoch][3]['total_time'], ( 1.5 * 3600 ) );
		//$this->assertEquals( $udt_arr[$date_epoch][3]['start_time_stamp'], strtotime( $date_stamp . ' 5:00PM' ) );
		//$this->assertEquals( $udt_arr[$date_epoch][3]['end_time_stamp'], strtotime( $date_stamp . ' 6:30PM' ) );
		//$this->assertEquals( $udt_arr[$date_epoch][3]['hourly_rate'], ( 1.0 * 21.50 ) );

		//Overtime 1 -- This was compacted out with compactUserDateTotalDataBasedOnTimeStamps()
		$this->assertEquals( 30, $udt_arr[$date_epoch][2]['object_type_id'] );                              //OverTime
		$this->assertEquals( $udt_arr[$date_epoch][2]['pay_code_id'], $policy_ids['pay_code'][0] );
		$this->assertEquals( $udt_arr[$date_epoch][2]['total_time'], ( 2.5 * 3600 ) );
		$this->assertEquals( $udt_arr[$date_epoch][2]['start_time_stamp'], strtotime( $date_stamp . ' 4:00PM' ) );
		$this->assertEquals( $udt_arr[$date_epoch][2]['end_time_stamp'], strtotime( $date_stamp . ' 6:30PM' ) );
		$this->assertEquals( $udt_arr[$date_epoch][2]['hourly_rate'], ( 1.0 * 21.50 ) );

		//Make sure no other hours
		$this->assertCount( 3, $udt_arr[$date_epoch] );

		$this->assertEquals( $this->getCurrentAccrualBalance( $this->user_id, $this->policy_ids['accrual_policy_account'][10] ), ( -2.5 * 3600 ) );

		return true;
	}


	/**
	 * @group OvertimePolicy_testDailyOverTimeWithAbsencePolicyA
	 */
	function testDailyOverTimeWithAbsencePolicyA() {
		//Test handling daily OT with absences and the Start/End timestamps for each UDT record.
		global $dd;

		$policy_ids['pay_formula_policy'][] = $this->createPayFormulaPolicy( $this->company_id, 200 ); //OT1.5
		$policy_ids['pay_formula_policy'][] = $this->createPayFormulaPolicy( $this->company_id, 210 ); //OT2.0
		$policy_ids['pay_formula_policy'][] = $this->createPayFormulaPolicy( $this->company_id, 220 ); //OT2.5

		$policy_ids['pay_code'][] = $this->createPayCode( $this->company_id, 100, $policy_ids['pay_formula_policy'][0] );
		$policy_ids['pay_code'][] = $this->createPayCode( $this->company_id, 110, $policy_ids['pay_formula_policy'][1] );
		$policy_ids['pay_code'][] = $this->createPayCode( $this->company_id, 120, $policy_ids['pay_formula_policy'][2] );

		$policy_ids['overtime'][] = $this->createOverTimePolicy( $this->company_id, 100, $this->policy_ids['contributing_shift_policy'][14], $policy_ids['pay_code'][0] );
		$policy_ids['overtime'][] = $this->createOverTimePolicy( $this->company_id, 110, $this->policy_ids['contributing_shift_policy'][14], $policy_ids['pay_code'][1] );
		$policy_ids['overtime'][] = $this->createOverTimePolicy( $this->company_id, 120, $this->policy_ids['contributing_shift_policy'][14], $policy_ids['pay_code'][2] );

		//Create Policy Group
		$dd->createPolicyGroup( $this->company_id,
								null, //Meal
								null, //Exception
								null, //Holiday
								$policy_ids['overtime'], //OT
								null, //Premium
								null, //Round
								[ $this->user_id ], //Users
								null, //Break
								null, //Accrual
								null, //Expense
								[ $this->policy_ids['absence'][10] ], //Absence
								[ $this->policy_ids['regular'][12] ] //Regular
		);


		$date_epoch = TTDate::getMiddleDayEpoch( TTDate::getBeginWeekEpoch( time(), 1 ) );                  //Start on Monday to avoid DST issues on Sunday morning.
		$date_stamp = TTDate::getDate( 'DATE', $date_epoch );

		$dd->createPunchPair( $this->user_id,
							  strtotime( $date_stamp . ' 8:00AM' ),
							  strtotime( $date_stamp . ' 8:00PM' ),
							  [
									  'in_type_id'    => 10,
									  'out_type_id'   => 10,
									  'branch_id'     => 0,
									  'department_id' => 0,
									  'job_id'        => 0,
									  'job_item_id'   => 0,
									  'punch_tag_id'  => []
							  ],
							  true
		);

		$this->assertEquals( $this->getCurrentAccrualBalance( $this->user_id, $this->policy_ids['accrual_policy_account'][10] ), ( 0 * 3600 ) );

		$absence_id = $dd->createAbsence( $this->user_id, $date_epoch, ( 4 * 3600 ), $this->policy_ids['absence'][10] );
		$this->assertEquals( $this->getCurrentAccrualBalance( $this->user_id, $this->policy_ids['accrual_policy_account'][10] ), ( -4 * 3600 ) );

		$udt_arr = $this->getUserDateTotalArray( $date_epoch, $date_epoch );
		//print_r($udt_arr);

		//Total Time
		$this->assertEquals( 5, $udt_arr[$date_epoch][0]['object_type_id'] );                               //5=System Total
		$this->assertEquals( $udt_arr[$date_epoch][0]['pay_code_id'], TTUUID::getZeroID() );
		$this->assertEquals( $udt_arr[$date_epoch][0]['total_time'], ( 16 * 3600 ) );
		$this->assertEquals( $udt_arr[$date_epoch][0]['start_time_stamp'], strtotime( $date_stamp . ' 4:00AM' ) );
		$this->assertEquals( $udt_arr[$date_epoch][0]['end_time_stamp'], strtotime( $date_stamp . ' 8:00PM' ) );
		$this->assertEquals( 0, $udt_arr[$date_epoch][0]['hourly_rate'] );
		//Regular Time
		$this->assertEquals( 20, $udt_arr[$date_epoch][1]['object_type_id'] );                              //Regular Time
		$this->assertEquals( $udt_arr[$date_epoch][1]['pay_code_id'], $this->policy_ids['pay_code'][100] ); //Regular Time
		$this->assertEquals( $udt_arr[$date_epoch][1]['total_time'], ( 4 * 3600 ) );
		$this->assertEquals( $udt_arr[$date_epoch][1]['start_time_stamp'], strtotime( $date_stamp . ' 8:00AM' ) );
		$this->assertEquals( $udt_arr[$date_epoch][1]['end_time_stamp'], strtotime( $date_stamp . ' 12:00PM' ) );
		$this->assertEquals( $udt_arr[$date_epoch][1]['hourly_rate'], ( 1 * 21.50 ) );
		//Absence Time
		$this->assertEquals( 25, $udt_arr[$date_epoch][2]['object_type_id'] );                              //Absence Time
		$this->assertEquals( $udt_arr[$date_epoch][2]['pay_code_id'], $this->policy_ids['pay_code'][900] ); //Absence Time
		$this->assertEquals( $udt_arr[$date_epoch][2]['total_time'], ( 4 * 3600 ) );
		$this->assertEquals( $udt_arr[$date_epoch][2]['start_time_stamp'], strtotime( $date_stamp . ' 4:00AM' ) );
		$this->assertEquals( $udt_arr[$date_epoch][2]['end_time_stamp'], strtotime( $date_stamp . ' 8:00AM' ) );
		$this->assertEquals( $udt_arr[$date_epoch][2]['hourly_rate'], ( 1 * 21.50 ) );

		//Overtime 1
		$this->assertEquals( 30, $udt_arr[$date_epoch][5]['object_type_id'] );                              //OverTime
		$this->assertEquals( $udt_arr[$date_epoch][5]['pay_code_id'], $policy_ids['pay_code'][0] );
		$this->assertEquals( $udt_arr[$date_epoch][5]['total_time'], ( 1 * 3600 ) );
		$this->assertEquals( $udt_arr[$date_epoch][5]['start_time_stamp'], strtotime( $date_stamp . ' 12:00PM' ) );
		$this->assertEquals( $udt_arr[$date_epoch][5]['end_time_stamp'], strtotime( $date_stamp . ' 1:00PM' ) );
		$this->assertEquals( $udt_arr[$date_epoch][5]['hourly_rate'], ( 1.5 * 21.50 ) );
		//Overtime 2
		$this->assertEquals( 30, $udt_arr[$date_epoch][4]['object_type_id'] );                              //OverTime
		$this->assertEquals( $udt_arr[$date_epoch][4]['pay_code_id'], $policy_ids['pay_code'][1] );
		$this->assertEquals( $udt_arr[$date_epoch][4]['total_time'], ( 1 * 3600 ) );
		$this->assertEquals( $udt_arr[$date_epoch][4]['start_time_stamp'], strtotime( $date_stamp . ' 1:00PM' ) );
		$this->assertEquals( $udt_arr[$date_epoch][4]['end_time_stamp'], strtotime( $date_stamp . ' 2:00PM' ) );
		$this->assertEquals( $udt_arr[$date_epoch][4]['hourly_rate'], ( 2.0 * 21.50 ) );
		//Overtime 3
		$this->assertEquals( 30, $udt_arr[$date_epoch][3]['object_type_id'] );                              //OverTime
		$this->assertEquals( $udt_arr[$date_epoch][3]['pay_code_id'], $policy_ids['pay_code'][2] );
		$this->assertEquals( $udt_arr[$date_epoch][3]['total_time'], ( 6 * 3600 ) );
		$this->assertEquals( $udt_arr[$date_epoch][3]['start_time_stamp'], strtotime( $date_stamp . ' 2:00PM' ) );
		$this->assertEquals( $udt_arr[$date_epoch][3]['end_time_stamp'], strtotime( $date_stamp . ' 8:00PM' ) );
		$this->assertEquals( $udt_arr[$date_epoch][3]['hourly_rate'], ( 2.5 * 21.50 ) );

		//Make sure no other hours
		$this->assertCount( 6, $udt_arr[$date_epoch] );

		$this->assertEquals( $this->getCurrentAccrualBalance( $this->user_id, $this->policy_ids['accrual_policy_account'][10] ), ( -4 * 3600 ) );

		//Delete absence in the middle of the week and confirm balance is still correct.
		$dd->deleteAbsence( $absence_id );
		$this->assertEquals( $this->getCurrentAccrualBalance( $this->user_id, $this->policy_ids['accrual_policy_account'][10] ), ( 0 * 3600 ) );

		return true;
	}

	/**
	 * @group OvertimePolicy_testDailyOverTimeWithAbsencePolicyA2
	 */
	function testDailyOverTimeWithAbsencePolicyA2() {
		//Test handling daily OT with absences from a schedule where the punches and absence times overlap.
		global $dd;

		$policy_ids['pay_formula_policy'][] = $this->createPayFormulaPolicy( $this->company_id, 200 ); //OT1.5
		$policy_ids['pay_formula_policy'][] = $this->createPayFormulaPolicy( $this->company_id, 210 ); //OT2.0
		$policy_ids['pay_formula_policy'][] = $this->createPayFormulaPolicy( $this->company_id, 220 ); //OT2.5

		$policy_ids['pay_code'][] = $this->createPayCode( $this->company_id, 100, $policy_ids['pay_formula_policy'][0] );
		$policy_ids['pay_code'][] = $this->createPayCode( $this->company_id, 110, $policy_ids['pay_formula_policy'][1] );
		$policy_ids['pay_code'][] = $this->createPayCode( $this->company_id, 120, $policy_ids['pay_formula_policy'][2] );

		$policy_ids['overtime'][] = $this->createOverTimePolicy( $this->company_id, 100, $this->policy_ids['contributing_shift_policy'][14], $policy_ids['pay_code'][0] );
		//$policy_ids['overtime'][] = $this->createOverTimePolicy( $this->company_id, 110, $this->policy_ids['contributing_shift_policy'][14], $policy_ids['pay_code'][1] );
		//$policy_ids['overtime'][] = $this->createOverTimePolicy( $this->company_id, 120, $this->policy_ids['contributing_shift_policy'][14], $policy_ids['pay_code'][2] );

		//Create Policy Group
		$dd->createPolicyGroup( $this->company_id,
								null, //Meal
								null, //Exception
								null, //Holiday
								$policy_ids['overtime'], //OT
								null, //Premium
								null, //Round
								[ $this->user_id ], //Users
								null, //Break
								null, //Accrual
								null, //Expense
								[ $this->policy_ids['absence'][10] ], //Absence
								[ $this->policy_ids['regular'][12] ] //Regular
		);


		$date_epoch = TTDate::getMiddleDayEpoch( TTDate::getBeginWeekEpoch( time(), 1 ) );                  //Start on Monday to avoid DST issues on Sunday morning.
		$date_stamp = TTDate::getDate( 'DATE', $date_epoch );

		$dd->createPunchPair( $this->user_id,
							  strtotime( $date_stamp . ' 8:00AM' ),
							  strtotime( $date_stamp . ' 2:00PM' ),
							  [
									  'in_type_id'    => 10,
									  'out_type_id'   => 10,
									  'branch_id'     => 0,
									  'department_id' => 0,
									  'job_id'        => 0,
									  'job_item_id'   => 0,
									  'punch_tag_id'  => []
							  ],
							  true
		);

		$schedule_id = $this->createSchedule( $this->user_id, $date_epoch, [
				'status_id'          => 20, //Absence
				'absence_policy_id'  => $this->policy_ids['absence'][10],
				'schedule_policy_id' => TTUUID::getZeroID(),
				'start_time'         => '8:00AM',
				'end_time'           => '2:00PM',
		] );

		$udt_arr = $this->getUserDateTotalArray( $date_epoch, $date_epoch );
		//print_r($udt_arr);

		//Total Time
		$this->assertEquals( 5, $udt_arr[$date_epoch][0]['object_type_id'] );                               //5=System Total
		$this->assertEquals( $udt_arr[$date_epoch][0]['pay_code_id'], TTUUID::getZeroID() );
		$this->assertEquals( $udt_arr[$date_epoch][0]['total_time'], ( 12 * 3600 ) );
		$this->assertEquals( $udt_arr[$date_epoch][0]['start_time_stamp'], strtotime( $date_stamp . ' 2:00AM' ) ); //Since absence and punches overlap, the absence time gets moved to before the punches.
		$this->assertEquals( $udt_arr[$date_epoch][0]['end_time_stamp'], strtotime( $date_stamp . ' 2:00PM' ) );
		$this->assertEquals( 0, $udt_arr[$date_epoch][0]['hourly_rate'] );
		//Regular Time
		$this->assertEquals( 20, $udt_arr[$date_epoch][1]['object_type_id'] );                              //Regular Time
		$this->assertEquals( $udt_arr[$date_epoch][1]['pay_code_id'], $this->policy_ids['pay_code'][100] ); //Regular Time
		$this->assertEquals( $udt_arr[$date_epoch][1]['total_time'], ( 2 * 3600 ) );
		$this->assertEquals( $udt_arr[$date_epoch][1]['start_time_stamp'], strtotime( $date_stamp . ' 8:00AM' ) );
		$this->assertEquals( $udt_arr[$date_epoch][1]['end_time_stamp'], strtotime( $date_stamp . ' 10:00AM' ) );
		$this->assertEquals( $udt_arr[$date_epoch][1]['hourly_rate'], ( 1 * 21.50 ) );
		//Absence Time
		$this->assertEquals( 25, $udt_arr[$date_epoch][2]['object_type_id'] );                              //Absence Time
		$this->assertEquals( $udt_arr[$date_epoch][2]['pay_code_id'], $this->policy_ids['pay_code'][900] ); //Absence Time
		$this->assertEquals( $udt_arr[$date_epoch][2]['total_time'], ( 6 * 3600 ) );
		$this->assertEquals( $udt_arr[$date_epoch][2]['start_time_stamp'], strtotime( $date_stamp . ' 2:00AM' ) ); //Since absence and punches overlap, the absence time gets moved to before the punches.
		$this->assertEquals( $udt_arr[$date_epoch][2]['end_time_stamp'], strtotime( $date_stamp . ' 8:00AM' ) );
		$this->assertEquals( $udt_arr[$date_epoch][2]['hourly_rate'], ( 1 * 21.50 ) );

		//Overtime 1
		$this->assertEquals( 30, $udt_arr[$date_epoch][3]['object_type_id'] );                              //OverTime
		$this->assertEquals( $udt_arr[$date_epoch][3]['pay_code_id'], $policy_ids['pay_code'][0] );
		$this->assertEquals( $udt_arr[$date_epoch][3]['total_time'], ( 4 * 3600 ) );
		$this->assertEquals( $udt_arr[$date_epoch][3]['start_time_stamp'], strtotime( $date_stamp . ' 10:00AM' ) );
		$this->assertEquals( $udt_arr[$date_epoch][3]['end_time_stamp'], strtotime( $date_stamp . ' 2:00PM' ) );
		$this->assertEquals( $udt_arr[$date_epoch][3]['hourly_rate'], ( 1.5 * 21.50 ) );

		//Make sure no other hours
		$this->assertCount( 4, $udt_arr[$date_epoch] );

		return true;
	}

	/**
	 * @group OvertimePolicy_testDailyOverTimeWithAbsencePolicyB
	 */
	function testDailyOverTimeWithAbsencePolicyB() {
		//Test handling OT that goes to a Time Bank along with Absences.
		global $dd;

		$policy_ids['pay_formula_policy'][] = $this->createPayFormulaPolicy( $this->company_id, 200 ); //OT1.5
		$policy_ids['pay_formula_policy'][] = $this->createPayFormulaPolicy( $this->company_id, 210 ); //OT2.0
		$policy_ids['pay_formula_policy'][] = $this->createPayFormulaPolicy( $this->company_id, 220 ); //OT2.5

		//$this->policy_ids['pay_code'][900]
		//$policy_ids['pay_code'][]  = $this->createPayCode( $this->company_id, 100, $policy_ids['pay_formula_policy'][0] );
		$policy_ids['pay_code'][] = $this->createPayCode( $this->company_id, 100, $this->policy_ids['pay_formula_policy'][910] );
		$policy_ids['pay_code'][] = $this->createPayCode( $this->company_id, 110, $policy_ids['pay_formula_policy'][1] );
		$policy_ids['pay_code'][] = $this->createPayCode( $this->company_id, 120, $policy_ids['pay_formula_policy'][2] );

		$policy_ids['overtime'][] = $this->createOverTimePolicy( $this->company_id, 100, $this->policy_ids['contributing_shift_policy'][14], $policy_ids['pay_code'][0] );
		$policy_ids['overtime'][] = $this->createOverTimePolicy( $this->company_id, 110, $this->policy_ids['contributing_shift_policy'][14], $policy_ids['pay_code'][1] );
		$policy_ids['overtime'][] = $this->createOverTimePolicy( $this->company_id, 120, $this->policy_ids['contributing_shift_policy'][14], $policy_ids['pay_code'][2] );

		//Create Policy Group
		$dd->createPolicyGroup( $this->company_id,
								null, //Meal
								null, //Exception
								null, //Holiday
								$policy_ids['overtime'], //OT
								null, //Premium
								null, //Round
								[ $this->user_id ], //Users
								null, //Break
								null, //Accrual
								null, //Expense
								[ $this->policy_ids['absence'][10] ], //Absence
								[ $this->policy_ids['regular'][12] ] //Regular
		);


		$date_epoch = TTDate::getMiddleDayEpoch( TTDate::getBeginWeekEpoch( time(), 1 ) );                  //Start on Monday to avoid DST issues on Sunday morning.
		$date_stamp = TTDate::getDate( 'DATE', $date_epoch );

		$dd->createPunchPair( $this->user_id,
							  strtotime( $date_stamp . ' 8:00AM' ),
							  strtotime( $date_stamp . ' 8:00PM' ),
							  [
									  'in_type_id'    => 10,
									  'out_type_id'   => 10,
									  'branch_id'     => 0,
									  'department_id' => 0,
									  'job_id'        => 0,
									  'job_item_id'   => 0,
									  'punch_tag_id'  => []
							  ],
							  true
		);

		$this->assertEquals( $this->getCurrentAccrualBalance( $this->user_id, $this->policy_ids['accrual_policy_account'][10] ), ( -1 * 3600 ) );

		$absence_id = $dd->createAbsence( $this->user_id, $date_epoch, ( 4 * 3600 ), $this->policy_ids['absence'][10] );
		$this->assertEquals( $this->getCurrentAccrualBalance( $this->user_id, $this->policy_ids['accrual_policy_account'][10] ), ( -5 * 3600 ) );

		$udt_arr = $this->getUserDateTotalArray( $date_epoch, $date_epoch );
		//print_r($udt_arr);

		//Total Time
		$this->assertEquals( 5, $udt_arr[$date_epoch][0]['object_type_id'] );                               //5=System Total
		$this->assertEquals( $udt_arr[$date_epoch][0]['pay_code_id'], TTUUID::getZeroID() );
		$this->assertEquals( $udt_arr[$date_epoch][0]['total_time'], ( 16 * 3600 ) );
		$this->assertEquals( $udt_arr[$date_epoch][0]['start_time_stamp'], strtotime( $date_stamp . ' 4:00AM' ) );
		$this->assertEquals( $udt_arr[$date_epoch][0]['end_time_stamp'], strtotime( $date_stamp . ' 8:00PM' ) );
		$this->assertEquals( 0, $udt_arr[$date_epoch][0]['hourly_rate'] );
		//Regular Time
		$this->assertEquals( 20, $udt_arr[$date_epoch][1]['object_type_id'] );                              //Regular Time
		$this->assertEquals( $udt_arr[$date_epoch][1]['pay_code_id'], $this->policy_ids['pay_code'][100] ); //Regular Time
		$this->assertEquals( $udt_arr[$date_epoch][1]['total_time'], ( 4 * 3600 ) );
		$this->assertEquals( $udt_arr[$date_epoch][1]['start_time_stamp'], strtotime( $date_stamp . ' 8:00AM' ) );
		$this->assertEquals( $udt_arr[$date_epoch][1]['end_time_stamp'], strtotime( $date_stamp . ' 12:00PM' ) );
		$this->assertEquals( $udt_arr[$date_epoch][1]['hourly_rate'], ( 1 * 21.50 ) );
		//Absence Time
		$this->assertEquals( 25, $udt_arr[$date_epoch][2]['object_type_id'] );                              //Absence Time
		$this->assertEquals( $udt_arr[$date_epoch][2]['pay_code_id'], $this->policy_ids['pay_code'][900] ); //Absence Time
		$this->assertEquals( $udt_arr[$date_epoch][2]['total_time'], ( 4 * 3600 ) );
		$this->assertEquals( $udt_arr[$date_epoch][2]['start_time_stamp'], strtotime( $date_stamp . ' 4:00AM' ) );
		$this->assertEquals( $udt_arr[$date_epoch][2]['end_time_stamp'], strtotime( $date_stamp . ' 8:00AM' ) );
		$this->assertEquals( $udt_arr[$date_epoch][2]['hourly_rate'], ( 1 * 21.50 ) );

		//Overtime 1
		$this->assertEquals( 30, $udt_arr[$date_epoch][5]['object_type_id'] );                              //OverTime
		$this->assertEquals( $udt_arr[$date_epoch][5]['pay_code_id'], $policy_ids['pay_code'][0] );
		$this->assertEquals( $udt_arr[$date_epoch][5]['total_time'], ( 1 * 3600 ) );
		$this->assertEquals( $udt_arr[$date_epoch][5]['start_time_stamp'], strtotime( $date_stamp . ' 12:00PM' ) );
		$this->assertEquals( $udt_arr[$date_epoch][5]['end_time_stamp'], strtotime( $date_stamp . ' 1:00PM' ) );
		$this->assertEquals( $udt_arr[$date_epoch][5]['hourly_rate'], ( 1.0 * 21.50 ) );
		//Overtime 2
		$this->assertEquals( 30, $udt_arr[$date_epoch][4]['object_type_id'] );                              //OverTime
		$this->assertEquals( $udt_arr[$date_epoch][4]['pay_code_id'], $policy_ids['pay_code'][1] );
		$this->assertEquals( $udt_arr[$date_epoch][4]['total_time'], ( 1 * 3600 ) );
		$this->assertEquals( $udt_arr[$date_epoch][4]['start_time_stamp'], strtotime( $date_stamp . ' 1:00PM' ) );
		$this->assertEquals( $udt_arr[$date_epoch][4]['end_time_stamp'], strtotime( $date_stamp . ' 2:00PM' ) );
		$this->assertEquals( $udt_arr[$date_epoch][4]['hourly_rate'], ( 2.0 * 21.50 ) );
		//Overtime 3
		$this->assertEquals( 30, $udt_arr[$date_epoch][3]['object_type_id'] );                              //OverTime
		$this->assertEquals( $udt_arr[$date_epoch][3]['pay_code_id'], $policy_ids['pay_code'][2] );
		$this->assertEquals( $udt_arr[$date_epoch][3]['total_time'], ( 6 * 3600 ) );
		$this->assertEquals( $udt_arr[$date_epoch][3]['start_time_stamp'], strtotime( $date_stamp . ' 2:00PM' ) );
		$this->assertEquals( $udt_arr[$date_epoch][3]['end_time_stamp'], strtotime( $date_stamp . ' 8:00PM' ) );
		$this->assertEquals( $udt_arr[$date_epoch][3]['hourly_rate'], ( 2.5 * 21.50 ) );

		//Make sure no other hours
		$this->assertCount( 6, $udt_arr[$date_epoch] );

		$this->assertEquals( $this->getCurrentAccrualBalance( $this->user_id, $this->policy_ids['accrual_policy_account'][10] ), ( -5 * 3600 ) );

		//Delete absence in the middle of the week and confirm balance is still correct.
		$dd->deleteAbsence( $absence_id );
		$this->assertEquals( $this->getCurrentAccrualBalance( $this->user_id, $this->policy_ids['accrual_policy_account'][10] ), ( -1 * 3600 ) );

		return true;
	}

	/**
	 * @group OvertimePolicy_testDailyOverTimeWithAbsencePolicyC
	 */
	function testDailyOverTimeWithAbsencePolicyC() {
		//Test handling daily OT with absences and the Start/End timestamps for each UDT record.
		global $dd;

		$policy_ids['pay_formula_policy'][] = $this->createPayFormulaPolicy( $this->company_id, 200 ); //OT1.5
		$policy_ids['pay_formula_policy'][] = $this->createPayFormulaPolicy( $this->company_id, 210 ); //OT2.0
		$policy_ids['pay_formula_policy'][] = $this->createPayFormulaPolicy( $this->company_id, 220 ); //OT2.5

		$policy_ids['pay_code'][] = $this->createPayCode( $this->company_id, 100, $policy_ids['pay_formula_policy'][0] );
		$policy_ids['pay_code'][] = $this->createPayCode( $this->company_id, 110, $policy_ids['pay_formula_policy'][1] );
		$policy_ids['pay_code'][] = $this->createPayCode( $this->company_id, 120, $policy_ids['pay_formula_policy'][2] );

		$policy_ids['overtime'][] = $this->createOverTimePolicy( $this->company_id, 100, $this->policy_ids['contributing_shift_policy'][14], $policy_ids['pay_code'][0] );
		$policy_ids['overtime'][] = $this->createOverTimePolicy( $this->company_id, 110, $this->policy_ids['contributing_shift_policy'][14], $policy_ids['pay_code'][1] );
		$policy_ids['overtime'][] = $this->createOverTimePolicy( $this->company_id, 120, $this->policy_ids['contributing_shift_policy'][14], $policy_ids['pay_code'][2] );

		//Create Policy Group
		$dd->createPolicyGroup( $this->company_id,
								null, //Meal
								null, //Exception
								null, //Holiday
								$policy_ids['overtime'], //OT
								null, //Premium
								null, //Round
								[ $this->user_id ], //Users
								null, //Break
								null, //Accrual
								null, //Expense
								[ $this->policy_ids['absence'][10] ], //Absence
								[ $this->policy_ids['regular'][12] ] //Regular
		);


		$date_epoch = TTDate::getMiddleDayEpoch( TTDate::getBeginWeekEpoch( time(), 1 ) );                  //Start on Monday to avoid DST issues on Sunday morning.
		$date_stamp = TTDate::getDate( 'DATE', $date_epoch );

		$this->assertEquals( $this->getCurrentAccrualBalance( $this->user_id, $this->policy_ids['accrual_policy_account'][10] ), ( 0 * 3600 ) );

		$absence_id = $dd->createAbsence( $this->user_id, $date_epoch, ( 12 * 3600 ), $this->policy_ids['absence'][10] );
		$this->assertEquals( $this->getCurrentAccrualBalance( $this->user_id, $this->policy_ids['accrual_policy_account'][10] ), ( -12 * 3600 ) );

		$udt_arr = $this->getUserDateTotalArray( $date_epoch, $date_epoch );
		//print_r($udt_arr);

		//Total Time
		$this->assertEquals( 5, $udt_arr[$date_epoch][0]['object_type_id'] );                               //5=System Total
		$this->assertEquals( $udt_arr[$date_epoch][0]['pay_code_id'], TTUUID::getZeroID() );
		$this->assertEquals( $udt_arr[$date_epoch][0]['total_time'], ( 12 * 3600 ) );
		//$this->assertEquals( $udt_arr[$date_epoch][0]['start_time_stamp'], 	strtotime($date_stamp.' 8:00AM') );
		//$this->assertEquals( $udt_arr[$date_epoch][0]['end_time_stamp'], 	strtotime($date_stamp.' 8:00PM') );
		$this->assertEquals( 0, $udt_arr[$date_epoch][0]['hourly_rate'] );

		//Absence Time
		$this->assertEquals( 25, $udt_arr[$date_epoch][1]['object_type_id'] );                              //Absence Time
		$this->assertEquals( $udt_arr[$date_epoch][1]['pay_code_id'], $this->policy_ids['pay_code'][900] ); //Absence Time
		$this->assertEquals( $udt_arr[$date_epoch][1]['total_time'], ( 8 * 3600 ) );
		$this->assertEquals( $udt_arr[$date_epoch][1]['start_time_stamp'], strtotime( $date_stamp . ' 12:00AM' ) );
		$this->assertEquals( $udt_arr[$date_epoch][1]['end_time_stamp'], strtotime( $date_stamp . ' 8:00AM' ) );
		$this->assertEquals( $udt_arr[$date_epoch][1]['hourly_rate'], ( 1 * 21.50 ) );

		//Overtime 1
		$this->assertEquals( 30, $udt_arr[$date_epoch][4]['object_type_id'] );                              //OverTime
		$this->assertEquals( $udt_arr[$date_epoch][4]['pay_code_id'], $policy_ids['pay_code'][0] );
		$this->assertEquals( $udt_arr[$date_epoch][4]['total_time'], ( 1 * 3600 ) );
		$this->assertEquals( $udt_arr[$date_epoch][4]['start_time_stamp'], strtotime( $date_stamp . ' 8:00AM' ) );
		$this->assertEquals( $udt_arr[$date_epoch][4]['end_time_stamp'], strtotime( $date_stamp . ' 9:00AM' ) );
		$this->assertEquals( $udt_arr[$date_epoch][4]['hourly_rate'], ( 1.5 * 21.50 ) );
		//Overtime 2
		$this->assertEquals( 30, $udt_arr[$date_epoch][3]['object_type_id'] );                              //OverTime
		$this->assertEquals( $udt_arr[$date_epoch][3]['pay_code_id'], $policy_ids['pay_code'][1] );
		$this->assertEquals( $udt_arr[$date_epoch][3]['total_time'], ( 1 * 3600 ) );
		$this->assertEquals( $udt_arr[$date_epoch][3]['start_time_stamp'], strtotime( $date_stamp . ' 9:00AM' ) );
		$this->assertEquals( $udt_arr[$date_epoch][3]['end_time_stamp'], strtotime( $date_stamp . ' 10:00AM' ) );
		$this->assertEquals( $udt_arr[$date_epoch][3]['hourly_rate'], ( 2.0 * 21.50 ) );
		//Overtime 3
		$this->assertEquals( 30, $udt_arr[$date_epoch][2]['object_type_id'] );                              //OverTime
		$this->assertEquals( $udt_arr[$date_epoch][2]['pay_code_id'], $policy_ids['pay_code'][2] );
		$this->assertEquals( $udt_arr[$date_epoch][2]['total_time'], ( 2 * 3600 ) );
		$this->assertEquals( $udt_arr[$date_epoch][2]['start_time_stamp'], strtotime( $date_stamp . ' 10:00AM' ) );
		$this->assertEquals( $udt_arr[$date_epoch][2]['end_time_stamp'], strtotime( $date_stamp . ' 12:00PM' ) );
		$this->assertEquals( $udt_arr[$date_epoch][2]['hourly_rate'], ( 2.5 * 21.50 ) );

		//Make sure no other hours
		$this->assertCount( 5, $udt_arr[$date_epoch] );

		$this->assertEquals( $this->getCurrentAccrualBalance( $this->user_id, $this->policy_ids['accrual_policy_account'][10] ), ( -12 * 3600 ) );

		//Delete absence in the middle of the week and confirm balance is still correct.
		$dd->deleteAbsence( $absence_id );
		$this->assertEquals( $this->getCurrentAccrualBalance( $this->user_id, $this->policy_ids['accrual_policy_account'][10] ), ( 0 * 3600 ) );

		return true;
	}

	/**
	 * @group OvertimePolicy_testDailyOverTimeWithAbsencePolicyC2
	 */
	function testDailyOverTimeWithAbsencePolicyC2() {
		//Test handling daily OT with absences and the Start/End timestamps for each UDT record.
		// **This is special in that the OT policies DEPOSIT to accrual accounts as well to minic
		//   the case where 12hr vacation is used, which triggers OT policy that is banked rather than paid.
		//   Essenially in this case the Vacation time is withdrawn part of it (regular time) is paid, and the rest is deposited (transferred) into the OT bank
		global $dd;

		$policy_ids['pay_formula_policy'][] = $this->createPayFormulaPolicy( $this->company_id, 200, $this->policy_ids['accrual_policy_account'][30] ); //OT1.5 -- Deposit to Accrual
		$policy_ids['pay_formula_policy'][] = $this->createPayFormulaPolicy( $this->company_id, 210, $this->policy_ids['accrual_policy_account'][30] ); //OT2.0 -- Deposit to Accrual
		$policy_ids['pay_formula_policy'][] = $this->createPayFormulaPolicy( $this->company_id, 220, $this->policy_ids['accrual_policy_account'][30] ); //OT2.5 -- Deposit to Accrual

		$policy_ids['pay_code'][] = $this->createPayCode( $this->company_id, 100, $policy_ids['pay_formula_policy'][0] );
		$policy_ids['pay_code'][] = $this->createPayCode( $this->company_id, 110, $policy_ids['pay_formula_policy'][1] );
		$policy_ids['pay_code'][] = $this->createPayCode( $this->company_id, 120, $policy_ids['pay_formula_policy'][2] );


		$policy_ids['overtime'][] = $this->createOverTimePolicy( $this->company_id, 100, $this->policy_ids['contributing_shift_policy'][14], $policy_ids['pay_code'][0] );
		$policy_ids['overtime'][] = $this->createOverTimePolicy( $this->company_id, 110, $this->policy_ids['contributing_shift_policy'][14], $policy_ids['pay_code'][1] );
		$policy_ids['overtime'][] = $this->createOverTimePolicy( $this->company_id, 120, $this->policy_ids['contributing_shift_policy'][14], $policy_ids['pay_code'][2] );

		//Create Policy Group
		$dd->createPolicyGroup( $this->company_id,
								null, //Meal
								null, //Exception
								null, //Holiday
								$policy_ids['overtime'], //OT
								null, //Premium
								null, //Round
								[ $this->user_id ], //Users
								null, //Break
								null, //Accrual
								null, //Expense
								[ $this->policy_ids['absence'][10] ], //Absence
								[ $this->policy_ids['regular'][12] ] //Regular
		);


		$date_epoch = TTDate::getMiddleDayEpoch( TTDate::getBeginWeekEpoch( time(), 1 ) );                  //Start on Monday to avoid DST issues on Sunday morning.
		$date_stamp = TTDate::getDate( 'DATE', $date_epoch );

		$this->assertEquals( $this->getCurrentAccrualBalance( $this->user_id, $this->policy_ids['accrual_policy_account'][10] ), ( 0 * 3600 ) );
		$this->assertEquals( $this->getCurrentAccrualBalance( $this->user_id, $this->policy_ids['accrual_policy_account'][30] ), ( 0 * 3600 ) );

		$absence_id = $dd->createAbsence( $this->user_id, $date_epoch, ( 12 * 3600 ), $this->policy_ids['absence'][10] );
		$this->assertEquals( $this->getCurrentAccrualBalance( $this->user_id, $this->policy_ids['accrual_policy_account'][10] ), ( -12 * 3600 ) );
		$this->assertEquals( $this->getCurrentAccrualBalance( $this->user_id, $this->policy_ids['accrual_policy_account'][30] ), ( 4 * 3600 ) );

		$udt_arr = $this->getUserDateTotalArray( $date_epoch, $date_epoch );
		//print_r($udt_arr);

		//Total Time
		$this->assertEquals( 5, $udt_arr[$date_epoch][0]['object_type_id'] );                               //5=System Total
		$this->assertEquals( $udt_arr[$date_epoch][0]['pay_code_id'], TTUUID::getZeroID() );
		$this->assertEquals( $udt_arr[$date_epoch][0]['total_time'], ( 12 * 3600 ) );
		//$this->assertEquals( $udt_arr[$date_epoch][0]['start_time_stamp'], 	strtotime($date_stamp.' 8:00AM') );
		//$this->assertEquals( $udt_arr[$date_epoch][0]['end_time_stamp'], 	strtotime($date_stamp.' 8:00PM') );
		$this->assertEquals( 0, $udt_arr[$date_epoch][0]['hourly_rate'] );

		//Absence Time
		$this->assertEquals( 25, $udt_arr[$date_epoch][1]['object_type_id'] );                              //Absence Time
		$this->assertEquals( $udt_arr[$date_epoch][1]['pay_code_id'], $this->policy_ids['pay_code'][900] ); //Absence Time
		$this->assertEquals( $udt_arr[$date_epoch][1]['total_time'], ( 8 * 3600 ) );
		$this->assertEquals( $udt_arr[$date_epoch][1]['start_time_stamp'], strtotime( $date_stamp . ' 12:00AM' ) );
		$this->assertEquals( $udt_arr[$date_epoch][1]['end_time_stamp'], strtotime( $date_stamp . ' 8:00AM' ) );
		$this->assertEquals( $udt_arr[$date_epoch][1]['hourly_rate'], ( 1 * 21.50 ) );

		//Overtime 1
		$this->assertEquals( 30, $udt_arr[$date_epoch][4]['object_type_id'] );                              //OverTime
		$this->assertEquals( $udt_arr[$date_epoch][4]['pay_code_id'], $policy_ids['pay_code'][0] );
		$this->assertEquals( $udt_arr[$date_epoch][4]['total_time'], ( 1 * 3600 ) );
		$this->assertEquals( $udt_arr[$date_epoch][4]['start_time_stamp'], strtotime( $date_stamp . ' 8:00AM' ) );
		$this->assertEquals( $udt_arr[$date_epoch][4]['end_time_stamp'], strtotime( $date_stamp . ' 9:00AM' ) );
		$this->assertEquals( $udt_arr[$date_epoch][4]['hourly_rate'], ( 1.5 * 21.50 ) );
		//Overtime 2
		$this->assertEquals( 30, $udt_arr[$date_epoch][3]['object_type_id'] );                              //OverTime
		$this->assertEquals( $udt_arr[$date_epoch][3]['pay_code_id'], $policy_ids['pay_code'][1] );
		$this->assertEquals( $udt_arr[$date_epoch][3]['total_time'], ( 1 * 3600 ) );
		$this->assertEquals( $udt_arr[$date_epoch][3]['start_time_stamp'], strtotime( $date_stamp . ' 9:00AM' ) );
		$this->assertEquals( $udt_arr[$date_epoch][3]['end_time_stamp'], strtotime( $date_stamp . ' 10:00AM' ) );
		$this->assertEquals( $udt_arr[$date_epoch][3]['hourly_rate'], ( 2.0 * 21.50 ) );
		//Overtime 3
		$this->assertEquals( 30, $udt_arr[$date_epoch][2]['object_type_id'] );                              //OverTime
		$this->assertEquals( $udt_arr[$date_epoch][2]['pay_code_id'], $policy_ids['pay_code'][2] );
		$this->assertEquals( $udt_arr[$date_epoch][2]['total_time'], ( 2 * 3600 ) );
		$this->assertEquals( $udt_arr[$date_epoch][2]['start_time_stamp'], strtotime( $date_stamp . ' 10:00AM' ) );
		$this->assertEquals( $udt_arr[$date_epoch][2]['end_time_stamp'], strtotime( $date_stamp . ' 12:00PM' ) );
		$this->assertEquals( $udt_arr[$date_epoch][2]['hourly_rate'], ( 2.5 * 21.50 ) );

		//Make sure no other hours
		$this->assertCount( 5, $udt_arr[$date_epoch] );

		$this->assertEquals( $this->getCurrentAccrualBalance( $this->user_id, $this->policy_ids['accrual_policy_account'][10] ), ( -12 * 3600 ) );
		$this->assertEquals( $this->getCurrentAccrualBalance( $this->user_id, $this->policy_ids['accrual_policy_account'][30] ), ( 4 * 3600 ) );

		//Delete absence in the middle of the week and confirm balance is still correct.
		$dd->deleteAbsence( $absence_id );
		$this->assertEquals( $this->getCurrentAccrualBalance( $this->user_id, $this->policy_ids['accrual_policy_account'][10] ), ( 0 * 3600 ) );
		$this->assertEquals( $this->getCurrentAccrualBalance( $this->user_id, $this->policy_ids['accrual_policy_account'][30] ), ( 0 * 3600 ) );

		return true;
	}

	/**
	 * @group OvertimePolicy_testDailyOverTimeWithAbsencePolicyD
	 */
	function testDailyOverTimeWithAbsencePolicyD() {
		//Test handling daily OT with absences and the Start/End timestamps for each UDT record.
		//Only have the absence record entered directly on the timesheet, so there are no start/end timestamps though.
		//and make sure the Absence policy uses Regular Time pay code so its included in OT.
		global $dd;

		$policy_ids['pay_formula_policy'][] = $this->createPayFormulaPolicy( $this->company_id, 200 ); //OT1.5
		$policy_ids['pay_formula_policy'][] = $this->createPayFormulaPolicy( $this->company_id, 210 ); //OT2.0
		$policy_ids['pay_formula_policy'][] = $this->createPayFormulaPolicy( $this->company_id, 220 ); //OT2.5

		$policy_ids['pay_code'][] = $this->createPayCode( $this->company_id, 100, $policy_ids['pay_formula_policy'][0] );
		$policy_ids['pay_code'][] = $this->createPayCode( $this->company_id, 110, $policy_ids['pay_formula_policy'][1] );
		$policy_ids['pay_code'][] = $this->createPayCode( $this->company_id, 120, $policy_ids['pay_formula_policy'][2] );

		$policy_ids['overtime'][] = $this->createOverTimePolicy( $this->company_id, 100, $this->policy_ids['contributing_shift_policy'][14], $policy_ids['pay_code'][0] );
		$policy_ids['overtime'][] = $this->createOverTimePolicy( $this->company_id, 110, $this->policy_ids['contributing_shift_policy'][14], $policy_ids['pay_code'][1] );
		$policy_ids['overtime'][] = $this->createOverTimePolicy( $this->company_id, 120, $this->policy_ids['contributing_shift_policy'][14], $policy_ids['pay_code'][2] );

		$policy_ids['absence'][] = $dd->createAbsencePolicy( $this->company_id, 30, $this->policy_ids['pay_code'][100] );

		//Create Policy Group
		$dd->createPolicyGroup( $this->company_id,
								null, //Meal
								null, //Exception
								null, //Holiday
								$policy_ids['overtime'], //OT
								null, //Premium
								null, //Round
								[ $this->user_id ], //Users
								null, //Break
								null, //Accrual
								null, //Expense
								$policy_ids['absence'], //Absence
								[ $this->policy_ids['regular'][12] ] //Regular
		);

		$date_epoch = TTDate::getMiddleDayEpoch( TTDate::getBeginWeekEpoch( time(), 1 ) );                  //Start on Monday to avoid DST issues on Sunday morning.
		$date_stamp = TTDate::getDate( 'DATE', $date_epoch );

		$this->assertEquals( $this->getCurrentAccrualBalance( $this->user_id, $this->policy_ids['accrual_policy_account'][10] ), ( 0 * 3600 ) );

		$absence_id = $dd->createAbsence( $this->user_id, $date_epoch, ( 7 * 3600 ), $policy_ids['absence'][0] );
		//$this->assertEquals( $this->getCurrentAccrualBalance( $this->user_id, $this->policy_ids['accrual_policy_account'][10] ), (-12 * 3600) );

		$udt_arr = $this->getUserDateTotalArray( $date_epoch, $date_epoch );
		//print_r($udt_arr);

		//Total Time
		$this->assertEquals( 5, $udt_arr[$date_epoch][0]['object_type_id'] );                               //5=System Total
		$this->assertEquals( $udt_arr[$date_epoch][0]['pay_code_id'], TTUUID::getZeroID() );
		$this->assertEquals( $udt_arr[$date_epoch][0]['total_time'], ( 7 * 3600 ) );
		//$this->assertEquals( $udt_arr[$date_epoch][0]['start_time_stamp'], 	strtotime($date_stamp.' 8:00AM') );
		//$this->assertEquals( $udt_arr[$date_epoch][0]['end_time_stamp'], 	strtotime($date_stamp.' 8:00PM') );
		$this->assertEquals( 0, $udt_arr[$date_epoch][0]['hourly_rate'] );

		//Absence Time
		$this->assertEquals( 20, $udt_arr[$date_epoch][1]['object_type_id'] );                              //Absence Time
		$this->assertEquals( $udt_arr[$date_epoch][1]['pay_code_id'], $this->policy_ids['pay_code'][100] ); //Absence Time
		$this->assertEquals( $udt_arr[$date_epoch][1]['total_time'], ( 7 * 3600 ) );
		$this->assertEquals( $udt_arr[$date_epoch][1]['start_time_stamp'], strtotime( $date_stamp . ' 12:00AM' ) );
		$this->assertEquals( $udt_arr[$date_epoch][1]['end_time_stamp'], strtotime( $date_stamp . ' 7:00AM' ) );
		$this->assertEquals( $udt_arr[$date_epoch][1]['hourly_rate'], ( 1 * 21.50 ) );

		//Make sure no other hours
		$this->assertCount( 2, $udt_arr[$date_epoch] );

		//$this->assertEquals( $this->getCurrentAccrualBalance( $this->user_id, $this->policy_ids['accrual_policy_account'][10] ), (-12 * 3600) );

		//Delete absence in the middle of the week and confirm balance is still correct.
		$dd->deleteAbsence( $absence_id );
		$this->assertEquals( $this->getCurrentAccrualBalance( $this->user_id, $this->policy_ids['accrual_policy_account'][10] ), ( 0 * 3600 ) );

		return true;
	}

	/**
	 * @group OvertimePolicy_testDailyOverTimeWithAbsencePolicyE
	 */
	function testDailyOverTimeWithAbsencePolicyE() {
		//Test handling daily OT with absences and the Start/End timestamps for each UDT record.
		//Only have the absence record entered directly on the timesheet, so there are no start/end timestamps though.
		//and make sure the Absence policy uses Regular Time pay code so its included in OT.
		global $dd;

		$policy_ids['pay_formula_policy'][] = $this->createPayFormulaPolicy( $this->company_id, 200 ); //OT1.5
		$policy_ids['pay_formula_policy'][] = $this->createPayFormulaPolicy( $this->company_id, 210 ); //OT2.0
		$policy_ids['pay_formula_policy'][] = $this->createPayFormulaPolicy( $this->company_id, 220 ); //OT2.5

		$policy_ids['pay_code'][] = $this->createPayCode( $this->company_id, 100, $policy_ids['pay_formula_policy'][0] );
		$policy_ids['pay_code'][] = $this->createPayCode( $this->company_id, 110, $policy_ids['pay_formula_policy'][1] );
		$policy_ids['pay_code'][] = $this->createPayCode( $this->company_id, 120, $policy_ids['pay_formula_policy'][2] );

		$policy_ids['overtime'][] = $this->createOverTimePolicy( $this->company_id, 100, $this->policy_ids['contributing_shift_policy'][14], $policy_ids['pay_code'][0] );
		$policy_ids['overtime'][] = $this->createOverTimePolicy( $this->company_id, 110, $this->policy_ids['contributing_shift_policy'][14], $policy_ids['pay_code'][1] );
		$policy_ids['overtime'][] = $this->createOverTimePolicy( $this->company_id, 120, $this->policy_ids['contributing_shift_policy'][14], $policy_ids['pay_code'][2] );

		$policy_ids['absence'][] = $dd->createAbsencePolicy( $this->company_id, 30, $this->policy_ids['pay_code'][100] );

		//Create Policy Group
		$dd->createPolicyGroup( $this->company_id,
								null, //Meal
								null, //Exception
								null, //Holiday
								$policy_ids['overtime'], //OT
								null, //Premium
								null, //Round
								[ $this->user_id ], //Users
								null, //Break
								null, //Accrual
								null, //Expense
								$policy_ids['absence'], //Absence
								[ $this->policy_ids['regular'][12] ] //Regular
		);

		$date_epoch = TTDate::getMiddleDayEpoch( TTDate::getBeginWeekEpoch( time(), 1 ) );                  //Start on Monday to avoid DST issues on Sunday morning.
		$date_stamp = TTDate::getDate( 'DATE', $date_epoch );

		$this->assertEquals( $this->getCurrentAccrualBalance( $this->user_id, $this->policy_ids['accrual_policy_account'][10] ), ( 0 * 3600 ) );

		$absence_id = $dd->createAbsence( $this->user_id, $date_epoch, ( 12 * 3600 ), $policy_ids['absence'][0] );
		//$this->assertEquals( $this->getCurrentAccrualBalance( $this->user_id, $this->policy_ids['accrual_policy_account'][10] ), (-12 * 3600) );

		$udt_arr = $this->getUserDateTotalArray( $date_epoch, $date_epoch );
		//print_r($udt_arr);

		//Total Time
		$this->assertEquals( 5, $udt_arr[$date_epoch][0]['object_type_id'] );                               //5=System Total
		$this->assertEquals( $udt_arr[$date_epoch][0]['pay_code_id'], TTUUID::getZeroID() );
		$this->assertEquals( $udt_arr[$date_epoch][0]['total_time'], ( 12 * 3600 ) );
		//$this->assertEquals( $udt_arr[$date_epoch][0]['start_time_stamp'], 	strtotime($date_stamp.' 8:00AM') );
		//$this->assertEquals( $udt_arr[$date_epoch][0]['end_time_stamp'], 	strtotime($date_stamp.' 8:00PM') );
		$this->assertEquals( 0, $udt_arr[$date_epoch][0]['hourly_rate'] );

		//Absence Time
		$this->assertEquals( 20, $udt_arr[$date_epoch][1]['object_type_id'] );                              //Absence Time
		$this->assertEquals( $udt_arr[$date_epoch][1]['pay_code_id'], $this->policy_ids['pay_code'][100] ); //Absence Time
		$this->assertEquals( $udt_arr[$date_epoch][1]['total_time'], ( 8 * 3600 ) );
		$this->assertEquals( $udt_arr[$date_epoch][1]['start_time_stamp'], strtotime( $date_stamp . ' 12:00AM' ) );
		$this->assertEquals( $udt_arr[$date_epoch][1]['end_time_stamp'], strtotime( $date_stamp . ' 8:00AM' ) );
		$this->assertEquals( $udt_arr[$date_epoch][1]['hourly_rate'], ( 1 * 21.50 ) );

		//Overtime 1
		$this->assertEquals( 30, $udt_arr[$date_epoch][4]['object_type_id'] );                              //OverTime
		$this->assertEquals( $udt_arr[$date_epoch][4]['pay_code_id'], $policy_ids['pay_code'][0] );
		$this->assertEquals( $udt_arr[$date_epoch][4]['total_time'], ( 1 * 3600 ) );
		$this->assertEquals( $udt_arr[$date_epoch][4]['start_time_stamp'], strtotime( $date_stamp . ' 8:00AM' ) );
		$this->assertEquals( $udt_arr[$date_epoch][4]['end_time_stamp'], strtotime( $date_stamp . ' 9:00AM' ) );
		$this->assertEquals( $udt_arr[$date_epoch][4]['hourly_rate'], ( 1.5 * 21.50 ) );
		//Overtime 2
		$this->assertEquals( 30, $udt_arr[$date_epoch][3]['object_type_id'] );                              //OverTime
		$this->assertEquals( $udt_arr[$date_epoch][3]['pay_code_id'], $policy_ids['pay_code'][1] );
		$this->assertEquals( $udt_arr[$date_epoch][3]['total_time'], ( 1 * 3600 ) );
		$this->assertEquals( $udt_arr[$date_epoch][3]['start_time_stamp'], strtotime( $date_stamp . ' 9:00AM' ) );
		$this->assertEquals( $udt_arr[$date_epoch][3]['end_time_stamp'], strtotime( $date_stamp . ' 10:00AM' ) );
		$this->assertEquals( $udt_arr[$date_epoch][3]['hourly_rate'], ( 2.0 * 21.50 ) );
		//Overtime 3
		$this->assertEquals( 30, $udt_arr[$date_epoch][2]['object_type_id'] );                              //OverTime
		$this->assertEquals( $udt_arr[$date_epoch][2]['pay_code_id'], $policy_ids['pay_code'][2] );
		$this->assertEquals( $udt_arr[$date_epoch][2]['total_time'], ( 2 * 3600 ) );
		$this->assertEquals( $udt_arr[$date_epoch][2]['start_time_stamp'], strtotime( $date_stamp . ' 10:00AM' ) );
		$this->assertEquals( $udt_arr[$date_epoch][2]['end_time_stamp'], strtotime( $date_stamp . ' 12:00PM' ) );
		$this->assertEquals( $udt_arr[$date_epoch][2]['hourly_rate'], ( 2.5 * 21.50 ) );

		//Make sure no other hours
		$this->assertCount( 5, $udt_arr[$date_epoch] );

		//$this->assertEquals( $this->getCurrentAccrualBalance( $this->user_id, $this->policy_ids['accrual_policy_account'][10] ), (-12 * 3600) );

		//Delete absence in the middle of the week and confirm balance is still correct.
		$dd->deleteAbsence( $absence_id );
		$this->assertEquals( $this->getCurrentAccrualBalance( $this->user_id, $this->policy_ids['accrual_policy_account'][10] ), ( 0 * 3600 ) );

		return true;
	}

	/**
	 * @group OvertimePolicy_testNoOverTimePolicyWithAbsence
	 */
	function testNoOverTimePolicyWithAbsence() {
		//This is mainly to test for a bug that occurs when no UDT records are returned to calculateOverTimePolicy
		global $dd;

		$policy_ids['pay_formula_policy'][] = $this->createPayFormulaPolicy( $this->company_id, 200 );      //OT1.5
		$policy_ids['pay_formula_policy'][] = $this->createPayFormulaPolicy( $this->company_id, 210 );      //OT2.0
		$policy_ids['pay_formula_policy'][] = $this->createPayFormulaPolicy( $this->company_id, 220 );      //OT2.5

		$policy_ids['pay_code'][] = $this->createPayCode( $this->company_id, 100, $policy_ids['pay_formula_policy'][0] );
		$policy_ids['pay_code'][] = $this->createPayCode( $this->company_id, 110, $policy_ids['pay_formula_policy'][1] );
		$policy_ids['pay_code'][] = $this->createPayCode( $this->company_id, 120, $policy_ids['pay_formula_policy'][2] );

		$policy_ids['overtime'][] = $this->createOverTimePolicy( $this->company_id, 100, $this->policy_ids['contributing_shift_policy'][12], $policy_ids['pay_code'][0] );
		$policy_ids['overtime'][] = $this->createOverTimePolicy( $this->company_id, 110, $this->policy_ids['contributing_shift_policy'][12], $policy_ids['pay_code'][1] );
		$policy_ids['overtime'][] = $this->createOverTimePolicy( $this->company_id, 120, $this->policy_ids['contributing_shift_policy'][12], $policy_ids['pay_code'][2] );

		//Create Policy Group
		$dd->createPolicyGroup( $this->company_id,
								null, //Meal
								null, //Exception
								null, //Holiday
								$policy_ids['overtime'], //OT
								null, //Premium
								null, //Round
								[ $this->user_id ], //Users
								null, //Break
								null, //Accrual
								null, //Expense
								[ $this->policy_ids['absence'][10] ], //Absence
								[ $this->policy_ids['regular'][12] ] //Regular
		);

		$date_epoch = TTDate::getMiddleDayEpoch( TTDate::getBeginWeekEpoch( time() ) );

		$this->assertEquals( $this->getCurrentAccrualBalance( $this->user_id, $this->policy_ids['accrual_policy_account'][10] ), ( 0 * 3600 ) );

		$dd->createAbsence( $this->user_id, $date_epoch, ( 4 * 3600 ), $this->policy_ids['absence'][10] );
		$this->assertEquals( $this->getCurrentAccrualBalance( $this->user_id, $this->policy_ids['accrual_policy_account'][10] ), ( -4 * 3600 ) );

		$udt_arr = $this->getUserDateTotalArray( $date_epoch, $date_epoch );
		//print_r($udt_arr);

		//Total Time
		$this->assertEquals( 5, $udt_arr[$date_epoch][0]['object_type_id'] );                               //5=System Total
		$this->assertEquals( $udt_arr[$date_epoch][0]['pay_code_id'], TTUUID::getZeroID() );
		$this->assertEquals( $udt_arr[$date_epoch][0]['total_time'], ( 4 * 3600 ) );
		$this->assertEquals( 0, $udt_arr[$date_epoch][0]['hourly_rate'] );
		//Regular Time
		$this->assertEquals( 25, $udt_arr[$date_epoch][1]['object_type_id'] );                              //Absence Time
		$this->assertEquals( $udt_arr[$date_epoch][1]['pay_code_id'], $this->policy_ids['pay_code'][900] ); //PTO/Vacation
		$this->assertEquals( $udt_arr[$date_epoch][1]['total_time'], ( 4 * 3600 ) );
		$this->assertEquals( 21.50, $udt_arr[$date_epoch][1]['hourly_rate'] );

		//Make sure no other hours
		$this->assertCount( 2, $udt_arr[$date_epoch] );

		return true;
	}

	/**
	 * @group OvertimePolicy_testWeeklyOverTimeWithAbsencePolicyA
	 */
	function testWeeklyOverTimeWithAbsencePolicyA() {
		global $dd;

		$policy_ids['pay_formula_policy'][] = $this->createPayFormulaPolicy( $this->company_id, 200 );      //OT1.5
		$policy_ids['pay_formula_policy'][] = $this->createPayFormulaPolicy( $this->company_id, 210 );      //OT2.0
		$policy_ids['pay_formula_policy'][] = $this->createPayFormulaPolicy( $this->company_id, 220 );      //OT2.5

		$policy_ids['pay_code'][] = $this->createPayCode( $this->company_id, 200, $policy_ids['pay_formula_policy'][0] );
		$policy_ids['pay_code'][] = $this->createPayCode( $this->company_id, 210, $policy_ids['pay_formula_policy'][1] );
		$policy_ids['pay_code'][] = $this->createPayCode( $this->company_id, 220, $policy_ids['pay_formula_policy'][2] );

		$policy_ids['overtime'][] = $this->createOverTimePolicy( $this->company_id, 200, $this->policy_ids['contributing_shift_policy'][14], $policy_ids['pay_code'][0] );
		$policy_ids['overtime'][] = $this->createOverTimePolicy( $this->company_id, 210, $this->policy_ids['contributing_shift_policy'][14], $policy_ids['pay_code'][1] );
		$policy_ids['overtime'][] = $this->createOverTimePolicy( $this->company_id, 220, $this->policy_ids['contributing_shift_policy'][14], $policy_ids['pay_code'][2] );
		//print_r($policy_ids['overtime']);

		//Create Policy Group
		$dd->createPolicyGroup( $this->company_id,
								null, //Meal
								null, //Exception
								null, //Holiday
								$policy_ids['overtime'], //OT
								null, //Premium
								null, //Round
								[ $this->user_id ], //Users
								null, //Break
								null, //Accrual
								null, //Expense
								[ $this->policy_ids['absence'][10] ], //Absence
								[ $this->policy_ids['regular'][12] ] //Regular
		);

		$date_epoch = TTDate::getMiddleDayEpoch( TTDate::getBeginWeekEpoch( time() ) );
		$date_stamp = TTDate::getDate( 'DATE', $date_epoch );

		$this->assertEquals( $this->getCurrentAccrualBalance( $this->user_id, $this->policy_ids['accrual_policy_account'][10] ), ( 0 * 3600 ) );

		//
		//Day of Week: 1
		//
		$dd->createPunchPair( $this->user_id,
							  strtotime( $date_stamp . ' 8:00AM' ),
							  strtotime( $date_stamp . ' 8:00PM' ),
							  [
									  'in_type_id'    => 10,
									  'out_type_id'   => 10,
									  'branch_id'     => 0,
									  'department_id' => 0,
									  'job_id'        => 0,
									  'job_item_id'   => 0,
									  'punch_tag_id'  => []
							  ],
							  true
		);

		$udt_arr = $this->getUserDateTotalArray( $date_epoch, $date_epoch );
		//print_r($udt_arr);
		//Total Time
		$this->assertEquals( 5, $udt_arr[$date_epoch][0]['object_type_id'] );                               //5=System Total
		$this->assertEquals( $udt_arr[$date_epoch][0]['pay_code_id'], TTUUID::getZeroID() );
		$this->assertEquals( $udt_arr[$date_epoch][0]['total_time'], ( 12 * 3600 ) );
		//Regular Time
		$this->assertEquals( 20, $udt_arr[$date_epoch][1]['object_type_id'] );                              //Regular Time
		$this->assertEquals( $udt_arr[$date_epoch][1]['pay_code_id'], $this->policy_ids['pay_code'][100] ); //Regular Time
		$this->assertEquals( $udt_arr[$date_epoch][1]['total_time'], ( 12 * 3600 ) );
		//Make sure no other hours
		$this->assertCount( 2, $udt_arr[$date_epoch] );


		//
		//Day of Week: 2 (Absence to be included in Weekly OT)
		//
		$date_epoch = TTDate::incrementDate( TTDate::getMiddleDayEpoch( TTDate::getBeginWeekEpoch( time() ) ), 1, 'day' );
		$this->assertEquals( $this->getCurrentAccrualBalance( $this->user_id, $this->policy_ids['accrual_policy_account'][10] ), ( 0 * 3600 ) );
		$dd->createAbsence( $this->user_id, $date_epoch, ( 12 * 3600 ), $this->policy_ids['absence'][10] );
		$this->assertEquals( $this->getCurrentAccrualBalance( $this->user_id, $this->policy_ids['accrual_policy_account'][10] ), ( -12 * 3600 ) );

		$udt_arr = $this->getUserDateTotalArray( $date_epoch, $date_epoch );
		//print_r($udt_arr);

		//Total Time
		$this->assertEquals( 5, $udt_arr[$date_epoch][0]['object_type_id'] );                               //5=System Total
		$this->assertEquals( $udt_arr[$date_epoch][0]['pay_code_id'], TTUUID::getZeroID() );
		$this->assertEquals( $udt_arr[$date_epoch][0]['total_time'], ( 12 * 3600 ) );
		//Absence Time
		$this->assertEquals( 25, $udt_arr[$date_epoch][1]['object_type_id'] );                              //Absence Time
		$this->assertEquals( $udt_arr[$date_epoch][1]['pay_code_id'], $this->policy_ids['pay_code'][900] ); //Regular Time
		$this->assertEquals( $udt_arr[$date_epoch][1]['total_time'], ( 12 * 3600 ) );
		//Make sure no other hours
		$this->assertCount( 2, $udt_arr[$date_epoch] );

		//
		//Day of Week: 3
		//
		$date_epoch = TTDate::incrementDate( TTDate::getMiddleDayEpoch( TTDate::getBeginWeekEpoch( time() ) ), 2, 'day' );
		$date_stamp = TTDate::getDate( 'DATE', $date_epoch );

		$dd->createPunchPair( $this->user_id,
							  strtotime( $date_stamp . ' 8:00AM' ),
							  strtotime( $date_stamp . ' 8:00PM' ),
							  [
									  'in_type_id'    => 10,
									  'out_type_id'   => 10,
									  'branch_id'     => 0,
									  'department_id' => 0,
									  'job_id'        => 0,
									  'job_item_id'   => 0,
									  'punch_tag_id'  => []
							  ],
							  true
		);

		$udt_arr = $this->getUserDateTotalArray( $date_epoch, $date_epoch );
		//Total Time
		$this->assertEquals( 5, $udt_arr[$date_epoch][0]['object_type_id'] );                               //5=System Total
		$this->assertEquals( $udt_arr[$date_epoch][0]['pay_code_id'], TTUUID::getZeroID() );
		$this->assertEquals( $udt_arr[$date_epoch][0]['total_time'], ( 12 * 3600 ) );
		//Regular Time
		$this->assertEquals( 20, $udt_arr[$date_epoch][1]['object_type_id'] );                              //Regular Time
		$this->assertEquals( $udt_arr[$date_epoch][1]['pay_code_id'], $this->policy_ids['pay_code'][100] ); //Regular Time
		$this->assertEquals( $udt_arr[$date_epoch][1]['total_time'], ( 12 * 3600 ) );
		//Make sure no other hours
		$this->assertCount( 2, $udt_arr[$date_epoch] );

		//
		//Day of Week: 4
		//
		$date_epoch = TTDate::incrementDate( TTDate::getMiddleDayEpoch( TTDate::getBeginWeekEpoch( time() ) ), 3, 'day' );
		$date_stamp = TTDate::getDate( 'DATE', $date_epoch );

		$dd->createPunchPair( $this->user_id,
							  strtotime( $date_stamp . ' 8:00AM' ),
							  strtotime( $date_stamp . ' 8:00PM' ),
							  [
									  'in_type_id'    => 10,
									  'out_type_id'   => 10,
									  'branch_id'     => 0,
									  'department_id' => 0,
									  'job_id'        => 0,
									  'job_item_id'   => 0,
									  'punch_tag_id'  => []
							  ],
							  true
		);

		$udt_arr = $this->getUserDateTotalArray( $date_epoch, $date_epoch );
		//print_r($udt_arr);
		//Total Time
		$this->assertEquals( 5, $udt_arr[$date_epoch][0]['object_type_id'] );                               //5=System Total
		$this->assertEquals( $udt_arr[$date_epoch][0]['pay_code_id'], TTUUID::getZeroID() );
		$this->assertEquals( $udt_arr[$date_epoch][0]['total_time'], ( 12 * 3600 ) );
		//Regular Time
		$this->assertEquals( 20, $udt_arr[$date_epoch][1]['object_type_id'] );                              //Regular Time
		$this->assertEquals( $udt_arr[$date_epoch][1]['pay_code_id'], $this->policy_ids['pay_code'][100] ); //Regular Time
		$this->assertEquals( $udt_arr[$date_epoch][1]['total_time'], ( 11 * 3600 ) );
		//Overtime 1
		$this->assertEquals( 30, $udt_arr[$date_epoch][2]['object_type_id'] );                              //OverTime
		$this->assertEquals( $udt_arr[$date_epoch][2]['pay_code_id'], $policy_ids['pay_code'][0] );
		$this->assertEquals( $udt_arr[$date_epoch][2]['total_time'], ( 1 * 3600 ) );
		//Make sure no other hours
		$this->assertCount( 3, $udt_arr[$date_epoch] );

		//
		//Day of Week: 5
		//
		$date_epoch = TTDate::incrementDate( TTDate::getMiddleDayEpoch( TTDate::getBeginWeekEpoch( time() ) ), 4, 'day' );
		$date_stamp = TTDate::getDate( 'DATE', $date_epoch );

		$dd->createPunchPair( $this->user_id,
							  strtotime( $date_stamp . ' 8:00AM' ),
							  strtotime( $date_stamp . ' 8:00PM' ),
							  [
									  'in_type_id'    => 10,
									  'out_type_id'   => 10,
									  'branch_id'     => 0,
									  'department_id' => 0,
									  'job_id'        => 0,
									  'job_item_id'   => 0,
									  'punch_tag_id'  => []
							  ],
							  true
		);

		$udt_arr = $this->getUserDateTotalArray( $date_epoch, $date_epoch );
		//print_r($udt_arr);
		//Total Time
		$this->assertEquals( 5, $udt_arr[$date_epoch][0]['object_type_id'] );                               //5=System Total
		$this->assertEquals( $udt_arr[$date_epoch][0]['pay_code_id'], TTUUID::getZeroID() );
		$this->assertEquals( $udt_arr[$date_epoch][0]['total_time'], ( 12 * 3600 ) );
		//Overtime 1
		$this->assertEquals( 30, $udt_arr[$date_epoch][2]['object_type_id'] );                              //OverTime
		$this->assertEquals( $udt_arr[$date_epoch][2]['pay_code_id'], $policy_ids['pay_code'][0] );
		$this->assertEquals( $udt_arr[$date_epoch][2]['total_time'], ( 11 * 3600 ) );
		//Overtime 2
		$this->assertEquals( 30, $udt_arr[$date_epoch][1]['object_type_id'] );                              //OverTime
		$this->assertEquals( $udt_arr[$date_epoch][1]['pay_code_id'], $policy_ids['pay_code'][1] );
		$this->assertEquals( $udt_arr[$date_epoch][1]['total_time'], ( 1 * 3600 ) );
		//Make sure no other hours
		$this->assertCount( 3, $udt_arr[$date_epoch] );

		//
		//Day of Week: 6
		//
		$date_epoch = TTDate::incrementDate( TTDate::getMiddleDayEpoch( TTDate::getBeginWeekEpoch( time() ) ), 5, 'day' );
		$date_stamp = TTDate::getDate( 'DATE', $date_epoch );

		$dd->createPunchPair( $this->user_id,
							  strtotime( $date_stamp . ' 8:00AM' ),
							  strtotime( $date_stamp . ' 8:00PM' ),
							  [
									  'in_type_id'    => 10,
									  'out_type_id'   => 10,
									  'branch_id'     => 0,
									  'department_id' => 0,
									  'job_id'        => 0,
									  'job_item_id'   => 0,
									  'punch_tag_id'  => []
							  ],
							  true
		);

		$udt_arr = $this->getUserDateTotalArray( $date_epoch, $date_epoch );
		//print_r($udt_arr);
		//Total Time
		$this->assertEquals( 5, $udt_arr[$date_epoch][0]['object_type_id'] );                               //5=System Total
		$this->assertEquals( $udt_arr[$date_epoch][0]['pay_code_id'], TTUUID::getZeroID() );
		$this->assertEquals( $udt_arr[$date_epoch][0]['total_time'], ( 12 * 3600 ) );
		//Overtime 1
		$this->assertEquals( 30, $udt_arr[$date_epoch][2]['object_type_id'] );                              //OverTime
		$this->assertEquals( $udt_arr[$date_epoch][2]['pay_code_id'], $policy_ids['pay_code'][1] );
		$this->assertEquals( $udt_arr[$date_epoch][2]['total_time'], ( 11 * 3600 ) );
		//Overtime 2
		$this->assertEquals( 30, $udt_arr[$date_epoch][1]['object_type_id'] );                              //OverTime
		$this->assertEquals( $udt_arr[$date_epoch][1]['pay_code_id'], $policy_ids['pay_code'][2] );
		$this->assertEquals( $udt_arr[$date_epoch][1]['total_time'], ( 1 * 3600 ) );
		//Make sure no other hours
		$this->assertCount( 3, $udt_arr[$date_epoch] );

		$this->assertEquals( $this->getCurrentAccrualBalance( $this->user_id, $this->policy_ids['accrual_policy_account'][10] ), ( -12 * 3600 ) );

		return true;
	}

	/**
	 * @group OvertimePolicy_testWeeklyOverTimeWithAbsencePolicyB
	 */
	function testWeeklyOverTimeWithAbsencePolicyB() {
		//Test with absence at the beginning of the week.
		global $dd;

		$policy_ids['pay_formula_policy'][] = $this->createPayFormulaPolicy( $this->company_id, 200 );      //OT1.5
		$policy_ids['pay_formula_policy'][] = $this->createPayFormulaPolicy( $this->company_id, 210 );      //OT2.0
		$policy_ids['pay_formula_policy'][] = $this->createPayFormulaPolicy( $this->company_id, 220 );      //OT2.5

		$policy_ids['pay_code'][] = $this->createPayCode( $this->company_id, 200, $policy_ids['pay_formula_policy'][0] );
		$policy_ids['pay_code'][] = $this->createPayCode( $this->company_id, 210, $policy_ids['pay_formula_policy'][1] );
		$policy_ids['pay_code'][] = $this->createPayCode( $this->company_id, 220, $policy_ids['pay_formula_policy'][2] );

		$policy_ids['overtime'][] = $this->createOverTimePolicy( $this->company_id, 200, $this->policy_ids['contributing_shift_policy'][14], $policy_ids['pay_code'][0] );
		$policy_ids['overtime'][] = $this->createOverTimePolicy( $this->company_id, 210, $this->policy_ids['contributing_shift_policy'][14], $policy_ids['pay_code'][1] );
		$policy_ids['overtime'][] = $this->createOverTimePolicy( $this->company_id, 220, $this->policy_ids['contributing_shift_policy'][14], $policy_ids['pay_code'][2] );
		//print_r($policy_ids['overtime']);

		//Create Policy Group
		$dd->createPolicyGroup( $this->company_id,
								null, //Meal
								null, //Exception
								null, //Holiday
								$policy_ids['overtime'], //OT
								null, //Premium
								null, //Round
								[ $this->user_id ], //Users
								null, //Break
								null, //Accrual
								null, //Expense
								[ $this->policy_ids['absence'][10] ], //Absence
								[ $this->policy_ids['regular'][12] ] //Regular
		);

		$this->assertEquals( $this->getCurrentAccrualBalance( $this->user_id, $this->policy_ids['accrual_policy_account'][10] ), ( 0 * 3600 ) );

		//
		//Day of Week: 1 (Absence to be included in Weekly OT)
		//
		$date_epoch = TTDate::getMiddleDayEpoch( TTDate::getBeginWeekEpoch( time() ) );
		$dd->createAbsence( $this->user_id, $date_epoch, ( 12 * 3600 ), $this->policy_ids['absence'][10] );
		$this->assertEquals( $this->getCurrentAccrualBalance( $this->user_id, $this->policy_ids['accrual_policy_account'][10] ), ( -12 * 3600 ) );


		$udt_arr = $this->getUserDateTotalArray( $date_epoch, $date_epoch );
		//print_r($udt_arr);

		//Total Time
		$this->assertEquals( 5, $udt_arr[$date_epoch][0]['object_type_id'] );                               //5=System Total
		$this->assertEquals( $udt_arr[$date_epoch][0]['pay_code_id'], TTUUID::getZeroID() );
		$this->assertEquals( $udt_arr[$date_epoch][0]['total_time'], ( 12 * 3600 ) );
		//Absence Time
		$this->assertEquals( 25, $udt_arr[$date_epoch][1]['object_type_id'] );                              //Absence Time
		$this->assertEquals( $udt_arr[$date_epoch][1]['pay_code_id'], $this->policy_ids['pay_code'][900] ); //Regular Time
		$this->assertEquals( $udt_arr[$date_epoch][1]['total_time'], ( 12 * 3600 ) );
		//Make sure no other hours
		$this->assertCount( 2, $udt_arr[$date_epoch] );

		//
		//Day of Week: 2
		//
		$date_epoch = TTDate::incrementDate( TTDate::getMiddleDayEpoch( TTDate::getBeginWeekEpoch( time() ) ), 1, 'day' );
		$date_stamp = TTDate::getDate( 'DATE', $date_epoch );

		$dd->createPunchPair( $this->user_id,
							  strtotime( $date_stamp . ' 8:00AM' ),
							  strtotime( $date_stamp . ' 8:00PM' ),
							  [
									  'in_type_id'    => 10,
									  'out_type_id'   => 10,
									  'branch_id'     => 0,
									  'department_id' => 0,
									  'job_id'        => 0,
									  'job_item_id'   => 0,
									  'punch_tag_id'  => []
							  ],
							  true
		);

		$udt_arr = $this->getUserDateTotalArray( $date_epoch, $date_epoch );
		//print_r($udt_arr);
		//Total Time
		$this->assertEquals( 5, $udt_arr[$date_epoch][0]['object_type_id'] );                               //5=System Total
		$this->assertEquals( $udt_arr[$date_epoch][0]['pay_code_id'], TTUUID::getZeroID() );
		$this->assertEquals( $udt_arr[$date_epoch][0]['total_time'], ( 12 * 3600 ) );
		//Regular Time
		$this->assertEquals( 20, $udt_arr[$date_epoch][1]['object_type_id'] );                              //Regular Time
		$this->assertEquals( $udt_arr[$date_epoch][1]['pay_code_id'], $this->policy_ids['pay_code'][100] ); //Regular Time
		$this->assertEquals( $udt_arr[$date_epoch][1]['total_time'], ( 12 * 3600 ) );
		//Make sure no other hours
		$this->assertCount( 2, $udt_arr[$date_epoch] );


		//
		//Day of Week: 3
		//
		$date_epoch = TTDate::incrementDate( TTDate::getMiddleDayEpoch( TTDate::getBeginWeekEpoch( time() ) ), 2, 'day' );
		$date_stamp = TTDate::getDate( 'DATE', $date_epoch );

		$dd->createPunchPair( $this->user_id,
							  strtotime( $date_stamp . ' 8:00AM' ),
							  strtotime( $date_stamp . ' 8:00PM' ),
							  [
									  'in_type_id'    => 10,
									  'out_type_id'   => 10,
									  'branch_id'     => 0,
									  'department_id' => 0,
									  'job_id'        => 0,
									  'job_item_id'   => 0,
									  'punch_tag_id'  => []
							  ],
							  true
		);

		$udt_arr = $this->getUserDateTotalArray( $date_epoch, $date_epoch );
		//Total Time
		$this->assertEquals( 5, $udt_arr[$date_epoch][0]['object_type_id'] );                               //5=System Total
		$this->assertEquals( $udt_arr[$date_epoch][0]['pay_code_id'], TTUUID::getZeroID() );
		$this->assertEquals( $udt_arr[$date_epoch][0]['total_time'], ( 12 * 3600 ) );
		//Regular Time
		$this->assertEquals( 20, $udt_arr[$date_epoch][1]['object_type_id'] );                              //Regular Time
		$this->assertEquals( $udt_arr[$date_epoch][1]['pay_code_id'], $this->policy_ids['pay_code'][100] ); //Regular Time
		$this->assertEquals( $udt_arr[$date_epoch][1]['total_time'], ( 12 * 3600 ) );
		//Make sure no other hours
		$this->assertCount( 2, $udt_arr[$date_epoch] );

		//
		//Day of Week: 4
		//
		$date_epoch = TTDate::incrementDate( TTDate::getMiddleDayEpoch( TTDate::getBeginWeekEpoch( time() ) ), 3, 'day' );
		$date_stamp = TTDate::getDate( 'DATE', $date_epoch );

		$dd->createPunchPair( $this->user_id,
							  strtotime( $date_stamp . ' 8:00AM' ),
							  strtotime( $date_stamp . ' 8:00PM' ),
							  [
									  'in_type_id'    => 10,
									  'out_type_id'   => 10,
									  'branch_id'     => 0,
									  'department_id' => 0,
									  'job_id'        => 0,
									  'job_item_id'   => 0,
									  'punch_tag_id'  => []
							  ],
							  true
		);

		$udt_arr = $this->getUserDateTotalArray( $date_epoch, $date_epoch );
		//print_r($udt_arr);
		//Total Time
		$this->assertEquals( 5, $udt_arr[$date_epoch][0]['object_type_id'] );                               //5=System Total
		$this->assertEquals( $udt_arr[$date_epoch][0]['pay_code_id'], TTUUID::getZeroID() );
		$this->assertEquals( $udt_arr[$date_epoch][0]['total_time'], ( 12 * 3600 ) );
		//Regular Time
		$this->assertEquals( 20, $udt_arr[$date_epoch][1]['object_type_id'] );                              //Regular Time
		$this->assertEquals( $udt_arr[$date_epoch][1]['pay_code_id'], $this->policy_ids['pay_code'][100] ); //Regular Time
		$this->assertEquals( $udt_arr[$date_epoch][1]['total_time'], ( 11 * 3600 ) );
		//Overtime 1
		$this->assertEquals( 30, $udt_arr[$date_epoch][2]['object_type_id'] );                              //OverTime
		$this->assertEquals( $udt_arr[$date_epoch][2]['pay_code_id'], $policy_ids['pay_code'][0] );
		$this->assertEquals( $udt_arr[$date_epoch][2]['total_time'], ( 1 * 3600 ) );
		//Make sure no other hours
		$this->assertCount( 3, $udt_arr[$date_epoch] );

		//
		//Day of Week: 5
		//
		$date_epoch = TTDate::incrementDate( TTDate::getMiddleDayEpoch( TTDate::getBeginWeekEpoch( time() ) ), 4, 'day' );
		$date_stamp = TTDate::getDate( 'DATE', $date_epoch );

		$dd->createPunchPair( $this->user_id,
							  strtotime( $date_stamp . ' 8:00AM' ),
							  strtotime( $date_stamp . ' 8:00PM' ),
							  [
									  'in_type_id'    => 10,
									  'out_type_id'   => 10,
									  'branch_id'     => 0,
									  'department_id' => 0,
									  'job_id'        => 0,
									  'job_item_id'   => 0,
									  'punch_tag_id'  => []
							  ],
							  true
		);

		$udt_arr = $this->getUserDateTotalArray( $date_epoch, $date_epoch );
		//print_r($udt_arr);
		//Total Time
		$this->assertEquals( 5, $udt_arr[$date_epoch][0]['object_type_id'] );                               //5=System Total
		$this->assertEquals( $udt_arr[$date_epoch][0]['pay_code_id'], TTUUID::getZeroID() );
		$this->assertEquals( $udt_arr[$date_epoch][0]['total_time'], ( 12 * 3600 ) );
		//Overtime 1
		$this->assertEquals( 30, $udt_arr[$date_epoch][2]['object_type_id'] );                              //OverTime
		$this->assertEquals( $udt_arr[$date_epoch][2]['pay_code_id'], $policy_ids['pay_code'][0] );
		$this->assertEquals( $udt_arr[$date_epoch][2]['total_time'], ( 11 * 3600 ) );
		//Overtime 2
		$this->assertEquals( 30, $udt_arr[$date_epoch][1]['object_type_id'] );                              //OverTime
		$this->assertEquals( $udt_arr[$date_epoch][1]['pay_code_id'], $policy_ids['pay_code'][1] );
		$this->assertEquals( $udt_arr[$date_epoch][1]['total_time'], ( 1 * 3600 ) );
		//Make sure no other hours
		$this->assertCount( 3, $udt_arr[$date_epoch] );

		//
		//Day of Week: 6
		//
		$date_epoch = TTDate::incrementDate( TTDate::getMiddleDayEpoch( TTDate::getBeginWeekEpoch( time() ) ), 5, 'day' );
		$date_stamp = TTDate::getDate( 'DATE', $date_epoch );

		$dd->createPunchPair( $this->user_id,
							  strtotime( $date_stamp . ' 8:00AM' ),
							  strtotime( $date_stamp . ' 8:00PM' ),
							  [
									  'in_type_id'    => 10,
									  'out_type_id'   => 10,
									  'branch_id'     => 0,
									  'department_id' => 0,
									  'job_id'        => 0,
									  'job_item_id'   => 0,
									  'punch_tag_id'  => []
							  ],
							  true
		);

		$udt_arr = $this->getUserDateTotalArray( $date_epoch, $date_epoch );
		//print_r($udt_arr);
		//Total Time
		$this->assertEquals( 5, $udt_arr[$date_epoch][0]['object_type_id'] );                               //5=System Total
		$this->assertEquals( $udt_arr[$date_epoch][0]['pay_code_id'], TTUUID::getZeroID() );
		$this->assertEquals( $udt_arr[$date_epoch][0]['total_time'], ( 12 * 3600 ) );
		//Overtime 1
		$this->assertEquals( 30, $udt_arr[$date_epoch][2]['object_type_id'] );                              //OverTime
		$this->assertEquals( $udt_arr[$date_epoch][2]['pay_code_id'], $policy_ids['pay_code'][1] );
		$this->assertEquals( $udt_arr[$date_epoch][2]['total_time'], ( 11 * 3600 ) );
		//Overtime 2
		$this->assertEquals( 30, $udt_arr[$date_epoch][1]['object_type_id'] );                              //OverTime
		$this->assertEquals( $udt_arr[$date_epoch][1]['pay_code_id'], $policy_ids['pay_code'][2] );
		$this->assertEquals( $udt_arr[$date_epoch][1]['total_time'], ( 1 * 3600 ) );
		//Make sure no other hours
		$this->assertCount( 3, $udt_arr[$date_epoch] );

		$this->assertEquals( $this->getCurrentAccrualBalance( $this->user_id, $this->policy_ids['accrual_policy_account'][10] ), ( -12 * 3600 ) );

		return true;
	}

	/**
	 * @group OvertimePolicy_testWeeklyOverTimeWithAbsencePolicyC
	 */
	function testWeeklyOverTimeWithAbsencePolicyC() {
		//Test with absence at the end of the week, where it switched into OT.
		global $dd;

		$policy_ids['pay_formula_policy'][] = $this->createPayFormulaPolicy( $this->company_id, 200 );      //OT1.5
		$policy_ids['pay_formula_policy'][] = $this->createPayFormulaPolicy( $this->company_id, 210 );      //OT2.0
		$policy_ids['pay_formula_policy'][] = $this->createPayFormulaPolicy( $this->company_id, 220 );      //OT2.5

		$policy_ids['pay_code'][] = $this->createPayCode( $this->company_id, 200, $policy_ids['pay_formula_policy'][0] );
		$policy_ids['pay_code'][] = $this->createPayCode( $this->company_id, 210, $policy_ids['pay_formula_policy'][1] );
		$policy_ids['pay_code'][] = $this->createPayCode( $this->company_id, 220, $policy_ids['pay_formula_policy'][2] );

		$policy_ids['overtime'][] = $this->createOverTimePolicy( $this->company_id, 200, $this->policy_ids['contributing_shift_policy'][14], $policy_ids['pay_code'][0] );
		$policy_ids['overtime'][] = $this->createOverTimePolicy( $this->company_id, 210, $this->policy_ids['contributing_shift_policy'][14], $policy_ids['pay_code'][1] );
		$policy_ids['overtime'][] = $this->createOverTimePolicy( $this->company_id, 220, $this->policy_ids['contributing_shift_policy'][14], $policy_ids['pay_code'][2] );
		//print_r($policy_ids['overtime']);

		//Create Policy Group
		$dd->createPolicyGroup( $this->company_id,
								null, //Meal
								null, //Exception
								null, //Holiday
								$policy_ids['overtime'], //OT
								null, //Premium
								null, //Round
								[ $this->user_id ], //Users
								null, //Break
								null, //Accrual
								null, //Expense
								[ $this->policy_ids['absence'][10] ], //Absence
								[ $this->policy_ids['regular'][12] ] //Regular
		);

		$this->assertEquals( $this->getCurrentAccrualBalance( $this->user_id, $this->policy_ids['accrual_policy_account'][10] ), ( 0 * 3600 ) );


		//
		//Day of Week: 1
		//
		$date_epoch = TTDate::getMiddleDayEpoch( TTDate::getBeginWeekEpoch( time() ) );
		$date_stamp = TTDate::getDate( 'DATE', $date_epoch );

		$dd->createPunchPair( $this->user_id,
							  strtotime( $date_stamp . ' 8:00AM' ),
							  strtotime( $date_stamp . ' 8:00PM' ),
							  [
									  'in_type_id'    => 10,
									  'out_type_id'   => 10,
									  'branch_id'     => 0,
									  'department_id' => 0,
									  'job_id'        => 0,
									  'job_item_id'   => 0,
									  'punch_tag_id'  => []
							  ],
							  true
		);

		$udt_arr = $this->getUserDateTotalArray( $date_epoch, $date_epoch );
		//print_r($udt_arr);
		//Total Time
		$this->assertEquals( 5, $udt_arr[$date_epoch][0]['object_type_id'] );                               //5=System Total
		$this->assertEquals( $udt_arr[$date_epoch][0]['pay_code_id'], TTUUID::getZeroID() );
		$this->assertEquals( $udt_arr[$date_epoch][0]['total_time'], ( 12 * 3600 ) );
		//Regular Time
		$this->assertEquals( 20, $udt_arr[$date_epoch][1]['object_type_id'] );                              //Regular Time
		$this->assertEquals( $udt_arr[$date_epoch][1]['pay_code_id'], $this->policy_ids['pay_code'][100] ); //Regular Time
		$this->assertEquals( $udt_arr[$date_epoch][1]['total_time'], ( 12 * 3600 ) );
		//Make sure no other hours
		$this->assertCount( 2, $udt_arr[$date_epoch] );


		//
		//Day of Week: 2
		//
		$date_epoch = TTDate::incrementDate( TTDate::getMiddleDayEpoch( TTDate::getBeginWeekEpoch( time() ) ), 1, 'day' );
		$date_stamp = TTDate::getDate( 'DATE', $date_epoch );

		$dd->createPunchPair( $this->user_id,
							  strtotime( $date_stamp . ' 8:00AM' ),
							  strtotime( $date_stamp . ' 8:00PM' ),
							  [
									  'in_type_id'    => 10,
									  'out_type_id'   => 10,
									  'branch_id'     => 0,
									  'department_id' => 0,
									  'job_id'        => 0,
									  'job_item_id'   => 0,
									  'punch_tag_id'  => []
							  ],
							  true
		);

		$udt_arr = $this->getUserDateTotalArray( $date_epoch, $date_epoch );
		//Total Time
		$this->assertEquals( 5, $udt_arr[$date_epoch][0]['object_type_id'] );                               //5=System Total
		$this->assertEquals( $udt_arr[$date_epoch][0]['pay_code_id'], TTUUID::getZeroID() );
		$this->assertEquals( $udt_arr[$date_epoch][0]['total_time'], ( 12 * 3600 ) );
		//Regular Time
		$this->assertEquals( 20, $udt_arr[$date_epoch][1]['object_type_id'] );                              //Regular Time
		$this->assertEquals( $udt_arr[$date_epoch][1]['pay_code_id'], $this->policy_ids['pay_code'][100] ); //Regular Time
		$this->assertEquals( $udt_arr[$date_epoch][1]['total_time'], ( 12 * 3600 ) );
		//Make sure no other hours
		$this->assertCount( 2, $udt_arr[$date_epoch] );

		//
		//Day of Week: 3
		//
		$date_epoch = TTDate::incrementDate( TTDate::getMiddleDayEpoch( TTDate::getBeginWeekEpoch( time() ) ), 2, 'day' );
		$date_stamp = TTDate::getDate( 'DATE', $date_epoch );

		$dd->createPunchPair( $this->user_id,
							  strtotime( $date_stamp . ' 8:00AM' ),
							  strtotime( $date_stamp . ' 8:00PM' ),
							  [
									  'in_type_id'    => 10,
									  'out_type_id'   => 10,
									  'branch_id'     => 0,
									  'department_id' => 0,
									  'job_id'        => 0,
									  'job_item_id'   => 0,
									  'punch_tag_id'  => []
							  ],
							  true
		);

		$udt_arr = $this->getUserDateTotalArray( $date_epoch, $date_epoch );
		//print_r($udt_arr);
		//Total Time
		$this->assertEquals( 5, $udt_arr[$date_epoch][0]['object_type_id'] );                               //5=System Total
		$this->assertEquals( $udt_arr[$date_epoch][0]['pay_code_id'], TTUUID::getZeroID() );
		$this->assertEquals( $udt_arr[$date_epoch][0]['total_time'], ( 12 * 3600 ) );
		//Regular Time
		$this->assertEquals( 20, $udt_arr[$date_epoch][1]['object_type_id'] );                              //Regular Time
		$this->assertEquals( $udt_arr[$date_epoch][1]['pay_code_id'], $this->policy_ids['pay_code'][100] ); //Regular Time
		$this->assertEquals( $udt_arr[$date_epoch][1]['total_time'], ( 12 * 3600 ) );
		//Make sure no other hours
		$this->assertCount( 2, $udt_arr[$date_epoch] );

		//
		//Day of Week: 4 (Absence to be included in Weekly OT)
		//
		$date_epoch = TTDate::incrementDate( TTDate::getMiddleDayEpoch( TTDate::getBeginWeekEpoch( time() ) ), 3, 'day' );
		$this->assertEquals( $this->getCurrentAccrualBalance( $this->user_id, $this->policy_ids['accrual_policy_account'][10] ), ( 0 * 3600 ) );
		$dd->createAbsence( $this->user_id, $date_epoch, ( 12 * 3600 ), $this->policy_ids['absence'][10] );
		$this->assertEquals( $this->getCurrentAccrualBalance( $this->user_id, $this->policy_ids['accrual_policy_account'][10] ), ( -12 * 3600 ) );

		$udt_arr = $this->getUserDateTotalArray( $date_epoch, $date_epoch );
		//print_r($udt_arr);

		//Total Time
		$this->assertEquals( 5, $udt_arr[$date_epoch][0]['object_type_id'] );                               //5=System Total
		$this->assertEquals( $udt_arr[$date_epoch][0]['pay_code_id'], TTUUID::getZeroID() );
		$this->assertEquals( $udt_arr[$date_epoch][0]['total_time'], ( 12 * 3600 ) );
		//Absence Time
		$this->assertEquals( 25, $udt_arr[$date_epoch][1]['object_type_id'] );                              //Absence Time
		$this->assertEquals( $udt_arr[$date_epoch][1]['pay_code_id'], $this->policy_ids['pay_code'][900] ); //Regular Time
		$this->assertEquals( $udt_arr[$date_epoch][1]['total_time'], ( 11 * 3600 ) );
		//Overtime 1
		$this->assertEquals( 30, $udt_arr[$date_epoch][2]['object_type_id'] );                              //OverTime
		$this->assertEquals( $udt_arr[$date_epoch][2]['pay_code_id'], $policy_ids['pay_code'][0] );
		$this->assertEquals( $udt_arr[$date_epoch][2]['total_time'], ( 1 * 3600 ) );

		//Make sure no other hours
		$this->assertCount( 3, $udt_arr[$date_epoch] );

		//
		//Day of Week: 5 (Absence to be included in Weekly OT)
		//
		$date_epoch = TTDate::incrementDate( TTDate::getMiddleDayEpoch( TTDate::getBeginWeekEpoch( time() ) ), 4, 'day' );
		$absence_id = $dd->createAbsence( $this->user_id, $date_epoch, ( 12 * 3600 ), $this->policy_ids['absence'][10] );
		$this->assertEquals( $this->getCurrentAccrualBalance( $this->user_id, $this->policy_ids['accrual_policy_account'][10] ), ( -24 * 3600 ) );


		$udt_arr = $this->getUserDateTotalArray( $date_epoch, $date_epoch );
		//print_r($udt_arr);

		//Total Time
		$this->assertEquals( 5, $udt_arr[$date_epoch][0]['object_type_id'] );                               //5=System Total
		$this->assertEquals( $udt_arr[$date_epoch][0]['pay_code_id'], TTUUID::getZeroID() );
		$this->assertEquals( $udt_arr[$date_epoch][0]['total_time'], ( 12 * 3600 ) );
		//Overtime 2
		$this->assertEquals( 30, $udt_arr[$date_epoch][1]['object_type_id'] );                              //Over Time
		$this->assertEquals( $udt_arr[$date_epoch][1]['pay_code_id'], $policy_ids['pay_code'][1] );
		$this->assertEquals( $udt_arr[$date_epoch][1]['total_time'], ( 1 * 3600 ) );
		//Overtime 1
		$this->assertEquals( 30, $udt_arr[$date_epoch][2]['object_type_id'] );                              //Over Time
		$this->assertEquals( $udt_arr[$date_epoch][2]['pay_code_id'], $policy_ids['pay_code'][0] );
		$this->assertEquals( $udt_arr[$date_epoch][2]['total_time'], ( 11 * 3600 ) );
		//Make sure no other hours
		$this->assertCount( 3, $udt_arr[$date_epoch] );

		//
		//Day of Week: 6 (Absence to be included in Weekly OT)
		//
		$date_epoch = TTDate::incrementDate( TTDate::getMiddleDayEpoch( TTDate::getBeginWeekEpoch( time() ) ), 5, 'day' );
		$dd->createAbsence( $this->user_id, $date_epoch, ( 12 * 3600 ), $this->policy_ids['absence'][10] );
		$this->assertEquals( $this->getCurrentAccrualBalance( $this->user_id, $this->policy_ids['accrual_policy_account'][10] ), ( -36 * 3600 ) );

		$udt_arr = $this->getUserDateTotalArray( $date_epoch, $date_epoch );
		//print_r($udt_arr);

		//Total Time
		$this->assertEquals( 5, $udt_arr[$date_epoch][0]['object_type_id'] );                               //5=System Total
		$this->assertEquals( $udt_arr[$date_epoch][0]['pay_code_id'], TTUUID::getZeroID() );
		$this->assertEquals( $udt_arr[$date_epoch][0]['total_time'], ( 12 * 3600 ) );
		//Overtime 2
		$this->assertEquals( 30, $udt_arr[$date_epoch][1]['object_type_id'] );                              //Over Time
		$this->assertEquals( $udt_arr[$date_epoch][1]['pay_code_id'], $policy_ids['pay_code'][2] );
		$this->assertEquals( $udt_arr[$date_epoch][1]['total_time'], ( 1 * 3600 ) );
		//Overtime 1
		$this->assertEquals( 30, $udt_arr[$date_epoch][2]['object_type_id'] );                              //Over Time
		$this->assertEquals( $udt_arr[$date_epoch][2]['pay_code_id'], $policy_ids['pay_code'][1] );
		$this->assertEquals( $udt_arr[$date_epoch][2]['total_time'], ( 11 * 3600 ) );
		//Make sure no other hours
		$this->assertCount( 3, $udt_arr[$date_epoch] );

		$this->assertEquals( $this->getCurrentAccrualBalance( $this->user_id, $this->policy_ids['accrual_policy_account'][10] ), ( -36 * 3600 ) );

		//Delete absence in the middle of the week and confirm balance is still correct.
		$dd->deleteAbsence( $absence_id );
		$this->assertEquals( $this->getCurrentAccrualBalance( $this->user_id, $this->policy_ids['accrual_policy_account'][10] ), ( -24 * 3600 ) );

		return true;
	}

	/**
	 * @group OvertimePolicy_testWeeklyOverTimeWithAbsencePolicyD
	 */
	function testWeeklyOverTimeWithAbsencePolicyD() {
		//Test with schedule absence and auto-deduct lunch at the end of the week, where it switched into OT.
		global $dd;

		$policy_ids['pay_formula_policy'][] = $this->createPayFormulaPolicy( $this->company_id, 200 ); //OT1.5
		$policy_ids['pay_formula_policy'][] = $this->createPayFormulaPolicy( $this->company_id, 210 ); //OT2.0
		$policy_ids['pay_formula_policy'][] = $this->createPayFormulaPolicy( $this->company_id, 220 ); //OT2.5

		$policy_ids['pay_code'][] = $this->createPayCode( $this->company_id, 200, $policy_ids['pay_formula_policy'][0] );
		$policy_ids['pay_code'][] = $this->createPayCode( $this->company_id, 210, $policy_ids['pay_formula_policy'][1] );
		$policy_ids['pay_code'][] = $this->createPayCode( $this->company_id, 220, $policy_ids['pay_formula_policy'][2] );

		$policy_ids['overtime'][] = $this->createOverTimePolicy( $this->company_id, 200, $this->policy_ids['contributing_shift_policy'][14], $policy_ids['pay_code'][0] );
		$policy_ids['overtime'][] = $this->createOverTimePolicy( $this->company_id, 210, $this->policy_ids['contributing_shift_policy'][14], $policy_ids['pay_code'][1] );
		$policy_ids['overtime'][] = $this->createOverTimePolicy( $this->company_id, 220, $this->policy_ids['contributing_shift_policy'][14], $policy_ids['pay_code'][2] );
		//print_r($policy_ids['overtime']);

		$policy_ids['meal'][] = $this->createMealPolicy( $this->company_id, 120 );                          //AutoDeduct 1hr

		$schedule_policy_id = $this->createSchedulePolicy( 10, $policy_ids['meal'][0] );

		//Create Policy Group
		$dd->createPolicyGroup( $this->company_id,
								null, //Meal
								null, //Exception
								null, //Holiday
								$policy_ids['overtime'], //OT
								null, //Premium
								null, //Round
								[ $this->user_id ], //Users
								null, //Break
								null, //Accrual
								null, //Expense
								[ $this->policy_ids['absence'][10] ], //Absence
								[ $this->policy_ids['regular'][12] ] //Regular
		);

		$this->assertEquals( $this->getCurrentAccrualBalance( $this->user_id, $this->policy_ids['accrual_policy_account'][10] ), ( 0 * 3600 ) );


		//
		//Day of Week: 1
		//
		$date_epoch = TTDate::getMiddleDayEpoch( TTDate::getBeginWeekEpoch( time() ) );
		$date_stamp = TTDate::getDate( 'DATE', $date_epoch );

		$dd->createPunchPair( $this->user_id,
							  strtotime( $date_stamp . ' 8:00AM' ),
							  strtotime( $date_stamp . ' 8:00PM' ),
							  [
									  'in_type_id'    => 10,
									  'out_type_id'   => 10,
									  'branch_id'     => 0,
									  'department_id' => 0,
									  'job_id'        => 0,
									  'job_item_id'   => 0,
									  'punch_tag_id'  => []
							  ],
							  true
		);

		$udt_arr = $this->getUserDateTotalArray( $date_epoch, $date_epoch );
		//print_r($udt_arr);
		//Total Time
		$this->assertEquals( 5, $udt_arr[$date_epoch][0]['object_type_id'] );                               //5=System Total
		$this->assertEquals( $udt_arr[$date_epoch][0]['pay_code_id'], TTUUID::getZeroID() );
		$this->assertEquals( $udt_arr[$date_epoch][0]['total_time'], ( 12 * 3600 ) );
		//Regular Time
		$this->assertEquals( 20, $udt_arr[$date_epoch][1]['object_type_id'] );                              //Regular Time
		$this->assertEquals( $udt_arr[$date_epoch][1]['pay_code_id'], $this->policy_ids['pay_code'][100] ); //Regular Time
		$this->assertEquals( $udt_arr[$date_epoch][1]['total_time'], ( 12 * 3600 ) );
		//Make sure no other hours
		$this->assertCount( 2, $udt_arr[$date_epoch] );


		//
		//Day of Week: 2
		//
		$date_epoch = TTDate::incrementDate( TTDate::getMiddleDayEpoch( TTDate::getBeginWeekEpoch( time() ) ), 1, 'day' );
		$date_stamp = TTDate::getDate( 'DATE', $date_epoch );

		$dd->createPunchPair( $this->user_id,
							  strtotime( $date_stamp . ' 8:00AM' ),
							  strtotime( $date_stamp . ' 8:00PM' ),
							  [
									  'in_type_id'    => 10,
									  'out_type_id'   => 10,
									  'branch_id'     => 0,
									  'department_id' => 0,
									  'job_id'        => 0,
									  'job_item_id'   => 0,
									  'punch_tag_id'  => []
							  ],
							  true
		);

		$udt_arr = $this->getUserDateTotalArray( $date_epoch, $date_epoch );
		//Total Time
		$this->assertEquals( 5, $udt_arr[$date_epoch][0]['object_type_id'] );                               //5=System Total
		$this->assertEquals( $udt_arr[$date_epoch][0]['pay_code_id'], TTUUID::getZeroID() );
		$this->assertEquals( $udt_arr[$date_epoch][0]['total_time'], ( 12 * 3600 ) );
		//Regular Time
		$this->assertEquals( 20, $udt_arr[$date_epoch][1]['object_type_id'] );                              //Regular Time
		$this->assertEquals( $udt_arr[$date_epoch][1]['pay_code_id'], $this->policy_ids['pay_code'][100] ); //Regular Time
		$this->assertEquals( $udt_arr[$date_epoch][1]['total_time'], ( 12 * 3600 ) );
		//Make sure no other hours
		$this->assertCount( 2, $udt_arr[$date_epoch] );

		//
		//Day of Week: 3
		//
		$date_epoch = TTDate::incrementDate( TTDate::getMiddleDayEpoch( TTDate::getBeginWeekEpoch( time() ) ), 2, 'day' );
		$date_stamp = TTDate::getDate( 'DATE', $date_epoch );

		$dd->createPunchPair( $this->user_id,
							  strtotime( $date_stamp . ' 8:00AM' ),
							  strtotime( $date_stamp . ' 8:00PM' ),
							  [
									  'in_type_id'    => 10,
									  'out_type_id'   => 10,
									  'branch_id'     => 0,
									  'department_id' => 0,
									  'job_id'        => 0,
									  'job_item_id'   => 0,
									  'punch_tag_id'  => []
							  ],
							  true
		);

		$udt_arr = $this->getUserDateTotalArray( $date_epoch, $date_epoch );
		//print_r($udt_arr);
		//Total Time
		$this->assertEquals( 5, $udt_arr[$date_epoch][0]['object_type_id'] );                               //5=System Total
		$this->assertEquals( $udt_arr[$date_epoch][0]['pay_code_id'], TTUUID::getZeroID() );
		$this->assertEquals( $udt_arr[$date_epoch][0]['total_time'], ( 12 * 3600 ) );
		//Regular Time
		$this->assertEquals( 20, $udt_arr[$date_epoch][1]['object_type_id'] );                              //Regular Time
		$this->assertEquals( $udt_arr[$date_epoch][1]['pay_code_id'], $this->policy_ids['pay_code'][100] ); //Regular Time
		$this->assertEquals( $udt_arr[$date_epoch][1]['total_time'], ( 12 * 3600 ) );
		//Make sure no other hours
		$this->assertCount( 2, $udt_arr[$date_epoch] );

		//
		//Day of Week: 4 (Absence to be included in Weekly OT)
		//
		$date_epoch = TTDate::incrementDate( TTDate::getMiddleDayEpoch( TTDate::getBeginWeekEpoch( time() ) ), 3, 'day' );
		$this->assertEquals( $this->getCurrentAccrualBalance( $this->user_id, $this->policy_ids['accrual_policy_account'][10] ), ( 0 * 3600 ) );
		//$dd->createAbsence( $this->user_id, $date_epoch, (12 * 3600), $this->policy_ids['absence'][10] );
		$schedule_id = $this->createSchedule( $this->user_id, $date_epoch, [
				'status_id'          => 20, //Absence
				'absence_policy_id'  => $this->policy_ids['absence'][10],
				'schedule_policy_id' => $schedule_policy_id,
				'start_time'         => '8:00AM',
				'end_time'           => '9:00PM',
		] );

		$this->assertEquals( $this->getCurrentAccrualBalance( $this->user_id, $this->policy_ids['accrual_policy_account'][10] ), ( -12 * 3600 ) );

		$udt_arr = $this->getUserDateTotalArray( $date_epoch, $date_epoch );
		//print_r($udt_arr);

		//Total Time
		$this->assertEquals( 5, $udt_arr[$date_epoch][0]['object_type_id'] );                               //5=System Total
		$this->assertEquals( $udt_arr[$date_epoch][0]['pay_code_id'], TTUUID::getZeroID() );
		$this->assertEquals( $udt_arr[$date_epoch][0]['total_time'], ( 12 * 3600 ) );
		//Absence Time
		$this->assertEquals( 25, $udt_arr[$date_epoch][1]['object_type_id'] );                              //Absence Time
		$this->assertEquals( $udt_arr[$date_epoch][1]['pay_code_id'], $this->policy_ids['pay_code'][900] ); //Regular Time
		$this->assertEquals( $udt_arr[$date_epoch][1]['total_time'], ( 11 * 3600 ) );
		//Overtime 1
		$this->assertEquals( 30, $udt_arr[$date_epoch][2]['object_type_id'] );                              //OverTime
		$this->assertEquals( $udt_arr[$date_epoch][2]['pay_code_id'], $policy_ids['pay_code'][0] );
		$this->assertEquals( $udt_arr[$date_epoch][2]['total_time'], ( 1 * 3600 ) );

		//Make sure no other hours
		$this->assertCount( 3, $udt_arr[$date_epoch] );

		//
		//Day of Week: 5 (Absence to be included in Weekly OT)
		//
		$date_epoch = TTDate::incrementDate( TTDate::getMiddleDayEpoch( TTDate::getBeginWeekEpoch( time() ) ), 4, 'day' );
		//$dd->createAbsence( $this->user_id, $date_epoch, (12 * 3600), $this->policy_ids['absence'][10] );
		$this->createSchedule( $this->user_id, $date_epoch, [
				'status_id'          => 20, //Absence
				'absence_policy_id'  => $this->policy_ids['absence'][10],
				'schedule_policy_id' => $schedule_policy_id,
				'start_time'         => '8:00AM',
				'end_time'           => '9:00PM',
		] );

		$this->assertEquals( $this->getCurrentAccrualBalance( $this->user_id, $this->policy_ids['accrual_policy_account'][10] ), ( -24 * 3600 ) );


		$udt_arr = $this->getUserDateTotalArray( $date_epoch, $date_epoch );
		//print_r($udt_arr);

		//Total Time
		$this->assertEquals( 5, $udt_arr[$date_epoch][0]['object_type_id'] );                               //5=System Total
		$this->assertEquals( $udt_arr[$date_epoch][0]['pay_code_id'], TTUUID::getZeroID() );
		$this->assertEquals( $udt_arr[$date_epoch][0]['total_time'], ( 12 * 3600 ) );
		//Overtime 2
		$this->assertEquals( 30, $udt_arr[$date_epoch][1]['object_type_id'] );                              //Over Time
		$this->assertEquals( $udt_arr[$date_epoch][1]['pay_code_id'], $policy_ids['pay_code'][1] );
		$this->assertEquals( $udt_arr[$date_epoch][1]['total_time'], ( 1 * 3600 ) );
		//Overtime 1
		$this->assertEquals( 30, $udt_arr[$date_epoch][2]['object_type_id'] );                              //Over Time
		$this->assertEquals( $udt_arr[$date_epoch][2]['pay_code_id'], $policy_ids['pay_code'][0] );
		$this->assertEquals( $udt_arr[$date_epoch][2]['total_time'], ( 11 * 3600 ) );
		//Make sure no other hours
		$this->assertCount( 3, $udt_arr[$date_epoch] );

		//
		//Day of Week: 6 (Absence to be included in Weekly OT)
		//
		$date_epoch = TTDate::incrementDate( TTDate::getMiddleDayEpoch( TTDate::getBeginWeekEpoch( time() ) ), 5, 'day' );
		$this->createSchedule( $this->user_id, $date_epoch, [
				'status_id'          => 20, //Absence
				'absence_policy_id'  => $this->policy_ids['absence'][10],
				'schedule_policy_id' => $schedule_policy_id,
				'start_time'         => '8:00AM',
				'end_time'           => '9:00PM',
		] );

		//$dd->createAbsence( $this->user_id, $date_epoch, (12 * 3600), $this->policy_ids['absence'][10] );
		$this->assertEquals( $this->getCurrentAccrualBalance( $this->user_id, $this->policy_ids['accrual_policy_account'][10] ), ( -36 * 3600 ) );

		$udt_arr = $this->getUserDateTotalArray( $date_epoch, $date_epoch );
		//print_r($udt_arr);

		//Total Time
		$this->assertEquals( 5, $udt_arr[$date_epoch][0]['object_type_id'] );                               //5=System Total
		$this->assertEquals( $udt_arr[$date_epoch][0]['pay_code_id'], TTUUID::getZeroID() );
		$this->assertEquals( $udt_arr[$date_epoch][0]['total_time'], ( 12 * 3600 ) );
		//Overtime 2
		$this->assertEquals( 30, $udt_arr[$date_epoch][1]['object_type_id'] );                              //Over Time
		$this->assertEquals( $udt_arr[$date_epoch][1]['pay_code_id'], $policy_ids['pay_code'][2] );
		$this->assertEquals( $udt_arr[$date_epoch][1]['total_time'], ( 1 * 3600 ) );
		//Overtime 1
		$this->assertEquals( 30, $udt_arr[$date_epoch][2]['object_type_id'] );                              //Over Time
		$this->assertEquals( $udt_arr[$date_epoch][2]['pay_code_id'], $policy_ids['pay_code'][1] );
		$this->assertEquals( $udt_arr[$date_epoch][2]['total_time'], ( 11 * 3600 ) );
		//Make sure no other hours
		$this->assertCount( 3, $udt_arr[$date_epoch] );

		$this->assertEquals( $this->getCurrentAccrualBalance( $this->user_id, $this->policy_ids['accrual_policy_account'][10] ), ( -36 * 3600 ) );


		//Delete scheduled absence in the middle of the week and confirm balance is still correct.
		$dd->deleteSchedule( $schedule_id );
		$this->assertEquals( $this->getCurrentAccrualBalance( $this->user_id, $this->policy_ids['accrual_policy_account'][10] ), ( -24 * 3600 ) );

		return true;
	}


	/**
	 * @group OvertimePolicy_testWeeklyOverTimeWithAdjustTriggerAndAbsencePolicyA
	 */
	function testWeeklyOverTimeWithAdjustTriggerAndAbsencePolicyA() {
		if ( getTTProductEdition() == TT_PRODUCT_COMMUNITY ) {
			return true;
		}

		global $dd;

		$policy_ids['pay_formula_policy'][] = $this->createPayFormulaPolicy( $this->company_id, 200 ); //OT1.5
		$policy_ids['pay_formula_policy'][] = $this->createPayFormulaPolicy( $this->company_id, 210 ); //OT2.0
		$policy_ids['pay_formula_policy'][] = $this->createPayFormulaPolicy( $this->company_id, 220 ); //OT2.5

		$policy_ids['pay_code'][] = $this->createPayCode( $this->company_id, 200, $policy_ids['pay_formula_policy'][0] );
		$policy_ids['pay_code'][] = $this->createPayCode( $this->company_id, 210, $policy_ids['pay_formula_policy'][1] );
		$policy_ids['pay_code'][] = $this->createPayCode( $this->company_id, 220, $policy_ids['pay_formula_policy'][2] );

		$policy_ids['overtime'][] = $this->createOverTimePolicy( $this->company_id, 200, $this->policy_ids['contributing_shift_policy'][12], $policy_ids['pay_code'][0], $this->policy_ids['contributing_shift_policy'][90] ); //Include adjusting contrib policy using just absences.
		//$policy_ids['overtime'][] = $this->createOverTimePolicy( $this->company_id, 210, $this->policy_ids['contributing_shift_policy'][12], $policy_ids['pay_code'][1], $this->policy_ids['contributing_shift_policy'][90] ); //Include adjusting contrib policy using just absences.
		//$policy_ids['overtime'][] = $this->createOverTimePolicy( $this->company_id, 220, $this->policy_ids['contributing_shift_policy'][12], $policy_ids['pay_code'][2], $this->policy_ids['contributing_shift_policy'][90] ); //Include adjusting contrib policy using just absences.
		//print_r($policy_ids['overtime']);

		//Create Policy Group
		$dd->createPolicyGroup( $this->company_id,
								null, //Meal
								null, //Exception
								null, //Holiday
								$policy_ids['overtime'], //OT
								null, //Premium
								null, //Round
								[ $this->user_id ], //Users
								null, //Break
								null, //Accrual
								null, //Expense
								[ $this->policy_ids['absence'][10] ], //Absence
								[ $this->policy_ids['regular'][12] ] //Regular
		);

		$date_epoch = TTDate::getMiddleDayEpoch( TTDate::getBeginWeekEpoch( time() ) );
		$date_stamp = TTDate::getDate( 'DATE', $date_epoch );

		$this->assertEquals( $this->getCurrentAccrualBalance( $this->user_id, $this->policy_ids['accrual_policy_account'][10] ), ( 0 * 3600 ) );

		//
		//Day of Week: 1
		//
		$dd->createPunchPair( $this->user_id,
							  strtotime( $date_stamp . ' 8:00AM' ),
							  strtotime( $date_stamp . ' 8:00PM' ),
							  [
									  'in_type_id'    => 10,
									  'out_type_id'   => 10,
									  'branch_id'     => 0,
									  'department_id' => 0,
									  'job_id'        => 0,
									  'job_item_id'   => 0,
									  'punch_tag_id'  => []
							  ],
							  true
		);

		$udt_arr = $this->getUserDateTotalArray( $date_epoch, $date_epoch );
		//print_r($udt_arr);
		//Total Time
		$this->assertEquals( 5, $udt_arr[$date_epoch][0]['object_type_id'] );                                                                                                                                                  //5=System Total
		$this->assertEquals( $udt_arr[$date_epoch][0]['pay_code_id'], TTUUID::getZeroID() );
		$this->assertEquals( $udt_arr[$date_epoch][0]['total_time'], ( 12 * 3600 ) );
		//Regular Time
		$this->assertEquals( 20, $udt_arr[$date_epoch][1]['object_type_id'] );                                                                                                                                                 //Regular Time
		$this->assertEquals( $udt_arr[$date_epoch][1]['pay_code_id'], $this->policy_ids['pay_code'][100] );                                                                                                                    //Regular Time
		$this->assertEquals( $udt_arr[$date_epoch][1]['total_time'], ( 12 * 3600 ) );
		//Make sure no other hours
		$this->assertCount( 2, $udt_arr[$date_epoch] );


		//
		//Day of Week: 2
		//
		$date_epoch = TTDate::incrementDate( TTDate::getMiddleDayEpoch( TTDate::getBeginWeekEpoch( time() ) ), 1, 'day' );
		$date_stamp = TTDate::getDate( 'DATE', $date_epoch );

		$dd->createPunchPair( $this->user_id,
							  strtotime( $date_stamp . ' 8:00AM' ),
							  strtotime( $date_stamp . ' 8:00PM' ),
							  [
									  'in_type_id'    => 10,
									  'out_type_id'   => 10,
									  'branch_id'     => 0,
									  'department_id' => 0,
									  'job_id'        => 0,
									  'job_item_id'   => 0,
									  'punch_tag_id'  => []
							  ],
							  true
		);

		$udt_arr = $this->getUserDateTotalArray( $date_epoch, $date_epoch );
		//Total Time
		$this->assertEquals( 5, $udt_arr[$date_epoch][0]['object_type_id'] );                                                                                                                                                  //5=System Total
		$this->assertEquals( $udt_arr[$date_epoch][0]['pay_code_id'], TTUUID::getZeroID() );
		$this->assertEquals( $udt_arr[$date_epoch][0]['total_time'], ( 12 * 3600 ) );
		//Regular Time
		$this->assertEquals( 20, $udt_arr[$date_epoch][1]['object_type_id'] );                                                                                                                                                 //Regular Time
		$this->assertEquals( $udt_arr[$date_epoch][1]['pay_code_id'], $this->policy_ids['pay_code'][100] );                                                                                                                    //Regular Time
		$this->assertEquals( $udt_arr[$date_epoch][1]['total_time'], ( 12 * 3600 ) );
		//Make sure no other hours
		$this->assertCount( 2, $udt_arr[$date_epoch] );

		//
		//Day of Week: 3
		//
		$date_epoch = TTDate::incrementDate( TTDate::getMiddleDayEpoch( TTDate::getBeginWeekEpoch( time() ) ), 2, 'day' );
		$date_stamp = TTDate::getDate( 'DATE', $date_epoch );

		$dd->createPunchPair( $this->user_id,
							  strtotime( $date_stamp . ' 8:00AM' ),
							  strtotime( $date_stamp . ' 8:00PM' ),
							  [
									  'in_type_id'    => 10,
									  'out_type_id'   => 10,
									  'branch_id'     => 0,
									  'department_id' => 0,
									  'job_id'        => 0,
									  'job_item_id'   => 0,
									  'punch_tag_id'  => []
							  ],
							  true
		);

		$udt_arr = $this->getUserDateTotalArray( $date_epoch, $date_epoch );
		//Total Time
		$this->assertEquals( 5, $udt_arr[$date_epoch][0]['object_type_id'] );                                                                                                                                                  //5=System Total
		$this->assertEquals( $udt_arr[$date_epoch][0]['pay_code_id'], TTUUID::getZeroID() );
		$this->assertEquals( $udt_arr[$date_epoch][0]['total_time'], ( 12 * 3600 ) );
		//Regular Time
		$this->assertEquals( 20, $udt_arr[$date_epoch][1]['object_type_id'] );                                                                                                                                                 //Regular Time
		$this->assertEquals( $udt_arr[$date_epoch][1]['pay_code_id'], $this->policy_ids['pay_code'][100] );                                                                                                                    //Regular Time
		$this->assertEquals( $udt_arr[$date_epoch][1]['total_time'], ( 12 * 3600 ) );
		//Make sure no other hours
		$this->assertCount( 2, $udt_arr[$date_epoch] );

		//
		//Day of Week: 4
		//
		$date_epoch = TTDate::incrementDate( TTDate::getMiddleDayEpoch( TTDate::getBeginWeekEpoch( time() ) ), 3, 'day' );
		$date_stamp = TTDate::getDate( 'DATE', $date_epoch );

		$dd->createPunchPair( $this->user_id,
							  strtotime( $date_stamp . ' 8:00AM' ),
							  strtotime( $date_stamp . ' 8:00PM' ),
							  [
									  'in_type_id'    => 10,
									  'out_type_id'   => 10,
									  'branch_id'     => 0,
									  'department_id' => 0,
									  'job_id'        => 0,
									  'job_item_id'   => 0,
									  'punch_tag_id'  => []
							  ],
							  true
		);

		$udt_arr = $this->getUserDateTotalArray( $date_epoch, $date_epoch );
		//print_r($udt_arr);
		//Total Time
		$this->assertEquals( 5, $udt_arr[$date_epoch][0]['object_type_id'] );                                                                                                                                                  //5=System Total
		$this->assertEquals( $udt_arr[$date_epoch][0]['pay_code_id'], TTUUID::getZeroID() );
		$this->assertEquals( $udt_arr[$date_epoch][0]['total_time'], ( 12 * 3600 ) );
		//Overtime 1
		$this->assertEquals( 30, $udt_arr[$date_epoch][2]['object_type_id'] );                                                                                                                                                 //OverTime
		$this->assertEquals( $udt_arr[$date_epoch][2]['pay_code_id'], $policy_ids['pay_code'][0] );
		$this->assertEquals( $udt_arr[$date_epoch][2]['total_time'], ( 1 * 3600 ) );
		//Overtime 2
		$this->assertEquals( 20, $udt_arr[$date_epoch][1]['object_type_id'] );                                                                                                                                                 //OverTime
		$this->assertEquals( $udt_arr[$date_epoch][1]['pay_code_id'], $this->policy_ids['pay_code'][100] );
		$this->assertEquals( $udt_arr[$date_epoch][1]['total_time'], ( 11 * 3600 ) );
		//Make sure no other hours
		$this->assertCount( 3, $udt_arr[$date_epoch] );

		//
		//Day of Week: 5
		//
		$date_epoch = TTDate::incrementDate( TTDate::getMiddleDayEpoch( TTDate::getBeginWeekEpoch( time() ) ), 4, 'day' );
		$this->assertEquals( $this->getCurrentAccrualBalance( $this->user_id, $this->policy_ids['accrual_policy_account'][10] ), ( 0 * 3600 ) );
		$dd->createAbsence( $this->user_id, $date_epoch, ( 12 * 3600 ), $this->policy_ids['absence'][10] );
		$this->assertEquals( $this->getCurrentAccrualBalance( $this->user_id, $this->policy_ids['accrual_policy_account'][10] ), ( -12 * 3600 ) );

		$udt_arr = $this->getUserDateTotalArray( $date_epoch, $date_epoch );
		//print_r($udt_arr);

		//Total Time
		$this->assertEquals( 5, $udt_arr[$date_epoch][0]['object_type_id'] );                                                                                                                                                  //5=System Total
		$this->assertEquals( $udt_arr[$date_epoch][0]['pay_code_id'], TTUUID::getZeroID() );
		$this->assertEquals( $udt_arr[$date_epoch][0]['total_time'], ( 12 * 3600 ) );
		//Absence Time
		$this->assertEquals( 25, $udt_arr[$date_epoch][1]['object_type_id'] );                                                                                                                                                 //Absence Time
		$this->assertEquals( $udt_arr[$date_epoch][1]['pay_code_id'], $this->policy_ids['pay_code'][900] );                                                                                                                    //Regular Time
		$this->assertEquals( $udt_arr[$date_epoch][1]['total_time'], ( 12 * 3600 ) );
		//Make sure no other hours
		$this->assertCount( 2, $udt_arr[$date_epoch] );

		//
		//Day of Week: 6
		//
		$date_epoch = TTDate::incrementDate( TTDate::getMiddleDayEpoch( TTDate::getBeginWeekEpoch( time() ) ), 5, 'day' );
		$date_stamp = TTDate::getDate( 'DATE', $date_epoch );

		$dd->createPunchPair( $this->user_id,
							  strtotime( $date_stamp . ' 8:00AM' ),
							  strtotime( $date_stamp . ' 8:00PM' ),
							  [
									  'in_type_id'    => 10,
									  'out_type_id'   => 10,
									  'branch_id'     => 0,
									  'department_id' => 0,
									  'job_id'        => 0,
									  'job_item_id'   => 0,
									  'punch_tag_id'  => []
							  ],
							  true
		);

		$udt_arr = $this->getUserDateTotalArray( $date_epoch, $date_epoch );
		//print_r($udt_arr);
		//Total Time
		$this->assertEquals( 5, $udt_arr[$date_epoch][0]['object_type_id'] );                                                                                                                                                  //5=System Total
		$this->assertEquals( $udt_arr[$date_epoch][0]['pay_code_id'], TTUUID::getZeroID() );
		$this->assertEquals( $udt_arr[$date_epoch][0]['total_time'], ( 12 * 3600 ) );
		//Overtime 2
		$this->assertEquals( 30, $udt_arr[$date_epoch][1]['object_type_id'] );                                                                                                                                                 //OverTime
		$this->assertEquals( $udt_arr[$date_epoch][1]['pay_code_id'], $policy_ids['pay_code'][0] );
		$this->assertEquals( $udt_arr[$date_epoch][1]['total_time'], ( 12 * 3600 ) );
		//Make sure no other hours
		$this->assertCount( 2, $udt_arr[$date_epoch] );

		$this->assertEquals( $this->getCurrentAccrualBalance( $this->user_id, $this->policy_ids['accrual_policy_account'][10] ), ( -12 * 3600 ) );

		return true;
	}

	/**
	 * @group OvertimePolicy_testWeeklyOverTimeWithAdjustTriggerAndAbsencePolicyB
	 */
	function testWeeklyOverTimeWithAdjustTriggerAndAbsencePolicyB() {
		if ( getTTProductEdition() == TT_PRODUCT_COMMUNITY ) {
			return true;
		}

		global $dd;

		$policy_ids['pay_formula_policy'][] = $this->createPayFormulaPolicy( $this->company_id, 200 ); //OT1.5
		$policy_ids['pay_formula_policy'][] = $this->createPayFormulaPolicy( $this->company_id, 210 ); //OT2.0
		$policy_ids['pay_formula_policy'][] = $this->createPayFormulaPolicy( $this->company_id, 220 ); //OT2.5

		$policy_ids['pay_code'][] = $this->createPayCode( $this->company_id, 200, $policy_ids['pay_formula_policy'][0] );
		$policy_ids['pay_code'][] = $this->createPayCode( $this->company_id, 210, $policy_ids['pay_formula_policy'][1] );
		$policy_ids['pay_code'][] = $this->createPayCode( $this->company_id, 220, $policy_ids['pay_formula_policy'][2] );

		$policy_ids['overtime'][] = $this->createOverTimePolicy( $this->company_id, 200, $this->policy_ids['contributing_shift_policy'][14], $policy_ids['pay_code'][0], $this->policy_ids['contributing_shift_policy'][90] ); //Include adjusting contrib policy using just absences.
		$policy_ids['overtime'][] = $this->createOverTimePolicy( $this->company_id, 210, $this->policy_ids['contributing_shift_policy'][14], $policy_ids['pay_code'][1], $this->policy_ids['contributing_shift_policy'][90] ); //Include adjusting contrib policy using just absences.
		$policy_ids['overtime'][] = $this->createOverTimePolicy( $this->company_id, 220, $this->policy_ids['contributing_shift_policy'][14], $policy_ids['pay_code'][2], $this->policy_ids['contributing_shift_policy'][90] ); //Include adjusting contrib policy using just absences.
		//print_r($policy_ids['overtime']);

		//Create Policy Group
		$dd->createPolicyGroup( $this->company_id,
								null, //Meal
								null, //Exception
								null, //Holiday
								$policy_ids['overtime'], //OT
								null, //Premium
								null, //Round
								[ $this->user_id ], //Users
								null, //Break
								null, //Accrual
								null, //Expense
								[ $this->policy_ids['absence'][10] ], //Absence
								[ $this->policy_ids['regular'][12] ] //Regular
		);

		$date_epoch = TTDate::getMiddleDayEpoch( TTDate::getBeginWeekEpoch( time() ) );
		$date_stamp = TTDate::getDate( 'DATE', $date_epoch );

		$this->assertEquals( $this->getCurrentAccrualBalance( $this->user_id, $this->policy_ids['accrual_policy_account'][10] ), ( 0 * 3600 ) );

		//
		//Day of Week: 1
		//
		$dd->createPunchPair( $this->user_id,
							  strtotime( $date_stamp . ' 8:00AM' ),
							  strtotime( $date_stamp . ' 8:00PM' ),
							  [
									  'in_type_id'    => 10,
									  'out_type_id'   => 10,
									  'branch_id'     => 0,
									  'department_id' => 0,
									  'job_id'        => 0,
									  'job_item_id'   => 0,
									  'punch_tag_id'  => []
							  ],
							  true
		);

		$udt_arr = $this->getUserDateTotalArray( $date_epoch, $date_epoch );
		//print_r($udt_arr);
		//Total Time
		$this->assertEquals( 5, $udt_arr[$date_epoch][0]['object_type_id'] );                                                                                                                                                  //5=System Total
		$this->assertEquals( $udt_arr[$date_epoch][0]['pay_code_id'], TTUUID::getZeroID() );
		$this->assertEquals( $udt_arr[$date_epoch][0]['total_time'], ( 12 * 3600 ) );
		//Regular Time
		$this->assertEquals( 20, $udt_arr[$date_epoch][1]['object_type_id'] );                                                                                                                                                 //Regular Time
		$this->assertEquals( $udt_arr[$date_epoch][1]['pay_code_id'], $this->policy_ids['pay_code'][100] );                                                                                                                    //Regular Time
		$this->assertEquals( $udt_arr[$date_epoch][1]['total_time'], ( 12 * 3600 ) );
		//Make sure no other hours
		$this->assertCount( 2, $udt_arr[$date_epoch] );


		//
		//Day of Week: 2 (Absence to be included in Weekly OT)
		//
		$date_epoch = TTDate::incrementDate( TTDate::getMiddleDayEpoch( TTDate::getBeginWeekEpoch( time() ) ), 1, 'day' );
		$this->assertEquals( $this->getCurrentAccrualBalance( $this->user_id, $this->policy_ids['accrual_policy_account'][10] ), ( 0 * 3600 ) );
		$dd->createAbsence( $this->user_id, $date_epoch, ( 12 * 3600 ), $this->policy_ids['absence'][10] );
		$this->assertEquals( $this->getCurrentAccrualBalance( $this->user_id, $this->policy_ids['accrual_policy_account'][10] ), ( -12 * 3600 ) );

		$udt_arr = $this->getUserDateTotalArray( $date_epoch, $date_epoch );
		//print_r($udt_arr);

		//Total Time
		$this->assertEquals( 5, $udt_arr[$date_epoch][0]['object_type_id'] );                                                                                                                                                  //5=System Total
		$this->assertEquals( $udt_arr[$date_epoch][0]['pay_code_id'], TTUUID::getZeroID() );
		$this->assertEquals( $udt_arr[$date_epoch][0]['total_time'], ( 12 * 3600 ) );
		//Absence Time
		$this->assertEquals( 25, $udt_arr[$date_epoch][1]['object_type_id'] );                                                                                                                                                 //Absence Time
		$this->assertEquals( $udt_arr[$date_epoch][1]['pay_code_id'], $this->policy_ids['pay_code'][900] );                                                                                                                    //Regular Time
		$this->assertEquals( $udt_arr[$date_epoch][1]['total_time'], ( 12 * 3600 ) );
		//Make sure no other hours
		$this->assertCount( 2, $udt_arr[$date_epoch] );

		//
		//Day of Week: 3
		//
		$date_epoch = TTDate::incrementDate( TTDate::getMiddleDayEpoch( TTDate::getBeginWeekEpoch( time() ) ), 2, 'day' );
		$date_stamp = TTDate::getDate( 'DATE', $date_epoch );

		$dd->createPunchPair( $this->user_id,
							  strtotime( $date_stamp . ' 8:00AM' ),
							  strtotime( $date_stamp . ' 8:00PM' ),
							  [
									  'in_type_id'    => 10,
									  'out_type_id'   => 10,
									  'branch_id'     => 0,
									  'department_id' => 0,
									  'job_id'        => 0,
									  'job_item_id'   => 0,
									  'punch_tag_id'  => []
							  ],
							  true
		);

		$udt_arr = $this->getUserDateTotalArray( $date_epoch, $date_epoch );
		//Total Time
		$this->assertEquals( 5, $udt_arr[$date_epoch][0]['object_type_id'] );                                                                                                                                                  //5=System Total
		$this->assertEquals( $udt_arr[$date_epoch][0]['pay_code_id'], TTUUID::getZeroID() );
		$this->assertEquals( $udt_arr[$date_epoch][0]['total_time'], ( 12 * 3600 ) );
		//Regular Time
		$this->assertEquals( 20, $udt_arr[$date_epoch][1]['object_type_id'] );                                                                                                                                                 //Regular Time
		$this->assertEquals( $udt_arr[$date_epoch][1]['pay_code_id'], $this->policy_ids['pay_code'][100] );                                                                                                                    //Regular Time
		$this->assertEquals( $udt_arr[$date_epoch][1]['total_time'], ( 11 * 3600 ) );
		//Overtime 1
		$this->assertEquals( 30, $udt_arr[$date_epoch][2]['object_type_id'] );                                                                                                                                                 //OverTime
		$this->assertEquals( $udt_arr[$date_epoch][2]['pay_code_id'], $policy_ids['pay_code'][0] );
		$this->assertEquals( $udt_arr[$date_epoch][2]['total_time'], ( 1 * 3600 ) );
		//Make sure no other hours
		$this->assertCount( 3, $udt_arr[$date_epoch] );

		//
		//Day of Week: 4
		//
		$date_epoch = TTDate::incrementDate( TTDate::getMiddleDayEpoch( TTDate::getBeginWeekEpoch( time() ) ), 3, 'day' );
		$date_stamp = TTDate::getDate( 'DATE', $date_epoch );

		$dd->createPunchPair( $this->user_id,
							  strtotime( $date_stamp . ' 8:00AM' ),
							  strtotime( $date_stamp . ' 8:00PM' ),
							  [
									  'in_type_id'    => 10,
									  'out_type_id'   => 10,
									  'branch_id'     => 0,
									  'department_id' => 0,
									  'job_id'        => 0,
									  'job_item_id'   => 0,
									  'punch_tag_id'  => []
							  ],
							  true
		);

		$udt_arr = $this->getUserDateTotalArray( $date_epoch, $date_epoch );
		//print_r($udt_arr);
		//Total Time
		$this->assertEquals( 5, $udt_arr[$date_epoch][0]['object_type_id'] );                                                                                                                                                  //5=System Total
		$this->assertEquals( $udt_arr[$date_epoch][0]['pay_code_id'], TTUUID::getZeroID() );
		$this->assertEquals( $udt_arr[$date_epoch][0]['total_time'], ( 12 * 3600 ) );
		//Overtime 1
		$this->assertEquals( 30, $udt_arr[$date_epoch][2]['object_type_id'] );                                                                                                                                                 //OverTime
		$this->assertEquals( $udt_arr[$date_epoch][2]['pay_code_id'], $policy_ids['pay_code'][0] );
		$this->assertEquals( $udt_arr[$date_epoch][2]['total_time'], ( 11 * 3600 ) );
		//Overtime 2
		$this->assertEquals( 30, $udt_arr[$date_epoch][1]['object_type_id'] );                                                                                                                                                 //OverTime
		$this->assertEquals( $udt_arr[$date_epoch][1]['pay_code_id'], $policy_ids['pay_code'][1] );
		$this->assertEquals( $udt_arr[$date_epoch][1]['total_time'], ( 1 * 3600 ) );
		//Make sure no other hours
		$this->assertCount( 3, $udt_arr[$date_epoch] );

		//
		//Day of Week: 5
		//
		$date_epoch = TTDate::incrementDate( TTDate::getMiddleDayEpoch( TTDate::getBeginWeekEpoch( time() ) ), 4, 'day' );
		$date_stamp = TTDate::getDate( 'DATE', $date_epoch );

		$dd->createPunchPair( $this->user_id,
							  strtotime( $date_stamp . ' 8:00AM' ),
							  strtotime( $date_stamp . ' 8:00PM' ),
							  [
									  'in_type_id'    => 10,
									  'out_type_id'   => 10,
									  'branch_id'     => 0,
									  'department_id' => 0,
									  'job_id'        => 0,
									  'job_item_id'   => 0,
									  'punch_tag_id'  => []
							  ],
							  true
		);

		$udt_arr = $this->getUserDateTotalArray( $date_epoch, $date_epoch );
		//print_r($udt_arr);
		//Total Time
		$this->assertEquals( 5, $udt_arr[$date_epoch][0]['object_type_id'] );                                                                                                                                                  //5=System Total
		$this->assertEquals( $udt_arr[$date_epoch][0]['pay_code_id'], TTUUID::getZeroID() );
		$this->assertEquals( $udt_arr[$date_epoch][0]['total_time'], ( 12 * 3600 ) );
		//Overtime 1
		$this->assertEquals( 30, $udt_arr[$date_epoch][2]['object_type_id'] );                                                                                                                                                 //OverTime
		$this->assertEquals( $udt_arr[$date_epoch][2]['pay_code_id'], $policy_ids['pay_code'][1] );
		$this->assertEquals( $udt_arr[$date_epoch][2]['total_time'], ( 11 * 3600 ) );
		//Overtime 2
		$this->assertEquals( 30, $udt_arr[$date_epoch][1]['object_type_id'] );                                                                                                                                                 //OverTime
		$this->assertEquals( $udt_arr[$date_epoch][1]['pay_code_id'], $policy_ids['pay_code'][2] );
		$this->assertEquals( $udt_arr[$date_epoch][1]['total_time'], ( 1 * 3600 ) );
		//Make sure no other hours
		$this->assertCount( 3, $udt_arr[$date_epoch] );

		//
		//Day of Week: 6
		//
		$date_epoch = TTDate::incrementDate( TTDate::getMiddleDayEpoch( TTDate::getBeginWeekEpoch( time() ) ), 5, 'day' );
		$date_stamp = TTDate::getDate( 'DATE', $date_epoch );

		$dd->createPunchPair( $this->user_id,
							  strtotime( $date_stamp . ' 8:00AM' ),
							  strtotime( $date_stamp . ' 8:00PM' ),
							  [
									  'in_type_id'    => 10,
									  'out_type_id'   => 10,
									  'branch_id'     => 0,
									  'department_id' => 0,
									  'job_id'        => 0,
									  'job_item_id'   => 0,
									  'punch_tag_id'  => []
							  ],
							  true
		);

		$udt_arr = $this->getUserDateTotalArray( $date_epoch, $date_epoch );
		//print_r($udt_arr);
		//Total Time
		$this->assertEquals( 5, $udt_arr[$date_epoch][0]['object_type_id'] );                                                                                                                                                  //5=System Total
		$this->assertEquals( $udt_arr[$date_epoch][0]['pay_code_id'], TTUUID::getZeroID() );
		$this->assertEquals( $udt_arr[$date_epoch][0]['total_time'], ( 12 * 3600 ) );
		//Overtime 2
		$this->assertEquals( 30, $udt_arr[$date_epoch][1]['object_type_id'] );                                                                                                                                                 //OverTime
		$this->assertEquals( $udt_arr[$date_epoch][1]['pay_code_id'], $policy_ids['pay_code'][2] );
		$this->assertEquals( $udt_arr[$date_epoch][1]['total_time'], ( 12 * 3600 ) );
		//Make sure no other hours
		$this->assertCount( 2, $udt_arr[$date_epoch] );

		$this->assertEquals( $this->getCurrentAccrualBalance( $this->user_id, $this->policy_ids['accrual_policy_account'][10] ), ( -12 * 3600 ) );

		return true;
	}

	/**
	 * @group OvertimePolicy_testBiWeeklyOverTimeDates
	 */
	function testBiWeeklyOverTimeDates() {
		$cp = TTnew( 'CalculatePolicy' ); /** @var CalculatePolicy $cp */

		$this->assertEquals( false, $cp->isSecondBiWeeklyOverTimeWeek( strtotime( '22-Dec-2013' ), strtotime( '22-Dec-2013' ), 0 ) ); //Sun
		$this->assertEquals( true, $cp->isSecondBiWeeklyOverTimeWeek( strtotime( '29-Dec-2013' ), strtotime( '22-Dec-2013' ), 0 ) );  //Sun

		$this->assertEquals( false, $cp->isSecondBiWeeklyOverTimeWeek( strtotime( '29-Dec-2013' ), strtotime( '29-Dec-2013' ), 0 ) ); //Sun
		$this->assertEquals( false, $cp->isSecondBiWeeklyOverTimeWeek( strtotime( '30-Dec-2013' ), strtotime( '29-Dec-2013' ), 0 ) );
		$this->assertEquals( false, $cp->isSecondBiWeeklyOverTimeWeek( strtotime( '31-Dec-2013' ), strtotime( '29-Dec-2013' ), 0 ) );
		$this->assertEquals( false, $cp->isSecondBiWeeklyOverTimeWeek( strtotime( '01-Jan-2014' ), strtotime( '29-Dec-2013' ), 0 ) );
		$this->assertEquals( false, $cp->isSecondBiWeeklyOverTimeWeek( strtotime( '02-Jan-2014' ), strtotime( '29-Dec-2013' ), 0 ) );
		$this->assertEquals( false, $cp->isSecondBiWeeklyOverTimeWeek( strtotime( '03-Jan-2014' ), strtotime( '29-Dec-2013' ), 0 ) );
		$this->assertEquals( false, $cp->isSecondBiWeeklyOverTimeWeek( strtotime( '04-Jan-2014' ), strtotime( '29-Dec-2013' ), 0 ) );
		$this->assertEquals( true, $cp->isSecondBiWeeklyOverTimeWeek( strtotime( '05-Jan-2014' ), strtotime( '29-Dec-2013' ), 0 ) );
		$this->assertEquals( true, $cp->isSecondBiWeeklyOverTimeWeek( strtotime( '06-Jan-2014' ), strtotime( '29-Dec-2013' ), 0 ) );
		$this->assertEquals( true, $cp->isSecondBiWeeklyOverTimeWeek( strtotime( '07-Jan-2014' ), strtotime( '29-Dec-2013' ), 0 ) );
		$this->assertEquals( true, $cp->isSecondBiWeeklyOverTimeWeek( strtotime( '08-Jan-2014' ), strtotime( '29-Dec-2013' ), 0 ) );
		$this->assertEquals( true, $cp->isSecondBiWeeklyOverTimeWeek( strtotime( '09-Jan-2014' ), strtotime( '29-Dec-2013' ), 0 ) );
		$this->assertEquals( true, $cp->isSecondBiWeeklyOverTimeWeek( strtotime( '10-Jan-2014' ), strtotime( '29-Dec-2013' ), 0 ) );
		$this->assertEquals( true, $cp->isSecondBiWeeklyOverTimeWeek( strtotime( '11-Jan-2014' ), strtotime( '29-Dec-2013' ), 0 ) );

		$this->assertEquals( false, $cp->isSecondBiWeeklyOverTimeWeek( strtotime( '29-Dec-2013' ), strtotime( '01-Jan-2014' ), 0 ) ); //Sun
		$this->assertEquals( false, $cp->isSecondBiWeeklyOverTimeWeek( strtotime( '30-Dec-2013' ), strtotime( '01-Jan-2014' ), 0 ) );
		$this->assertEquals( false, $cp->isSecondBiWeeklyOverTimeWeek( strtotime( '31-Dec-2013' ), strtotime( '01-Jan-2014' ), 0 ) );
		$this->assertEquals( false, $cp->isSecondBiWeeklyOverTimeWeek( strtotime( '01-Jan-2014' ), strtotime( '01-Jan-2014' ), 0 ) );
		$this->assertEquals( false, $cp->isSecondBiWeeklyOverTimeWeek( strtotime( '02-Jan-2014' ), strtotime( '01-Jan-2014' ), 0 ) );
		$this->assertEquals( false, $cp->isSecondBiWeeklyOverTimeWeek( strtotime( '03-Jan-2014' ), strtotime( '01-Jan-2014' ), 0 ) );
		$this->assertEquals( false, $cp->isSecondBiWeeklyOverTimeWeek( strtotime( '04-Jan-2014' ), strtotime( '01-Jan-2014' ), 0 ) );
		$this->assertEquals( true, $cp->isSecondBiWeeklyOverTimeWeek( strtotime( '05-Jan-2014' ), strtotime( '01-Jan-2014' ), 0 ) );
		$this->assertEquals( true, $cp->isSecondBiWeeklyOverTimeWeek( strtotime( '06-Jan-2014' ), strtotime( '01-Jan-2014' ), 0 ) );
		$this->assertEquals( true, $cp->isSecondBiWeeklyOverTimeWeek( strtotime( '07-Jan-2014' ), strtotime( '01-Jan-2014' ), 0 ) );
		$this->assertEquals( true, $cp->isSecondBiWeeklyOverTimeWeek( strtotime( '08-Jan-2014' ), strtotime( '01-Jan-2014' ), 0 ) );
		$this->assertEquals( true, $cp->isSecondBiWeeklyOverTimeWeek( strtotime( '09-Jan-2014' ), strtotime( '01-Jan-2014' ), 0 ) );
		$this->assertEquals( true, $cp->isSecondBiWeeklyOverTimeWeek( strtotime( '10-Jan-2014' ), strtotime( '01-Jan-2014' ), 0 ) );
		$this->assertEquals( true, $cp->isSecondBiWeeklyOverTimeWeek( strtotime( '11-Jan-2014' ), strtotime( '01-Jan-2014' ), 0 ) );

		//These were originally incorrect by the looks of it, and once we added daydiff rounding it fixed them.
		//$this->assertEquals(  $cp->isSecondBiWeeklyOverTimeWeek( strtotime('01-May-2016'), strtotime('28-Dec-2013'), 0 ), FALSE ); //Sat
		//$this->assertEquals(  $cp->isSecondBiWeeklyOverTimeWeek( strtotime('01-May-2016'), strtotime('29-Dec-2013'), 0 ), TRUE ); //Sun
		//$this->assertEquals(  $cp->isSecondBiWeeklyOverTimeWeek( strtotime('01-May-2016'), strtotime('01-Jan-2014'), 0 ), TRUE ); //Wed
		$this->assertEquals( true, $cp->isSecondBiWeeklyOverTimeWeek( strtotime( '01-May-2016' ), strtotime( '28-Dec-2013' ), 0 ) );  //Sat
		$this->assertEquals( false, $cp->isSecondBiWeeklyOverTimeWeek( strtotime( '01-May-2016' ), strtotime( '29-Dec-2013' ), 0 ) ); //Sun
		$this->assertEquals( false, $cp->isSecondBiWeeklyOverTimeWeek( strtotime( '01-May-2016' ), strtotime( '01-Jan-2014' ), 0 ) ); //Wed

		//Test 53 week year.
		$this->assertEquals( false, $cp->isSecondBiWeeklyOverTimeWeek( strtotime( '29-Dec-2014' ), strtotime( '29-Dec-2014' ), 0 ) ); //Sun: Week 1
		$this->assertEquals( true, $cp->isSecondBiWeeklyOverTimeWeek( strtotime( '05-Jan-2015' ), strtotime( '29-Dec-2014' ), 0 ) );  //Sun
		$this->assertEquals( false, $cp->isSecondBiWeeklyOverTimeWeek( strtotime( '12-Jan-2015' ), strtotime( '29-Dec-2014' ), 0 ) ); //Sun
		$this->assertEquals( false, $cp->isSecondBiWeeklyOverTimeWeek( strtotime( '26-Jan-2015' ), strtotime( '29-Dec-2014' ), 0 ) ); //Sun
		$this->assertEquals( false, $cp->isSecondBiWeeklyOverTimeWeek( strtotime( '09-Feb-2015' ), strtotime( '29-Dec-2014' ), 0 ) ); //Sun
		$this->assertEquals( false, $cp->isSecondBiWeeklyOverTimeWeek( strtotime( '23-Feb-2015' ), strtotime( '29-Dec-2014' ), 0 ) ); //Sun


		$this->assertEquals( false, $cp->isSecondBiWeeklyOverTimeWeek( strtotime( '09-Mar-2015' ), strtotime( '29-Dec-2014' ), 0 ) ); //Sun
		$this->assertEquals( false, $cp->isSecondBiWeeklyOverTimeWeek( strtotime( '23-Mar-2015' ), strtotime( '29-Dec-2014' ), 0 ) ); //Sun


		$this->assertEquals( false, $cp->isSecondBiWeeklyOverTimeWeek( strtotime( '14-Dec-2015' ), strtotime( '29-Dec-2014' ), 0 ) ); //Sun: Week 51
		$this->assertEquals( true, $cp->isSecondBiWeeklyOverTimeWeek( strtotime( '21-Dec-2015' ), strtotime( '29-Dec-2014' ), 0 ) );  //Sun: Week 52
		$this->assertEquals( false, $cp->isSecondBiWeeklyOverTimeWeek( strtotime( '28-Dec-2015' ), strtotime( '29-Dec-2014' ), 0 ) ); //Sun: Week 53

		$this->assertEquals( false, $cp->isSecondBiWeeklyOverTimeWeek( strtotime( '01-Jan-2014' ), strtotime( '01-Jan-2014' ), 0 ) ); //Sun
		$this->assertEquals( true, $cp->isSecondBiWeeklyOverTimeWeek( strtotime( '06-Jan-2014' ), strtotime( '01-Jan-2014' ), 0 ) );  //Sun
		$this->assertEquals( false, $cp->isSecondBiWeeklyOverTimeWeek( strtotime( '12-Jan-2014' ), strtotime( '01-Jan-2014' ), 0 ) ); //Sun
		$this->assertEquals( true, $cp->isSecondBiWeeklyOverTimeWeek( strtotime( '20-Jan-2014' ), strtotime( '01-Jan-2014' ), 0 ) );  //Sun

		$this->assertEquals( true, $cp->isSecondBiWeeklyOverTimeWeek( strtotime( '03-Feb-2014' ), strtotime( '01-Jan-2014' ), 0 ) ); //Sun
		$this->assertEquals( true, $cp->isSecondBiWeeklyOverTimeWeek( strtotime( '17-Feb-2014' ), strtotime( '01-Jan-2014' ), 0 ) ); //Sun


		$retval = false;
		$anchor_date = TTDate::getMiddleDayEpoch( strtotime( '29-Dec-2014' ) );
		$x = 0;
		for ( $i = $anchor_date; $i <= TTDate::getMiddleDayEpoch( strtotime( '29-Dec-2015' ) ); $i += ( 86400 * 7 ) ) {
			$x++; //Run at beginning so the counter essentially starts at 1.
			$this->assertEquals( $cp->isSecondBiWeeklyOverTimeWeek( $i, $anchor_date, 0 ), $retval );
			$retval = !$retval; //Swap

		}
		$this->assertEquals( 53, $x );


		$retval = false;
		$anchor_date = TTDate::getMiddleDayEpoch( strtotime( '29-Dec-2014' ) );
		$x = 0;
		for ( $i = $anchor_date; $i <= TTDate::getMiddleDayEpoch( strtotime( '29-Dec-2025' ) ); $i += ( 86400 * 7 ) ) {
			$x++; //Run at beginning so the counter essentially starts at 1.
			$this->assertEquals( $cp->isSecondBiWeeklyOverTimeWeek( $i, $anchor_date, 0 ), $retval );
			$retval = !$retval; //Swap

		}
		$this->assertEquals( 575, $x );
	}

	/**
	 * @group OvertimePolicy_testBiWeeklyOverTimePeriodDates
	 */
	function testBiWeeklyOverTimePeriodDates() {
		$cp = TTnew( 'CalculatePolicy' ); /** @var CalculatePolicy $cp */

		$ot_period_dates = $cp->getOverTimePeriodDates( strtotime( '22-Dec-2013' ), 2, strtotime( '22-Dec-2013' ), 0 );
		$this->assertEquals( $ot_period_dates['start_date'], TTDate::getBeginDayEpoch( strtotime( '22-Dec-2013' ) ) ); //Sun
		$this->assertEquals( $ot_period_dates['end_date'], TTDate::getEndDayEpoch( strtotime( '04-Jan-2014' ) ) ); //Mon
		$this->assertEquals( true, $ot_period_dates['is_first_week'] );
		$this->assertEquals( false, $ot_period_dates['is_last_week'] );
//		$this->assertEquals(  $cp->isSecondBiWeeklyOverTimeWeek( strtotime('29-Dec-2013'), strtotime('22-Dec-2013'), 0 ), TRUE ); //Sun


		$ot_period_dates = $cp->getOverTimePeriodDates( strtotime( '29-Dec-2013' ), 2, strtotime( '29-Dec-2013' ), 0 );
		$this->assertEquals( $ot_period_dates['start_date'], TTDate::getBeginDayEpoch( strtotime( '29-Dec-2013' ) ) ); //Sun
		$this->assertEquals( $ot_period_dates['end_date'], TTDate::getEndDayEpoch( strtotime( '11-Jan-2014' ) ) ); //Mon
		$this->assertEquals( true, $ot_period_dates['is_first_week'] );
		$this->assertEquals( false, $ot_period_dates['is_last_week'] );
//		$this->assertEquals(  $cp->isSecondBiWeeklyOverTimeWeek( strtotime('29-Dec-2013'), strtotime('29-Dec-2013'), 0 ), FALSE ); //Sun

		$ot_period_dates = $cp->getOverTimePeriodDates( strtotime( '30-Dec-2013' ), 2, strtotime( '29-Dec-2013' ), 0 );
		$this->assertEquals( $ot_period_dates['start_date'], TTDate::getBeginDayEpoch( strtotime( '29-Dec-2013' ) ) ); //Sun
		$this->assertEquals( $ot_period_dates['end_date'], TTDate::getEndDayEpoch( strtotime( '11-Jan-2014' ) ) ); //Mon
		$this->assertEquals( true, $ot_period_dates['is_first_week'] );
		$this->assertEquals( false, $ot_period_dates['is_last_week'] );
//		$this->assertEquals(  $cp->isSecondBiWeeklyOverTimeWeek( strtotime('30-Dec-2013'), strtotime('29-Dec-2013'), 0 ), FALSE );

		$ot_period_dates = $cp->getOverTimePeriodDates( strtotime( '31-Dec-2013' ), 2, strtotime( '29-Dec-2013' ), 0 );
		$this->assertEquals( $ot_period_dates['start_date'], TTDate::getBeginDayEpoch( strtotime( '29-Dec-2013' ) ) ); //Sun
		$this->assertEquals( $ot_period_dates['end_date'], TTDate::getEndDayEpoch( strtotime( '11-Jan-2014' ) ) ); //Mon
		$this->assertEquals( true, $ot_period_dates['is_first_week'] );
		$this->assertEquals( false, $ot_period_dates['is_last_week'] );
//		$this->assertEquals(  $cp->isSecondBiWeeklyOverTimeWeek( strtotime('31-Dec-2013'), strtotime('29-Dec-2013'), 0 ), FALSE );

		$ot_period_dates = $cp->getOverTimePeriodDates( strtotime( '01-Jan-2014' ), 2, strtotime( '29-Dec-2013' ), 0 );
		$this->assertEquals( $ot_period_dates['start_date'], TTDate::getBeginDayEpoch( strtotime( '29-Dec-2013' ) ) ); //Sun
		$this->assertEquals( $ot_period_dates['end_date'], TTDate::getEndDayEpoch( strtotime( '11-Jan-2014' ) ) ); //Mon
		$this->assertEquals( true, $ot_period_dates['is_first_week'] );
		$this->assertEquals( false, $ot_period_dates['is_last_week'] );
//		$this->assertEquals(  $cp->isSecondBiWeeklyOverTimeWeek( strtotime('01-Jan-2014'), strtotime('29-Dec-2013'), 0 ), FALSE );

		$ot_period_dates = $cp->getOverTimePeriodDates( strtotime( '02-Jan-2014' ), 2, strtotime( '29-Dec-2013' ), 0 );
		$this->assertEquals( $ot_period_dates['start_date'], TTDate::getBeginDayEpoch( strtotime( '29-Dec-2013' ) ) ); //Sun
		$this->assertEquals( $ot_period_dates['end_date'], TTDate::getEndDayEpoch( strtotime( '11-Jan-2014' ) ) ); //Mon
		$this->assertEquals( true, $ot_period_dates['is_first_week'] );
		$this->assertEquals( false, $ot_period_dates['is_last_week'] );
//		$this->assertEquals(  $cp->isSecondBiWeeklyOverTimeWeek( strtotime('02-Jan-2014'), strtotime('29-Dec-2013'), 0 ), FALSE );

		$ot_period_dates = $cp->getOverTimePeriodDates( strtotime( '03-Jan-2014' ), 2, strtotime( '29-Dec-2013' ), 0 );
		$this->assertEquals( $ot_period_dates['start_date'], TTDate::getBeginDayEpoch( strtotime( '29-Dec-2013' ) ) ); //Sun
		$this->assertEquals( $ot_period_dates['end_date'], TTDate::getEndDayEpoch( strtotime( '11-Jan-2014' ) ) ); //Mon
		$this->assertEquals( true, $ot_period_dates['is_first_week'] );
		$this->assertEquals( false, $ot_period_dates['is_last_week'] );
//		$this->assertEquals(  $cp->isSecondBiWeeklyOverTimeWeek( strtotime('03-Jan-2014'), strtotime('29-Dec-2013'), 0 ), FALSE );

		$ot_period_dates = $cp->getOverTimePeriodDates( strtotime( '04-Jan-2014' ), 2, strtotime( '29-Dec-2013' ), 0 );
		$this->assertEquals( $ot_period_dates['start_date'], TTDate::getBeginDayEpoch( strtotime( '29-Dec-2013' ) ) ); //Sun
		$this->assertEquals( $ot_period_dates['end_date'], TTDate::getEndDayEpoch( strtotime( '11-Jan-2014' ) ) ); //Mon
		$this->assertEquals( true, $ot_period_dates['is_first_week'] );
		$this->assertEquals( false, $ot_period_dates['is_last_week'] );
//		$this->assertEquals(  $cp->isSecondBiWeeklyOverTimeWeek( strtotime('04-Jan-2014'), strtotime('29-Dec-2013'), 0 ), FALSE );

		$ot_period_dates = $cp->getOverTimePeriodDates( strtotime( '05-Jan-2014' ), 2, strtotime( '29-Dec-2013' ), 0 );
		$this->assertEquals( $ot_period_dates['start_date'], TTDate::getBeginDayEpoch( strtotime( '29-Dec-2013' ) ) ); //Sun
		$this->assertEquals( $ot_period_dates['end_date'], TTDate::getEndDayEpoch( strtotime( '11-Jan-2014' ) ) ); //Mon
		$this->assertEquals( false, $ot_period_dates['is_first_week'] );
		$this->assertEquals( true, $ot_period_dates['is_last_week'] );
//		$this->assertEquals(  $cp->isSecondBiWeeklyOverTimeWeek( strtotime('05-Jan-2014'), strtotime('29-Dec-2013'), 0 ), TRUE );

		$ot_period_dates = $cp->getOverTimePeriodDates( strtotime( '06-Jan-2014' ), 2, strtotime( '29-Dec-2013' ), 0 );
		$this->assertEquals( $ot_period_dates['start_date'], TTDate::getBeginDayEpoch( strtotime( '29-Dec-2013' ) ) ); //Sun
		$this->assertEquals( $ot_period_dates['end_date'], TTDate::getEndDayEpoch( strtotime( '11-Jan-2014' ) ) ); //Mon
		$this->assertEquals( false, $ot_period_dates['is_first_week'] );
		$this->assertEquals( true, $ot_period_dates['is_last_week'] );
//		$this->assertEquals(  $cp->isSecondBiWeeklyOverTimeWeek( strtotime('06-Jan-2014'), strtotime('29-Dec-2013'), 0 ), TRUE );

		$ot_period_dates = $cp->getOverTimePeriodDates( strtotime( '07-Jan-2014' ), 2, strtotime( '29-Dec-2013' ), 0 );
		$this->assertEquals( $ot_period_dates['start_date'], TTDate::getBeginDayEpoch( strtotime( '29-Dec-2013' ) ) ); //Sun
		$this->assertEquals( $ot_period_dates['end_date'], TTDate::getEndDayEpoch( strtotime( '11-Jan-2014' ) ) ); //Mon
		$this->assertEquals( false, $ot_period_dates['is_first_week'] );
		$this->assertEquals( true, $ot_period_dates['is_last_week'] );
//		$this->assertEquals(  $cp->isSecondBiWeeklyOverTimeWeek( strtotime('07-Jan-2014'), strtotime('29-Dec-2013'), 0 ), TRUE );

		$ot_period_dates = $cp->getOverTimePeriodDates( strtotime( '08-Jan-2014' ), 2, strtotime( '29-Dec-2013' ), 0 );
		$this->assertEquals( $ot_period_dates['start_date'], TTDate::getBeginDayEpoch( strtotime( '29-Dec-2013' ) ) ); //Sun
		$this->assertEquals( $ot_period_dates['end_date'], TTDate::getEndDayEpoch( strtotime( '11-Jan-2014' ) ) ); //Mon
		$this->assertEquals( false, $ot_period_dates['is_first_week'] );
		$this->assertEquals( true, $ot_period_dates['is_last_week'] );
//		$this->assertEquals(  $cp->isSecondBiWeeklyOverTimeWeek( strtotime('08-Jan-2014'), strtotime('29-Dec-2013'), 0 ), TRUE );

		$ot_period_dates = $cp->getOverTimePeriodDates( strtotime( '09-Jan-2014' ), 2, strtotime( '29-Dec-2013' ), 0 );
		$this->assertEquals( $ot_period_dates['start_date'], TTDate::getBeginDayEpoch( strtotime( '29-Dec-2013' ) ) ); //Sun
		$this->assertEquals( $ot_period_dates['end_date'], TTDate::getEndDayEpoch( strtotime( '11-Jan-2014' ) ) ); //Mon
		$this->assertEquals( false, $ot_period_dates['is_first_week'] );
		$this->assertEquals( true, $ot_period_dates['is_last_week'] );
//		$this->assertEquals(  $cp->isSecondBiWeeklyOverTimeWeek( strtotime('09-Jan-2014'), strtotime('29-Dec-2013'), 0 ), TRUE );

		$ot_period_dates = $cp->getOverTimePeriodDates( strtotime( '10-Jan-2014' ), 2, strtotime( '29-Dec-2013' ), 0 );
		$this->assertEquals( $ot_period_dates['start_date'], TTDate::getBeginDayEpoch( strtotime( '29-Dec-2013' ) ) ); //Sun
		$this->assertEquals( $ot_period_dates['end_date'], TTDate::getEndDayEpoch( strtotime( '11-Jan-2014' ) ) ); //Mon
		$this->assertEquals( false, $ot_period_dates['is_first_week'] );
		$this->assertEquals( true, $ot_period_dates['is_last_week'] );
//		$this->assertEquals(  $cp->isSecondBiWeeklyOverTimeWeek( strtotime('10-Jan-2014'), strtotime('29-Dec-2013'), 0 ), TRUE );

		$ot_period_dates = $cp->getOverTimePeriodDates( strtotime( '11-Jan-2014' ), 2, strtotime( '29-Dec-2013' ), 0 );
		$this->assertEquals( $ot_period_dates['start_date'], TTDate::getBeginDayEpoch( strtotime( '29-Dec-2013' ) ) ); //Sun
		$this->assertEquals( $ot_period_dates['end_date'], TTDate::getEndDayEpoch( strtotime( '11-Jan-2014' ) ) ); //Mon
		$this->assertEquals( false, $ot_period_dates['is_first_week'] );
		$this->assertEquals( true, $ot_period_dates['is_last_week'] );
//		$this->assertEquals(  $cp->isSecondBiWeeklyOverTimeWeek( strtotime('11-Jan-2014'), strtotime('29-Dec-2013'), 0 ), TRUE );


		$ot_period_dates = $cp->getOverTimePeriodDates( strtotime( '29-Dec-2013' ), 2, strtotime( '01-Jan-2014' ), 0 );
		$this->assertEquals( $ot_period_dates['start_date'], TTDate::getBeginDayEpoch( strtotime( '29-Dec-2013' ) ) ); //Sun
		$this->assertEquals( $ot_period_dates['end_date'], TTDate::getEndDayEpoch( strtotime( '11-Jan-2014' ) ) ); //Mon
		$this->assertEquals( true, $ot_period_dates['is_first_week'] );
		$this->assertEquals( false, $ot_period_dates['is_last_week'] );
//		$this->assertEquals(  $cp->isSecondBiWeeklyOverTimeWeek( strtotime('29-Dec-2013'), strtotime('01-Jan-2014'), 0 ), FALSE ); //Sun

		$ot_period_dates = $cp->getOverTimePeriodDates( strtotime( '30-Dec-2013' ), 2, strtotime( '01-Jan-2014' ), 0 );
		$this->assertEquals( $ot_period_dates['start_date'], TTDate::getBeginDayEpoch( strtotime( '29-Dec-2013' ) ) ); //Sun
		$this->assertEquals( $ot_period_dates['end_date'], TTDate::getEndDayEpoch( strtotime( '11-Jan-2014' ) ) ); //Mon
		$this->assertEquals( true, $ot_period_dates['is_first_week'] );
		$this->assertEquals( false, $ot_period_dates['is_last_week'] );
//		$this->assertEquals(  $cp->isSecondBiWeeklyOverTimeWeek( strtotime('30-Dec-2013'), strtotime('01-Jan-2014'), 0 ), FALSE );

		$ot_period_dates = $cp->getOverTimePeriodDates( strtotime( '31-Dec-2013' ), 2, strtotime( '01-Jan-2014' ), 0 );
		$this->assertEquals( $ot_period_dates['start_date'], TTDate::getBeginDayEpoch( strtotime( '29-Dec-2013' ) ) ); //Sun
		$this->assertEquals( $ot_period_dates['end_date'], TTDate::getEndDayEpoch( strtotime( '11-Jan-2014' ) ) ); //Mon
		$this->assertEquals( true, $ot_period_dates['is_first_week'] );
		$this->assertEquals( false, $ot_period_dates['is_last_week'] );
//		$this->assertEquals(  $cp->isSecondBiWeeklyOverTimeWeek( strtotime('31-Dec-2013'), strtotime('01-Jan-2014'), 0 ), FALSE );

		$ot_period_dates = $cp->getOverTimePeriodDates( strtotime( '01-Jan-2014' ), 2, strtotime( '01-Jan-2014' ), 0 );
		$this->assertEquals( $ot_period_dates['start_date'], TTDate::getBeginDayEpoch( strtotime( '29-Dec-2013' ) ) ); //Sun
		$this->assertEquals( $ot_period_dates['end_date'], TTDate::getEndDayEpoch( strtotime( '11-Jan-2014' ) ) ); //Mon
		$this->assertEquals( true, $ot_period_dates['is_first_week'] );
		$this->assertEquals( false, $ot_period_dates['is_last_week'] );
//		$this->assertEquals(  $cp->isSecondBiWeeklyOverTimeWeek( strtotime('01-Jan-2014'), strtotime('01-Jan-2014'), 0 ), FALSE );

		$ot_period_dates = $cp->getOverTimePeriodDates( strtotime( '02-Jan-2014' ), 2, strtotime( '01-Jan-2014' ), 0 );
		$this->assertEquals( $ot_period_dates['start_date'], TTDate::getBeginDayEpoch( strtotime( '29-Dec-2013' ) ) ); //Sun
		$this->assertEquals( $ot_period_dates['end_date'], TTDate::getEndDayEpoch( strtotime( '11-Jan-2014' ) ) ); //Mon
		$this->assertEquals( true, $ot_period_dates['is_first_week'] );
		$this->assertEquals( false, $ot_period_dates['is_last_week'] );
//		$this->assertEquals(  $cp->isSecondBiWeeklyOverTimeWeek( strtotime('02-Jan-2014'), strtotime('01-Jan-2014'), 0 ), FALSE );

		$ot_period_dates = $cp->getOverTimePeriodDates( strtotime( '03-Jan-2014' ), 2, strtotime( '01-Jan-2014' ), 0 );
		$this->assertEquals( $ot_period_dates['start_date'], TTDate::getBeginDayEpoch( strtotime( '29-Dec-2013' ) ) ); //Sun
		$this->assertEquals( $ot_period_dates['end_date'], TTDate::getEndDayEpoch( strtotime( '11-Jan-2014' ) ) ); //Mon
		$this->assertEquals( true, $ot_period_dates['is_first_week'] );
		$this->assertEquals( false, $ot_period_dates['is_last_week'] );
//		$this->assertEquals(  $cp->isSecondBiWeeklyOverTimeWeek( strtotime('03-Jan-2014'), strtotime('01-Jan-2014'), 0 ), FALSE );

		$ot_period_dates = $cp->getOverTimePeriodDates( strtotime( '04-Jan-2014' ), 2, strtotime( '01-Jan-2014' ), 0 );
		$this->assertEquals( $ot_period_dates['start_date'], TTDate::getBeginDayEpoch( strtotime( '29-Dec-2013' ) ) ); //Sun
		$this->assertEquals( $ot_period_dates['end_date'], TTDate::getEndDayEpoch( strtotime( '11-Jan-2014' ) ) ); //Mon
		$this->assertEquals( true, $ot_period_dates['is_first_week'] );
		$this->assertEquals( false, $ot_period_dates['is_last_week'] );
//		$this->assertEquals(  $cp->isSecondBiWeeklyOverTimeWeek( strtotime('04-Jan-2014'), strtotime('01-Jan-2014'), 0 ), FALSE );

		$ot_period_dates = $cp->getOverTimePeriodDates( strtotime( '05-Jan-2014' ), 2, strtotime( '01-Jan-2014' ), 0 );
		$this->assertEquals( $ot_period_dates['start_date'], TTDate::getBeginDayEpoch( strtotime( '29-Dec-2013' ) ) ); //Sun
		$this->assertEquals( $ot_period_dates['end_date'], TTDate::getEndDayEpoch( strtotime( '11-Jan-2014' ) ) ); //Mon
		$this->assertEquals( false, $ot_period_dates['is_first_week'] );
		$this->assertEquals( true, $ot_period_dates['is_last_week'] );
//		$this->assertEquals(  $cp->isSecondBiWeeklyOverTimeWeek( strtotime('05-Jan-2014'), strtotime('01-Jan-2014'), 0 ), TRUE );

		$ot_period_dates = $cp->getOverTimePeriodDates( strtotime( '06-Jan-2014' ), 2, strtotime( '01-Jan-2014' ), 0 );
		$this->assertEquals( $ot_period_dates['start_date'], TTDate::getBeginDayEpoch( strtotime( '29-Dec-2013' ) ) ); //Sun
		$this->assertEquals( $ot_period_dates['end_date'], TTDate::getEndDayEpoch( strtotime( '11-Jan-2014' ) ) ); //Mon
		$this->assertEquals( false, $ot_period_dates['is_first_week'] );
		$this->assertEquals( true, $ot_period_dates['is_last_week'] );
//		$this->assertEquals(  $cp->isSecondBiWeeklyOverTimeWeek( strtotime('06-Jan-2014'), strtotime('01-Jan-2014'), 0 ), TRUE );

		$ot_period_dates = $cp->getOverTimePeriodDates( strtotime( '07-Jan-2014' ), 2, strtotime( '01-Jan-2014' ), 0 );
		$this->assertEquals( $ot_period_dates['start_date'], TTDate::getBeginDayEpoch( strtotime( '29-Dec-2013' ) ) ); //Sun
		$this->assertEquals( $ot_period_dates['end_date'], TTDate::getEndDayEpoch( strtotime( '11-Jan-2014' ) ) ); //Mon
		$this->assertEquals( false, $ot_period_dates['is_first_week'] );
		$this->assertEquals( true, $ot_period_dates['is_last_week'] );
//		$this->assertEquals(  $cp->isSecondBiWeeklyOverTimeWeek( strtotime('07-Jan-2014'), strtotime('01-Jan-2014'), 0 ), TRUE );

		$ot_period_dates = $cp->getOverTimePeriodDates( strtotime( '08-Jan-2014' ), 2, strtotime( '01-Jan-2014' ), 0 );
		$this->assertEquals( $ot_period_dates['start_date'], TTDate::getBeginDayEpoch( strtotime( '29-Dec-2013' ) ) ); //Sun
		$this->assertEquals( $ot_period_dates['end_date'], TTDate::getEndDayEpoch( strtotime( '11-Jan-2014' ) ) ); //Mon
		$this->assertEquals( false, $ot_period_dates['is_first_week'] );
		$this->assertEquals( true, $ot_period_dates['is_last_week'] );
//		$this->assertEquals(  $cp->isSecondBiWeeklyOverTimeWeek( strtotime('08-Jan-2014'), strtotime('01-Jan-2014'), 0 ), TRUE );

		$ot_period_dates = $cp->getOverTimePeriodDates( strtotime( '09-Jan-2014' ), 2, strtotime( '01-Jan-2014' ), 0 );
		$this->assertEquals( $ot_period_dates['start_date'], TTDate::getBeginDayEpoch( strtotime( '29-Dec-2013' ) ) ); //Sun
		$this->assertEquals( $ot_period_dates['end_date'], TTDate::getEndDayEpoch( strtotime( '11-Jan-2014' ) ) ); //Mon
		$this->assertEquals( false, $ot_period_dates['is_first_week'] );
		$this->assertEquals( true, $ot_period_dates['is_last_week'] );
//		$this->assertEquals(  $cp->isSecondBiWeeklyOverTimeWeek( strtotime('09-Jan-2014'), strtotime('01-Jan-2014'), 0 ), TRUE );

		$ot_period_dates = $cp->getOverTimePeriodDates( strtotime( '10-Jan-2014' ), 2, strtotime( '01-Jan-2014' ), 0 );
		$this->assertEquals( $ot_period_dates['start_date'], TTDate::getBeginDayEpoch( strtotime( '29-Dec-2013' ) ) ); //Sun
		$this->assertEquals( $ot_period_dates['end_date'], TTDate::getEndDayEpoch( strtotime( '11-Jan-2014' ) ) ); //Mon
		$this->assertEquals( false, $ot_period_dates['is_first_week'] );
		$this->assertEquals( true, $ot_period_dates['is_last_week'] );
//		$this->assertEquals(  $cp->isSecondBiWeeklyOverTimeWeek( strtotime('10-Jan-2014'), strtotime('01-Jan-2014'), 0 ), TRUE );

		$ot_period_dates = $cp->getOverTimePeriodDates( strtotime( '11-Jan-2014' ), 2, strtotime( '01-Jan-2014' ), 0 );
		$this->assertEquals( $ot_period_dates['start_date'], TTDate::getBeginDayEpoch( strtotime( '29-Dec-2013' ) ) ); //Sun
		$this->assertEquals( $ot_period_dates['end_date'], TTDate::getEndDayEpoch( strtotime( '11-Jan-2014' ) ) ); //Mon
		$this->assertEquals( false, $ot_period_dates['is_first_week'] );
		$this->assertEquals( true, $ot_period_dates['is_last_week'] );
//		$this->assertEquals(  $cp->isSecondBiWeeklyOverTimeWeek( strtotime('11-Jan-2014'), strtotime('01-Jan-2014'), 0 ), TRUE );

		$ot_period_dates = $cp->getOverTimePeriodDates( strtotime( '01-May-2016' ), 2, strtotime( '28-Dec-2013' ), 0 );
		$this->assertEquals( $ot_period_dates['start_date'], TTDate::getBeginDayEpoch( strtotime( '24-Apr-2016' ) ) ); //Sat
		$this->assertEquals( $ot_period_dates['end_date'], TTDate::getEndDayEpoch( strtotime( '07-May-2016' ) ) ); //Fri
		$this->assertEquals( false, $ot_period_dates['is_first_week'] );
		$this->assertEquals( true, $ot_period_dates['is_last_week'] );
		//$this->assertEquals(  $cp->isSecondBiWeeklyOverTimeWeek( strtotime('01-May-2016'), strtotime('28-Dec-2013'), 0 ), TRUE ); //Sat

		$ot_period_dates = $cp->getOverTimePeriodDates( strtotime( '01-May-2016' ), 2, strtotime( '29-Dec-2013' ), 0 );
		$this->assertEquals( $ot_period_dates['start_date'], TTDate::getBeginDayEpoch( strtotime( '01-May-2016' ) ) ); //Sun
		$this->assertEquals( $ot_period_dates['end_date'], TTDate::getEndDayEpoch( strtotime( '14-May-2016' ) ) ); //Sat
		$this->assertEquals( true, $ot_period_dates['is_first_week'] );
		$this->assertEquals( false, $ot_period_dates['is_last_week'] );
		//$this->assertEquals(  $cp->isSecondBiWeeklyOverTimeWeek( strtotime('01-May-2016'), strtotime('29-Dec-2013'), 0 ), FALSE ); //Sun

		$ot_period_dates = $cp->getOverTimePeriodDates( strtotime( '01-May-2016' ), 2, strtotime( '01-Jan-2014' ), 0 );
		$this->assertEquals( $ot_period_dates['start_date'], TTDate::getBeginDayEpoch( strtotime( '01-May-2016' ) ) ); //Wed
		$this->assertEquals( $ot_period_dates['end_date'], TTDate::getEndDayEpoch( strtotime( '14-May-2016' ) ) ); //Tue
		$this->assertEquals( true, $ot_period_dates['is_first_week'] );
		$this->assertEquals( false, $ot_period_dates['is_last_week'] );
		//$this->assertEquals(  $cp->isSecondBiWeeklyOverTimeWeek( strtotime('01-May-2016'), strtotime('01-Jan-2014'), 0 ), FALSE ); //Wed


//		//Test 53 week year.
		$ot_period_dates = $cp->getOverTimePeriodDates( strtotime( '29-Dec-2014' ), 2, strtotime( '29-Dec-2014' ), 0 );
		$this->assertEquals( $ot_period_dates['start_date'], TTDate::getBeginDayEpoch( strtotime( '28-Dec-14' ) ) );
		$this->assertEquals( $ot_period_dates['end_date'], TTDate::getEndDayEpoch( strtotime( '10-Jan-15' ) ) );
		$this->assertEquals( true, $ot_period_dates['is_first_week'] );
		$this->assertEquals( false, $ot_period_dates['is_last_week'] );
//		$this->assertEquals(  $cp->isSecondBiWeeklyOverTimeWeek( strtotime('29-Dec-2014'), strtotime('29-Dec-2014'), 0 ), FALSE ); //Sun: Week 1

		$ot_period_dates = $cp->getOverTimePeriodDates( strtotime( '05-Jan-2015' ), 2, strtotime( '29-Dec-2014' ), 0 );
		$this->assertEquals( $ot_period_dates['start_date'], TTDate::getBeginDayEpoch( strtotime( '28-Dec-14' ) ) );
		$this->assertEquals( $ot_period_dates['end_date'], TTDate::getEndDayEpoch( strtotime( '10-Jan-15' ) ) );
		$this->assertEquals( false, $ot_period_dates['is_first_week'] );
		$this->assertEquals( true, $ot_period_dates['is_last_week'] );
//		$this->assertEquals(  $cp->isSecondBiWeeklyOverTimeWeek( strtotime('05-Jan-2015'), strtotime('29-Dec-2014'), 0 ), TRUE ); //Sun

		$ot_period_dates = $cp->getOverTimePeriodDates( strtotime( '12-Jan-2015' ), 2, strtotime( '29-Dec-2014' ), 0 );
		$this->assertEquals( $ot_period_dates['start_date'], TTDate::getBeginDayEpoch( strtotime( '11-Jan-15' ) ) );
		$this->assertEquals( $ot_period_dates['end_date'], TTDate::getEndDayEpoch( strtotime( '24-Jan-15' ) ) );
		$this->assertEquals( true, $ot_period_dates['is_first_week'] );
		$this->assertEquals( false, $ot_period_dates['is_last_week'] );
//		$this->assertEquals(  $cp->isSecondBiWeeklyOverTimeWeek( strtotime('12-Jan-2015'), strtotime('29-Dec-2014'), 0 ), FALSE ); //Sun

		$ot_period_dates = $cp->getOverTimePeriodDates( strtotime( '26-Jan-2015' ), 2, strtotime( '29-Dec-2014' ), 0 );
		$this->assertEquals( $ot_period_dates['start_date'], TTDate::getBeginDayEpoch( strtotime( '25-Jan-15' ) ) );
		$this->assertEquals( $ot_period_dates['end_date'], TTDate::getEndDayEpoch( strtotime( '07-Feb-15' ) ) );
		$this->assertEquals( true, $ot_period_dates['is_first_week'] );
		$this->assertEquals( false, $ot_period_dates['is_last_week'] );
//		$this->assertEquals(  $cp->isSecondBiWeeklyOverTimeWeek( strtotime('26-Jan-2015'), strtotime('29-Dec-2014'), 0 ), FALSE ); //Sun

		$ot_period_dates = $cp->getOverTimePeriodDates( strtotime( '09-Feb-2015' ), 2, strtotime( '29-Dec-2014' ), 0 );
		$this->assertEquals( $ot_period_dates['start_date'], TTDate::getBeginDayEpoch( strtotime( '08-Feb-15' ) ) );
		$this->assertEquals( $ot_period_dates['end_date'], TTDate::getEndDayEpoch( strtotime( '21-Feb-15' ) ) );
		$this->assertEquals( true, $ot_period_dates['is_first_week'] );
		$this->assertEquals( false, $ot_period_dates['is_last_week'] );
//		$this->assertEquals(  $cp->isSecondBiWeeklyOverTimeWeek( strtotime('09-Feb-2015'), strtotime('29-Dec-2014'), 0 ), FALSE ); //Sun

		$ot_period_dates = $cp->getOverTimePeriodDates( strtotime( '23-Feb-2015' ), 2, strtotime( '29-Dec-2014' ), 0 );
		$this->assertEquals( $ot_period_dates['start_date'], TTDate::getBeginDayEpoch( strtotime( '22-Feb-15' ) ) );
		$this->assertEquals( $ot_period_dates['end_date'], TTDate::getEndDayEpoch( strtotime( '07-Mar-15' ) ) );
		$this->assertEquals( true, $ot_period_dates['is_first_week'] );
		$this->assertEquals( false, $ot_period_dates['is_last_week'] );
//		$this->assertEquals(  $cp->isSecondBiWeeklyOverTimeWeek( strtotime('23-Feb-2015'), strtotime('29-Dec-2014'), 0 ), FALSE ); //Sun


		$ot_period_dates = $cp->getOverTimePeriodDates( strtotime( '09-Mar-2015' ), 2, strtotime( '29-Dec-2014' ), 0 );
		$this->assertEquals( $ot_period_dates['start_date'], TTDate::getBeginDayEpoch( strtotime( '08-Mar-15' ) ) );
		$this->assertEquals( $ot_period_dates['end_date'], TTDate::getEndDayEpoch( strtotime( '21-Mar-15' ) ) );
		$this->assertEquals( true, $ot_period_dates['is_first_week'] );
		$this->assertEquals( false, $ot_period_dates['is_last_week'] );
//		$this->assertEquals(  $cp->isSecondBiWeeklyOverTimeWeek( strtotime('09-Mar-2015'), strtotime('29-Dec-2014'), 0 ), FALSE ); //Sun

		$ot_period_dates = $cp->getOverTimePeriodDates( strtotime( '23-Mar-2015' ), 2, strtotime( '29-Dec-2014' ), 0 );
		$this->assertEquals( $ot_period_dates['start_date'], TTDate::getBeginDayEpoch( strtotime( '22-Mar-15' ) ) );
		$this->assertEquals( $ot_period_dates['end_date'], TTDate::getEndDayEpoch( strtotime( '04-Apr-15' ) ) );
		$this->assertEquals( true, $ot_period_dates['is_first_week'] );
		$this->assertEquals( false, $ot_period_dates['is_last_week'] );
//		$this->assertEquals(  $cp->isSecondBiWeeklyOverTimeWeek( strtotime('23-Mar-2015'), strtotime('29-Dec-2014'), 0 ), FALSE ); //Sun


		$ot_period_dates = $cp->getOverTimePeriodDates( strtotime( '14-Dec-2015' ), 2, strtotime( '29-Dec-2014' ), 0 );
		$this->assertEquals( $ot_period_dates['start_date'], TTDate::getBeginDayEpoch( strtotime( '13-Dec-15' ) ) );
		$this->assertEquals( $ot_period_dates['end_date'], TTDate::getEndDayEpoch( strtotime( '26-Dec-15' ) ) );
		$this->assertEquals( true, $ot_period_dates['is_first_week'] );
		$this->assertEquals( false, $ot_period_dates['is_last_week'] );
//		$this->assertEquals(  $cp->isSecondBiWeeklyOverTimeWeek( strtotime('14-Dec-2015'), strtotime('29-Dec-2014'), 0 ), FALSE ); //Sun: Week 51

		$ot_period_dates = $cp->getOverTimePeriodDates( strtotime( '21-Dec-2015' ), 2, strtotime( '29-Dec-2014' ), 0 );
		$this->assertEquals( $ot_period_dates['start_date'], TTDate::getBeginDayEpoch( strtotime( '13-Dec-15' ) ) );
		$this->assertEquals( $ot_period_dates['end_date'], TTDate::getEndDayEpoch( strtotime( '26-Dec-15' ) ) );
		$this->assertEquals( false, $ot_period_dates['is_first_week'] );
		$this->assertEquals( true, $ot_period_dates['is_last_week'] );
//		$this->assertEquals(  $cp->isSecondBiWeeklyOverTimeWeek( strtotime('21-Dec-2015'), strtotime('29-Dec-2014'), 0 ), TRUE ); //Sun: Week 52

		$ot_period_dates = $cp->getOverTimePeriodDates( strtotime( '28-Dec-2015' ), 2, strtotime( '29-Dec-2014' ), 0 );
		$this->assertEquals( $ot_period_dates['start_date'], TTDate::getBeginDayEpoch( strtotime( '27-Dec-15' ) ) );
		$this->assertEquals( $ot_period_dates['end_date'], TTDate::getEndDayEpoch( strtotime( '09-Jan-16' ) ) );
		$this->assertEquals( true, $ot_period_dates['is_first_week'] );
		$this->assertEquals( false, $ot_period_dates['is_last_week'] );
//		$this->assertEquals(  $cp->isSecondBiWeeklyOverTimeWeek( strtotime('28-Dec-2015'), strtotime('29-Dec-2014'), 0 ), FALSE ); //Sun: Week 53

		$ot_period_dates = $cp->getOverTimePeriodDates( strtotime( '01-Jan-2014' ), 2, strtotime( '01-Jan-2014' ), 0 );
		$this->assertEquals( $ot_period_dates['start_date'], TTDate::getBeginDayEpoch( strtotime( '29-Dec-2013' ) ) );
		$this->assertEquals( $ot_period_dates['end_date'], TTDate::getEndDayEpoch( strtotime( '11-Jan-2014' ) ) );
		$this->assertEquals( true, $ot_period_dates['is_first_week'] );
		$this->assertEquals( false, $ot_period_dates['is_last_week'] );
//		$this->assertEquals(  $cp->isSecondBiWeeklyOverTimeWeek( strtotime('01-Jan-2014'), strtotime('01-Jan-2014'), 0 ), FALSE ); //Sun

		$ot_period_dates = $cp->getOverTimePeriodDates( strtotime( '06-Jan-2014' ), 2, strtotime( '01-Jan-2014' ), 0 );
		$this->assertEquals( $ot_period_dates['start_date'], TTDate::getBeginDayEpoch( strtotime( '29-Dec-2013' ) ) );
		$this->assertEquals( $ot_period_dates['end_date'], TTDate::getEndDayEpoch( strtotime( '11-Jan-2014' ) ) );
		$this->assertEquals( false, $ot_period_dates['is_first_week'] );
		$this->assertEquals( true, $ot_period_dates['is_last_week'] );
//		$this->assertEquals(  $cp->isSecondBiWeeklyOverTimeWeek( strtotime('06-Jan-2014'), strtotime('01-Jan-2014'), 0 ), TRUE ); //Sun

		$ot_period_dates = $cp->getOverTimePeriodDates( strtotime( '12-Jan-2014' ), 2, strtotime( '01-Jan-2014' ), 0 );
		$this->assertEquals( $ot_period_dates['start_date'], TTDate::getBeginDayEpoch( strtotime( '12-Jan-2014' ) ) );
		$this->assertEquals( $ot_period_dates['end_date'], TTDate::getEndDayEpoch( strtotime( '25-Jan-2014' ) ) );
		$this->assertEquals( true, $ot_period_dates['is_first_week'] );
		$this->assertEquals( false, $ot_period_dates['is_last_week'] );
//		$this->assertEquals(  $cp->isSecondBiWeeklyOverTimeWeek( strtotime('12-Jan-2014'), strtotime('01-Jan-2014'), 0 ), FALSE ); //Sun

		$ot_period_dates = $cp->getOverTimePeriodDates( strtotime( '20-Jan-2014' ), 2, strtotime( '01-Jan-2014' ), 0 );
		$this->assertEquals( $ot_period_dates['start_date'], TTDate::getBeginDayEpoch( strtotime( '12-Jan-2014' ) ) );
		$this->assertEquals( $ot_period_dates['end_date'], TTDate::getEndDayEpoch( strtotime( '25-Jan-2014' ) ) );
		$this->assertEquals( false, $ot_period_dates['is_first_week'] );
		$this->assertEquals( true, $ot_period_dates['is_last_week'] );
//		$this->assertEquals(  $cp->isSecondBiWeeklyOverTimeWeek( strtotime('20-Jan-2014'), strtotime('01-Jan-2014'), 0 ), TRUE ); //Sun

		$ot_period_dates = $cp->getOverTimePeriodDates( strtotime( '03-Feb-2014' ), 2, strtotime( '01-Jan-2014' ), 0 );
		$this->assertEquals( $ot_period_dates['start_date'], TTDate::getBeginDayEpoch( strtotime( '26-Jan-2014' ) ) );
		$this->assertEquals( $ot_period_dates['end_date'], TTDate::getEndDayEpoch( strtotime( '08-Feb-2014' ) ) );
		$this->assertEquals( false, $ot_period_dates['is_first_week'] );
		$this->assertEquals( true, $ot_period_dates['is_last_week'] );
//		$this->assertEquals(  $cp->isSecondBiWeeklyOverTimeWeek( strtotime('03-Feb-2014'), strtotime('01-Jan-2014'), 0 ), TRUE ); //Sun

		$ot_period_dates = $cp->getOverTimePeriodDates( strtotime( '17-Feb-2014' ), 2, strtotime( '01-Jan-2014' ), 0 );
		$this->assertEquals( $ot_period_dates['start_date'], TTDate::getBeginDayEpoch( strtotime( '09-Feb-2014' ) ) );
		$this->assertEquals( $ot_period_dates['end_date'], TTDate::getEndDayEpoch( strtotime( '22-Feb-2014' ) ) );
		$this->assertEquals( false, $ot_period_dates['is_first_week'] );
		$this->assertEquals( true, $ot_period_dates['is_last_week'] );
//		$this->assertEquals(  $cp->isSecondBiWeeklyOverTimeWeek( strtotime('17-Feb-2014'), strtotime('01-Jan-2014'), 0 ), TRUE ); //Sun

		$retval = false;
		$anchor_date = TTDate::getMiddleDayEpoch( strtotime( '29-Dec-2014' ) );
		$x = 0;
		for ( $i = $anchor_date; $i <= TTDate::getMiddleDayEpoch( strtotime( '29-Dec-2015' ) ); $i += ( 86400 * 7 ) ) {
			$x++; //Run at beginning so the counter essentially starts at 1.
//			$this->assertEquals( $cp->isSecondBiWeeklyOverTimeWeek( $i, $anchor_date, 0 ), $retval );
//			$retval = !$retval; //Swap

			$ot_period_dates = $cp->getOverTimePeriodDates( $i, 2, $anchor_date, 0 );
			$this->assertEquals( $ot_period_dates['is_last_week'], $retval );
			$retval = !$retval; //Swap
		}
		$this->assertEquals( 53, $x );

		$retval = false;
		$anchor_date = TTDate::getMiddleDayEpoch( strtotime( '29-Dec-2014' ) );
		$x = 0;
		for ( $i = $anchor_date; $i <= TTDate::getMiddleDayEpoch( strtotime( '29-Dec-2025' ) ); $i += ( 86400 * 7 ) ) {
			$x++; //Run at beginning so the counter essentially starts at 1.
			//$this->assertEquals( $cp->isSecondBiWeeklyOverTimeWeek( $i, $anchor_date, 0 ), $retval );
			//$retval = !$retval; //Swap

			$ot_period_dates = $cp->getOverTimePeriodDates( $i, 2, $anchor_date, 0 );
			$this->assertEquals( $ot_period_dates['is_last_week'], $retval );
			$retval = !$retval; //Swap
		}
		$this->assertEquals( 575, $x );
	}

	/**
	 * @group OvertimePolicy_testBiWeeklyOverTimePolicyA
	 */
	function testBiWeeklyOverTimePolicyA() {
		global $dd;

		//Test reaching the biweekly overtime in the first week, and part of it going into the second.
		$policy_ids['pay_formula_policy'][] = $this->createPayFormulaPolicy( $this->company_id, 200 );      //OT1.5
		$policy_ids['pay_formula_policy'][] = $this->createPayFormulaPolicy( $this->company_id, 210 );      //OT2.0
		$policy_ids['pay_formula_policy'][] = $this->createPayFormulaPolicy( $this->company_id, 220 );      //OT2.5

		$policy_ids['pay_code'][] = $this->createPayCode( $this->company_id, 300, $policy_ids['pay_formula_policy'][0] );
		$policy_ids['pay_code'][] = $this->createPayCode( $this->company_id, 310, $policy_ids['pay_formula_policy'][1] );
		$policy_ids['pay_code'][] = $this->createPayCode( $this->company_id, 320, $policy_ids['pay_formula_policy'][2] );

		$policy_ids['overtime'][] = $this->createOverTimePolicy( $this->company_id, 300, $this->policy_ids['contributing_shift_policy'][12], $policy_ids['pay_code'][0] );
		$policy_ids['overtime'][] = $this->createOverTimePolicy( $this->company_id, 310, $this->policy_ids['contributing_shift_policy'][12], $policy_ids['pay_code'][1] );
		$policy_ids['overtime'][] = $this->createOverTimePolicy( $this->company_id, 320, $this->policy_ids['contributing_shift_policy'][12], $policy_ids['pay_code'][2] );
		//print_r($policy_ids['overtime']);

		//Create Policy Group
		$dd->createPolicyGroup( $this->company_id,
								null, //Meal
								null, //Exception
								null, //Holiday
								$policy_ids['overtime'], //OT
								null, //Premium
								null, //Round
								[ $this->user_id ], //Users
								null, //Break
								null, //Accrual
								null, //Expense
								null, //Absence
								[ $this->policy_ids['regular'][12] ] //Regular
		);

		//Start two weeks ago...
		$start_epoch = $date_epoch = TTDate::getMiddleDayEpoch( TTDate::getBeginWeekEpoch( time() ) );

		$current_pay_period_obj = $this->getCurrentPayPeriod( $date_epoch );
		if ( is_object( $current_pay_period_obj ) ) {
			$date_stamp = TTDate::getDate( 'DATE', $current_pay_period_obj->getStartDate() );
			$start_epoch = $date_epoch = TTDate::getMiddleDayEpoch( $current_pay_period_obj->getStartDate() );
		} else {
			$date_stamp = TTDate::getDate( 'DATE', $date_epoch );
		}
		Debug::text( 'Using date stamp: ' . TTDate::getDate( 'DATE+TIME', $date_stamp ), __FILE__, __LINE__, __METHOD__, 10 );

		//
		//Day of Week: 1
		//
		$dd->createPunchPair( $this->user_id,
							  strtotime( $date_stamp . ' 8:00AM' ),
							  strtotime( $date_stamp . ' 8:00PM' ),
							  [
									  'in_type_id'    => 10,
									  'out_type_id'   => 10,
									  'branch_id'     => 0,
									  'department_id' => 0,
									  'job_id'        => 0,
									  'job_item_id'   => 0,
									  'punch_tag_id'  => []
							  ],
							  true
		);

		$udt_arr = $this->getUserDateTotalArray( $date_epoch, $date_epoch );
		//print_r($udt_arr);
		//Total Time
		$this->assertEquals( 5, $udt_arr[$date_epoch][0]['object_type_id'] );                               //5=System Total
		$this->assertEquals( $udt_arr[$date_epoch][0]['pay_code_id'], TTUUID::getZeroID() );
		$this->assertEquals( $udt_arr[$date_epoch][0]['total_time'], ( 12 * 3600 ) );
		//Regular Time
		$this->assertEquals( 20, $udt_arr[$date_epoch][1]['object_type_id'] );                              //Regular Time
		$this->assertEquals( $udt_arr[$date_epoch][1]['pay_code_id'], $this->policy_ids['pay_code'][100] ); //Regular Time
		$this->assertEquals( $udt_arr[$date_epoch][1]['total_time'], ( 12 * 3600 ) );
		//Make sure no other hours
		$this->assertCount( 2, $udt_arr[$date_epoch] );
		//
		//Day of Week: 2
		//
		$date_epoch = TTDate::incrementDate( TTDate::getMiddleDayEpoch( TTDate::getBeginWeekEpoch( $start_epoch ) ), 1, 'day' );
		$date_stamp = TTDate::getDate( 'DATE', $date_epoch );

		$dd->createPunchPair( $this->user_id,
							  strtotime( $date_stamp . ' 8:00AM' ),
							  strtotime( $date_stamp . ' 8:00PM' ),
							  [
									  'in_type_id'    => 10,
									  'out_type_id'   => 10,
									  'branch_id'     => 0,
									  'department_id' => 0,
									  'job_id'        => 0,
									  'job_item_id'   => 0,
									  'punch_tag_id'  => []
							  ],
							  true
		);

		$udt_arr = $this->getUserDateTotalArray( $date_epoch, $date_epoch );
		//Total Time
		$this->assertEquals( 5, $udt_arr[$date_epoch][0]['object_type_id'] );                               //5=System Total
		$this->assertEquals( $udt_arr[$date_epoch][0]['pay_code_id'], TTUUID::getZeroID() );
		$this->assertEquals( $udt_arr[$date_epoch][0]['total_time'], ( 12 * 3600 ) );
		//Regular Time
		$this->assertEquals( 20, $udt_arr[$date_epoch][1]['object_type_id'] );                              //Regular Time
		$this->assertEquals( $udt_arr[$date_epoch][1]['pay_code_id'], $this->policy_ids['pay_code'][100] ); //Regular Time
		$this->assertEquals( $udt_arr[$date_epoch][1]['total_time'], ( 12 * 3600 ) );
		//Make sure no other hours
		$this->assertCount( 2, $udt_arr[$date_epoch] );

		//
		//Day of Week: 3
		//
		$date_epoch = TTDate::incrementDate( TTDate::getMiddleDayEpoch( TTDate::getBeginWeekEpoch( $start_epoch ) ), 2, 'day' );
		$date_stamp = TTDate::getDate( 'DATE', $date_epoch );

		$dd->createPunchPair( $this->user_id,
							  strtotime( $date_stamp . ' 8:00AM' ),
							  strtotime( $date_stamp . ' 8:00PM' ),
							  [
									  'in_type_id'    => 10,
									  'out_type_id'   => 10,
									  'branch_id'     => 0,
									  'department_id' => 0,
									  'job_id'        => 0,
									  'job_item_id'   => 0,
									  'punch_tag_id'  => []
							  ],
							  true
		);

		$udt_arr = $this->getUserDateTotalArray( $date_epoch, $date_epoch );
		//Total Time
		$this->assertEquals( 5, $udt_arr[$date_epoch][0]['object_type_id'] );                               //5=System Total
		$this->assertEquals( $udt_arr[$date_epoch][0]['pay_code_id'], TTUUID::getZeroID() );
		$this->assertEquals( $udt_arr[$date_epoch][0]['total_time'], ( 12 * 3600 ) );
		//Regular Time
		$this->assertEquals( 20, $udt_arr[$date_epoch][1]['object_type_id'] );                              //Regular Time
		$this->assertEquals( $udt_arr[$date_epoch][1]['pay_code_id'], $this->policy_ids['pay_code'][100] ); //Regular Time
		$this->assertEquals( $udt_arr[$date_epoch][1]['total_time'], ( 12 * 3600 ) );
		//Make sure no other hours
		$this->assertCount( 2, $udt_arr[$date_epoch] );

		//
		//Day of Week: 4
		//
		$date_epoch = TTDate::incrementDate( TTDate::getMiddleDayEpoch( TTDate::getBeginWeekEpoch( $start_epoch ) ), 3, 'day' );
		$date_stamp = TTDate::getDate( 'DATE', $date_epoch );

		$dd->createPunchPair( $this->user_id,
							  strtotime( $date_stamp . ' 8:00AM' ),
							  strtotime( $date_stamp . ' 8:00PM' ),
							  [
									  'in_type_id'    => 10,
									  'out_type_id'   => 10,
									  'branch_id'     => 0,
									  'department_id' => 0,
									  'job_id'        => 0,
									  'job_item_id'   => 0,
									  'punch_tag_id'  => []
							  ],
							  true
		);

		$udt_arr = $this->getUserDateTotalArray( $date_epoch, $date_epoch );
		//print_r($udt_arr);
		//Total Time
		$this->assertEquals( 5, $udt_arr[$date_epoch][0]['object_type_id'] );                               //5=System Total
		$this->assertEquals( $udt_arr[$date_epoch][0]['pay_code_id'], TTUUID::getZeroID() );
		$this->assertEquals( $udt_arr[$date_epoch][0]['total_time'], ( 12 * 3600 ) );
		//Regular Time
		$this->assertEquals( 20, $udt_arr[$date_epoch][1]['object_type_id'] );                              //Regular Time
		$this->assertEquals( $udt_arr[$date_epoch][1]['pay_code_id'], $this->policy_ids['pay_code'][100] ); //Regular Time
		$this->assertEquals( $udt_arr[$date_epoch][1]['total_time'], ( 12 * 3600 ) );
		//Make sure no other hours
		$this->assertCount( 2, $udt_arr[$date_epoch] );

		//
		//Day of Week: 5
		//
		$date_epoch = TTDate::incrementDate( TTDate::getMiddleDayEpoch( TTDate::getBeginWeekEpoch( $start_epoch ) ), 4, 'day' );
		$date_stamp = TTDate::getDate( 'DATE', $date_epoch );

		$dd->createPunchPair( $this->user_id,
							  strtotime( $date_stamp . ' 8:00AM' ),
							  strtotime( $date_stamp . ' 8:00PM' ),
							  [
									  'in_type_id'    => 10,
									  'out_type_id'   => 10,
									  'branch_id'     => 0,
									  'department_id' => 0,
									  'job_id'        => 0,
									  'job_item_id'   => 0,
									  'punch_tag_id'  => []
							  ],
							  true
		);

		$udt_arr = $this->getUserDateTotalArray( $date_epoch, $date_epoch );
		//print_r($udt_arr);
		//Total Time
		$this->assertEquals( 5, $udt_arr[$date_epoch][0]['object_type_id'] );                               //5=System Total
		$this->assertEquals( $udt_arr[$date_epoch][0]['pay_code_id'], TTUUID::getZeroID() );
		$this->assertEquals( $udt_arr[$date_epoch][0]['total_time'], ( 12 * 3600 ) );
		//Regular Time
		$this->assertEquals( 20, $udt_arr[$date_epoch][1]['object_type_id'] );                              //Regular Time
		$this->assertEquals( $udt_arr[$date_epoch][1]['pay_code_id'], $this->policy_ids['pay_code'][100] ); //Regular Time
		$this->assertEquals( $udt_arr[$date_epoch][1]['total_time'], ( 12 * 3600 ) );
		//Make sure no other hours
		$this->assertCount( 2, $udt_arr[$date_epoch] );


		//
		//Day of Week: 1 - Beginning of next week...
		//
		$date_epoch = TTDate::incrementDate( TTDate::getMiddleDayEpoch( TTDate::getBeginWeekEpoch( $start_epoch ) ), 5, 'day' );
		$date_stamp = TTDate::getDate( 'DATE', $date_epoch );

		$dd->createPunchPair( $this->user_id,
							  strtotime( $date_stamp . ' 8:00AM' ),
							  strtotime( $date_stamp . ' 8:00PM' ),
							  [
									  'in_type_id'    => 10,
									  'out_type_id'   => 10,
									  'branch_id'     => 0,
									  'department_id' => 0,
									  'job_id'        => 0,
									  'job_item_id'   => 0,
									  'punch_tag_id'  => []
							  ],
							  true
		);

		$udt_arr = $this->getUserDateTotalArray( $date_epoch, $date_epoch );
		//print_r($udt_arr);
		//Total Time
		$this->assertEquals( 5, $udt_arr[$date_epoch][0]['object_type_id'] );                               //5=System Total
		$this->assertEquals( $udt_arr[$date_epoch][0]['pay_code_id'], TTUUID::getZeroID() );
		$this->assertEquals( $udt_arr[$date_epoch][0]['total_time'], ( 12 * 3600 ) );
		//Regular Time
		$this->assertEquals( 20, $udt_arr[$date_epoch][1]['object_type_id'] );                              //Regular Time
		$this->assertEquals( $udt_arr[$date_epoch][1]['pay_code_id'], $this->policy_ids['pay_code'][100] ); //Regular Time
		$this->assertEquals( $udt_arr[$date_epoch][1]['total_time'], ( 12 * 3600 ) );
		//Make sure no other hours
		$this->assertCount( 2, $udt_arr[$date_epoch] );

		//
		//Day of Week: 2
		//
		$date_epoch = TTDate::incrementDate( TTDate::getMiddleDayEpoch( TTDate::getBeginWeekEpoch( $start_epoch ) ), 6, 'day' );
		$date_stamp = TTDate::getDate( 'DATE', $date_epoch );

		$dd->createPunchPair( $this->user_id,
							  strtotime( $date_stamp . ' 8:00AM' ),
							  strtotime( $date_stamp . ' 8:00PM' ),
							  [
									  'in_type_id'    => 10,
									  'out_type_id'   => 10,
									  'branch_id'     => 0,
									  'department_id' => 0,
									  'job_id'        => 0,
									  'job_item_id'   => 0,
									  'punch_tag_id'  => []
							  ],
							  true
		);

		$udt_arr = $this->getUserDateTotalArray( $date_epoch, $date_epoch );
		//print_r($udt_arr);
		//Total Time
		$this->assertEquals( 5, $udt_arr[$date_epoch][0]['object_type_id'] );                               //5=System Total
		$this->assertEquals( $udt_arr[$date_epoch][0]['pay_code_id'], TTUUID::getZeroID() );
		$this->assertEquals( $udt_arr[$date_epoch][0]['total_time'], ( 12 * 3600 ) );
		//Regular Time
		$this->assertEquals( 20, $udt_arr[$date_epoch][1]['object_type_id'] );                              //Regular Time
		$this->assertEquals( $udt_arr[$date_epoch][1]['pay_code_id'], $this->policy_ids['pay_code'][100] ); //Regular Time
		$this->assertEquals( $udt_arr[$date_epoch][1]['total_time'], ( 8 * 3600 ) );
		//Overtime 1
		$this->assertEquals( 30, $udt_arr[$date_epoch][2]['object_type_id'] );                              //OverTime
		$this->assertEquals( $udt_arr[$date_epoch][2]['pay_code_id'], $policy_ids['pay_code'][0] );
		$this->assertEquals( $udt_arr[$date_epoch][2]['total_time'], ( 4 * 3600 ) );
		//Make sure no other hours
		$this->assertCount( 3, $udt_arr[$date_epoch] );

		//
		//Day of Week: 3
		//
		$date_epoch = TTDate::incrementDate( TTDate::getMiddleDayEpoch( TTDate::getBeginWeekEpoch( $start_epoch ) ), 7, 'day' );
		$date_stamp = TTDate::getDate( 'DATE', $date_epoch );

		$dd->createPunchPair( $this->user_id,
							  strtotime( $date_stamp . ' 8:00AM' ),
							  strtotime( $date_stamp . ' 8:00PM' ),
							  [
									  'in_type_id'    => 10,
									  'out_type_id'   => 10,
									  'branch_id'     => 0,
									  'department_id' => 0,
									  'job_id'        => 0,
									  'job_item_id'   => 0,
									  'punch_tag_id'  => []
							  ],
							  true
		);

		$udt_arr = $this->getUserDateTotalArray( $date_epoch, $date_epoch );
		//print_r($udt_arr);
		//Total Time
		$this->assertEquals( 5, $udt_arr[$date_epoch][0]['object_type_id'] );                               //5=System Total
		$this->assertEquals( $udt_arr[$date_epoch][0]['pay_code_id'], TTUUID::getZeroID() );
		$this->assertEquals( $udt_arr[$date_epoch][0]['total_time'], ( 12 * 3600 ) );

		//Overtime policies are sorted by id desc, so the we have to reverse the order.
		//Overtime 2
		$this->assertEquals( 30, $udt_arr[$date_epoch][1]['object_type_id'] );                              //OverTime
		$this->assertEquals( $udt_arr[$date_epoch][1]['pay_code_id'], $policy_ids['pay_code'][2] );
		$this->assertEquals( $udt_arr[$date_epoch][1]['total_time'], ( 10 * 3600 ) );
		//Overtime 3
		$this->assertEquals( 30, $udt_arr[$date_epoch][2]['object_type_id'] );                              //OverTime
		$this->assertEquals( $udt_arr[$date_epoch][2]['pay_code_id'], $policy_ids['pay_code'][1] );
		$this->assertEquals( $udt_arr[$date_epoch][2]['total_time'], ( 2 * 3600 ) );
		//Make sure no other hours
		$this->assertCount( 3, $udt_arr[$date_epoch] );

		//
		//Day of Week: 4
		//
		$date_epoch = TTDate::incrementDate( TTDate::getMiddleDayEpoch( TTDate::getBeginWeekEpoch( $start_epoch ) ), 8, 'day' );
		$date_stamp = TTDate::getDate( 'DATE', $date_epoch );

		$dd->createPunchPair( $this->user_id,
							  strtotime( $date_stamp . ' 8:00AM' ),
							  strtotime( $date_stamp . ' 8:00PM' ),
							  [
									  'in_type_id'    => 10,
									  'out_type_id'   => 10,
									  'branch_id'     => 0,
									  'department_id' => 0,
									  'job_id'        => 0,
									  'job_item_id'   => 0,
									  'punch_tag_id'  => []
							  ],
							  true
		);

		$udt_arr = $this->getUserDateTotalArray( $date_epoch, $date_epoch );
		//print_r($udt_arr);
		//Total Time
		$this->assertEquals( 5, $udt_arr[$date_epoch][0]['object_type_id'] );                               //5=System Total
		$this->assertEquals( $udt_arr[$date_epoch][0]['pay_code_id'], TTUUID::getZeroID() );
		$this->assertEquals( $udt_arr[$date_epoch][0]['total_time'], ( 12 * 3600 ) );

		//Overtime policies are sorted by id desc, so the we have to reverse the order.
		//Overtime 3
		$this->assertEquals( 30, $udt_arr[$date_epoch][1]['object_type_id'] );                              //OverTime
		$this->assertEquals( $udt_arr[$date_epoch][1]['pay_code_id'], $policy_ids['pay_code'][2] );
		$this->assertEquals( $udt_arr[$date_epoch][1]['total_time'], ( 12 * 3600 ) );
		//Make sure no other hours
		$this->assertCount( 2, $udt_arr[$date_epoch] );

		return true;
	}

	/**
	 * @group OvertimePolicy_testBiWeeklyOverTimePolicyB
	 */
	function testBiWeeklyOverTimePolicyB() {
		global $dd;

		//Test reaching the biweekly overtime in the first week, and part of it going into the second.
		$policy_ids['pay_formula_policy'][] = $this->createPayFormulaPolicy( $this->company_id, 200 );      //OT1.5
		$policy_ids['pay_formula_policy'][] = $this->createPayFormulaPolicy( $this->company_id, 210 );      //OT2.0
		$policy_ids['pay_formula_policy'][] = $this->createPayFormulaPolicy( $this->company_id, 220 );      //OT2.5

		$policy_ids['pay_code'][] = $this->createPayCode( $this->company_id, 300, $policy_ids['pay_formula_policy'][0] );
		$policy_ids['pay_code'][] = $this->createPayCode( $this->company_id, 310, $policy_ids['pay_formula_policy'][1] );
		$policy_ids['pay_code'][] = $this->createPayCode( $this->company_id, 320, $policy_ids['pay_formula_policy'][2] );

		$policy_ids['overtime'][] = $this->createOverTimePolicy( $this->company_id, 300, $this->policy_ids['contributing_shift_policy'][12], $policy_ids['pay_code'][0] );
		$policy_ids['overtime'][] = $this->createOverTimePolicy( $this->company_id, 310, $this->policy_ids['contributing_shift_policy'][12], $policy_ids['pay_code'][1] );
		$policy_ids['overtime'][] = $this->createOverTimePolicy( $this->company_id, 320, $this->policy_ids['contributing_shift_policy'][12], $policy_ids['pay_code'][2] );
		//print_r($policy_ids['overtime']);

		//Create Policy Group
		$dd->createPolicyGroup( $this->company_id,
								null, //Meal
								null, //Exception
								null, //Holiday
								$policy_ids['overtime'], //OT
								null, //Premium
								null, //Round
								[ $this->user_id ], //Users
								null, //Break
								null, //Accrual
								null, //Expense
								null, //Absence
								[ $this->policy_ids['regular'][12] ] //Regular
		);

		//Start two weeks ago...
		$start_epoch = $date_epoch = TTDate::getMiddleDayEpoch( TTDate::getBeginWeekEpoch( time() ) );

		$current_pay_period_obj = $this->getCurrentPayPeriod( $date_epoch );
		if ( is_object( $current_pay_period_obj ) ) {
			$date_stamp = TTDate::getDate( 'DATE', $current_pay_period_obj->getStartDate() );
			$start_epoch = $date_epoch = TTDate::getMiddleDayEpoch( $current_pay_period_obj->getStartDate() );
		} else {
			$date_stamp = TTDate::getDate( 'DATE', $date_epoch );
		}
		Debug::text( 'Using date stamp: ' . TTDate::getDate( 'DATE+TIME', $date_stamp ), __FILE__, __LINE__, __METHOD__, 10 );

		//
		//Day of Week: 1
		//
		$dd->createPunchPair( $this->user_id,
							  strtotime( $date_stamp . ' 8:00AM' ),
							  strtotime( $date_stamp . ' 10:00PM' ),
							  [
									  'in_type_id'    => 10,
									  'out_type_id'   => 10,
									  'branch_id'     => 0,
									  'department_id' => 0,
									  'job_id'        => 0,
									  'job_item_id'   => 0,
									  'punch_tag_id'  => []
							  ],
							  true
		);

		$udt_arr = $this->getUserDateTotalArray( $date_epoch, $date_epoch );
		//print_r($udt_arr);
		//Total Time
		$this->assertEquals( 5, $udt_arr[$date_epoch][0]['object_type_id'] );                               //5=System Total
		$this->assertEquals( $udt_arr[$date_epoch][0]['pay_code_id'], TTUUID::getZeroID() );
		$this->assertEquals( $udt_arr[$date_epoch][0]['total_time'], ( 14 * 3600 ) );
		//Regular Time
		$this->assertEquals( 20, $udt_arr[$date_epoch][1]['object_type_id'] );                              //Regular Time
		$this->assertEquals( $udt_arr[$date_epoch][1]['pay_code_id'], $this->policy_ids['pay_code'][100] ); //Regular Time
		$this->assertEquals( $udt_arr[$date_epoch][1]['total_time'], ( 14 * 3600 ) );
		//Make sure no other hours
		$this->assertCount( 2, $udt_arr[$date_epoch] );

		//
		//Day of Week: 2
		//
		$date_epoch = TTDate::incrementDate( TTDate::getMiddleDayEpoch( TTDate::getBeginWeekEpoch( $start_epoch ) ), 1, 'day' );
		$date_stamp = TTDate::getDate( 'DATE', $date_epoch );

		$dd->createPunchPair( $this->user_id,
							  strtotime( $date_stamp . ' 8:00AM' ),
							  strtotime( $date_stamp . ' 10:00PM' ),
							  [
									  'in_type_id'    => 10,
									  'out_type_id'   => 10,
									  'branch_id'     => 0,
									  'department_id' => 0,
									  'job_id'        => 0,
									  'job_item_id'   => 0,
									  'punch_tag_id'  => []
							  ],
							  true
		);

		$udt_arr = $this->getUserDateTotalArray( $date_epoch, $date_epoch );
		//Total Time
		$this->assertEquals( 5, $udt_arr[$date_epoch][0]['object_type_id'] );                               //5=System Total
		$this->assertEquals( $udt_arr[$date_epoch][0]['pay_code_id'], TTUUID::getZeroID() );
		$this->assertEquals( $udt_arr[$date_epoch][0]['total_time'], ( 14 * 3600 ) );
		//Regular Time
		$this->assertEquals( 20, $udt_arr[$date_epoch][1]['object_type_id'] );                              //Regular Time
		$this->assertEquals( $udt_arr[$date_epoch][1]['pay_code_id'], $this->policy_ids['pay_code'][100] ); //Regular Time
		$this->assertEquals( $udt_arr[$date_epoch][1]['total_time'], ( 14 * 3600 ) );
		//Make sure no other hours
		$this->assertCount( 2, $udt_arr[$date_epoch] );

		//
		//Day of Week: 3
		//
		$date_epoch = TTDate::incrementDate( TTDate::getMiddleDayEpoch( TTDate::getBeginWeekEpoch( $start_epoch ) ), 2, 'day' );
		$date_stamp = TTDate::getDate( 'DATE', $date_epoch );

		$dd->createPunchPair( $this->user_id,
							  strtotime( $date_stamp . ' 8:00AM' ),
							  strtotime( $date_stamp . ' 10:00PM' ),
							  [
									  'in_type_id'    => 10,
									  'out_type_id'   => 10,
									  'branch_id'     => 0,
									  'department_id' => 0,
									  'job_id'        => 0,
									  'job_item_id'   => 0,
									  'punch_tag_id'  => []
							  ],
							  true
		);

		$udt_arr = $this->getUserDateTotalArray( $date_epoch, $date_epoch );
		//Total Time
		$this->assertEquals( 5, $udt_arr[$date_epoch][0]['object_type_id'] );                               //5=System Total
		$this->assertEquals( $udt_arr[$date_epoch][0]['pay_code_id'], TTUUID::getZeroID() );
		$this->assertEquals( $udt_arr[$date_epoch][0]['total_time'], ( 14 * 3600 ) );
		//Regular Time
		$this->assertEquals( 20, $udt_arr[$date_epoch][1]['object_type_id'] );                              //Regular Time
		$this->assertEquals( $udt_arr[$date_epoch][1]['pay_code_id'], $this->policy_ids['pay_code'][100] ); //Regular Time
		$this->assertEquals( $udt_arr[$date_epoch][1]['total_time'], ( 14 * 3600 ) );
		//Make sure no other hours
		$this->assertCount( 2, $udt_arr[$date_epoch] );

		//
		//Day of Week: 4
		//
		$date_epoch = TTDate::incrementDate( TTDate::getMiddleDayEpoch( TTDate::getBeginWeekEpoch( $start_epoch ) ), 3, 'day' );
		$date_stamp = TTDate::getDate( 'DATE', $date_epoch );

		$dd->createPunchPair( $this->user_id,
							  strtotime( $date_stamp . ' 8:00AM' ),
							  strtotime( $date_stamp . ' 10:00PM' ),
							  [
									  'in_type_id'    => 10,
									  'out_type_id'   => 10,
									  'branch_id'     => 0,
									  'department_id' => 0,
									  'job_id'        => 0,
									  'job_item_id'   => 0,
									  'punch_tag_id'  => []
							  ],
							  true
		);

		$udt_arr = $this->getUserDateTotalArray( $date_epoch, $date_epoch );
		//print_r($udt_arr);
		//Total Time
		$this->assertEquals( 5, $udt_arr[$date_epoch][0]['object_type_id'] );                               //5=System Total
		$this->assertEquals( $udt_arr[$date_epoch][0]['pay_code_id'], TTUUID::getZeroID() );
		$this->assertEquals( $udt_arr[$date_epoch][0]['total_time'], ( 14 * 3600 ) );
		//Regular Time
		$this->assertEquals( 20, $udt_arr[$date_epoch][1]['object_type_id'] );                              //Regular Time
		$this->assertEquals( $udt_arr[$date_epoch][1]['pay_code_id'], $this->policy_ids['pay_code'][100] ); //Regular Time
		$this->assertEquals( $udt_arr[$date_epoch][1]['total_time'], ( 14 * 3600 ) );
		//Make sure no other hours
		$this->assertCount( 2, $udt_arr[$date_epoch] );

		//
		//Day of Week: 5
		//
		$date_epoch = TTDate::incrementDate( TTDate::getMiddleDayEpoch( TTDate::getBeginWeekEpoch( $start_epoch ) ), 4, 'day' );
		$date_stamp = TTDate::getDate( 'DATE', $date_epoch );

		$dd->createPunchPair( $this->user_id,
							  strtotime( $date_stamp . ' 8:00AM' ),
							  strtotime( $date_stamp . ' 10:00PM' ),
							  [
									  'in_type_id'    => 10,
									  'out_type_id'   => 10,
									  'branch_id'     => 0,
									  'department_id' => 0,
									  'job_id'        => 0,
									  'job_item_id'   => 0,
									  'punch_tag_id'  => []
							  ],
							  true
		);

		$udt_arr = $this->getUserDateTotalArray( $date_epoch, $date_epoch );
		//print_r($udt_arr);
		//Total Time
		$this->assertEquals( 5, $udt_arr[$date_epoch][0]['object_type_id'] );                               //5=System Total
		$this->assertEquals( $udt_arr[$date_epoch][0]['pay_code_id'], TTUUID::getZeroID() );
		$this->assertEquals( $udt_arr[$date_epoch][0]['total_time'], ( 14 * 3600 ) );
		//Regular Time
		$this->assertEquals( 20, $udt_arr[$date_epoch][1]['object_type_id'] );                              //Regular Time
		$this->assertEquals( $udt_arr[$date_epoch][1]['pay_code_id'], $this->policy_ids['pay_code'][100] ); //Regular Time
		$this->assertEquals( $udt_arr[$date_epoch][1]['total_time'], ( 14 * 3600 ) );
		//Make sure no other hours
		$this->assertCount( 2, $udt_arr[$date_epoch] );

		//
		//Day of Week: 6
		//
		$date_epoch = TTDate::incrementDate( TTDate::getMiddleDayEpoch( TTDate::getBeginWeekEpoch( $start_epoch ) ), 5, 'day' );
		$date_stamp = TTDate::getDate( 'DATE', $date_epoch );

		$dd->createPunchPair( $this->user_id,
							  strtotime( $date_stamp . ' 8:00AM' ),
							  strtotime( $date_stamp . ' 10:00PM' ),
							  [
									  'in_type_id'    => 10,
									  'out_type_id'   => 10,
									  'branch_id'     => 0,
									  'department_id' => 0,
									  'job_id'        => 0,
									  'job_item_id'   => 0,
									  'punch_tag_id'  => []
							  ],
							  true
		);

		$udt_arr = $this->getUserDateTotalArray( $date_epoch, $date_epoch );
		//print_r($udt_arr);
		//Total Time
		$this->assertEquals( 5, $udt_arr[$date_epoch][0]['object_type_id'] );                               //5=System Total
		$this->assertEquals( $udt_arr[$date_epoch][0]['pay_code_id'], TTUUID::getZeroID() );
		$this->assertEquals( $udt_arr[$date_epoch][0]['total_time'], ( 14 * 3600 ) );
		//Regular Time
		$this->assertEquals( 20, $udt_arr[$date_epoch][1]['object_type_id'] );                              //Regular Time
		$this->assertEquals( $udt_arr[$date_epoch][1]['pay_code_id'], $this->policy_ids['pay_code'][100] ); //Regular Time
		$this->assertEquals( $udt_arr[$date_epoch][1]['total_time'], ( 10 * 3600 ) );
		//Overtime 1
		$this->assertEquals( 30, $udt_arr[$date_epoch][2]['object_type_id'] );                              //OverTime
		$this->assertEquals( $udt_arr[$date_epoch][2]['pay_code_id'], $policy_ids['pay_code'][0] );
		$this->assertEquals( $udt_arr[$date_epoch][2]['total_time'], ( 4 * 3600 ) );
		//Make sure no other hours
		$this->assertCount( 3, $udt_arr[$date_epoch] );


		//
		//Day of Week: 7
		//
		$date_epoch = TTDate::incrementDate( TTDate::getMiddleDayEpoch( TTDate::getBeginWeekEpoch( $start_epoch ) ), 6, 'day' );
		$date_stamp = TTDate::getDate( 'DATE', $date_epoch );

		$dd->createPunchPair( $this->user_id,
							  strtotime( $date_stamp . ' 8:00AM' ),
							  strtotime( $date_stamp . ' 10:00PM' ),
							  [
									  'in_type_id'    => 10,
									  'out_type_id'   => 10,
									  'branch_id'     => 0,
									  'department_id' => 0,
									  'job_id'        => 0,
									  'job_item_id'   => 0,
									  'punch_tag_id'  => []
							  ],
							  true
		);

		$udt_arr = $this->getUserDateTotalArray( $date_epoch, $date_epoch );
		//print_r($udt_arr);
		//Total Time
		$this->assertEquals( 5, $udt_arr[$date_epoch][0]['object_type_id'] );                               //5=System Total
		$this->assertEquals( $udt_arr[$date_epoch][0]['pay_code_id'], TTUUID::getZeroID() );
		$this->assertEquals( $udt_arr[$date_epoch][0]['total_time'], ( 14 * 3600 ) );
		//Overtime 2
		$this->assertEquals( 30, $udt_arr[$date_epoch][1]['object_type_id'] );                              //OverTime
		$this->assertEquals( $udt_arr[$date_epoch][1]['pay_code_id'], $policy_ids['pay_code'][2] );
		$this->assertEquals( $udt_arr[$date_epoch][1]['total_time'], ( 12 * 3600 ) );
		//Overtime 3
		$this->assertEquals( 30, $udt_arr[$date_epoch][2]['object_type_id'] );                              //OverTime
		$this->assertEquals( $udt_arr[$date_epoch][2]['pay_code_id'], $policy_ids['pay_code'][1] );
		$this->assertEquals( $udt_arr[$date_epoch][2]['total_time'], ( 2 * 3600 ) );
		//Make sure no other hours
		$this->assertCount( 3, $udt_arr[$date_epoch] );


		//
		//Day of Week: 1 - Beginning of next week...
		//
		$date_epoch = TTDate::incrementDate( TTDate::getMiddleDayEpoch( TTDate::getBeginWeekEpoch( $start_epoch ) ), 7, 'day' );
		$date_stamp = TTDate::getDate( 'DATE', $date_epoch );

		$dd->createPunchPair( $this->user_id,
							  strtotime( $date_stamp . ' 8:00AM' ),
							  strtotime( $date_stamp . ' 10:00PM' ),
							  [
									  'in_type_id'    => 10,
									  'out_type_id'   => 10,
									  'branch_id'     => 0,
									  'department_id' => 0,
									  'job_id'        => 0,
									  'job_item_id'   => 0,
									  'punch_tag_id'  => []
							  ],
							  true
		);

		$udt_arr = $this->getUserDateTotalArray( $date_epoch, $date_epoch );
		//print_r($udt_arr);
		//Total Time
		$this->assertEquals( 5, $udt_arr[$date_epoch][0]['object_type_id'] );                               //5=System Total
		$this->assertEquals( $udt_arr[$date_epoch][0]['pay_code_id'], TTUUID::getZeroID() );
		$this->assertEquals( $udt_arr[$date_epoch][0]['total_time'], ( 14 * 3600 ) );
		//Overtime 3
		$this->assertEquals( 30, $udt_arr[$date_epoch][1]['object_type_id'] );                              //OverTime
		$this->assertEquals( $udt_arr[$date_epoch][1]['pay_code_id'], $policy_ids['pay_code'][2] );
		$this->assertEquals( $udt_arr[$date_epoch][1]['total_time'], ( 14 * 3600 ) );
		//Make sure no other hours
		$this->assertCount( 2, $udt_arr[$date_epoch] );

		//
		//Day of Week: 2
		//
		$date_epoch = TTDate::incrementDate( TTDate::getMiddleDayEpoch( TTDate::getBeginWeekEpoch( $start_epoch ) ), 8, 'day' );
		$date_stamp = TTDate::getDate( 'DATE', $date_epoch );

		$dd->createPunchPair( $this->user_id,
							  strtotime( $date_stamp . ' 8:00AM' ),
							  strtotime( $date_stamp . ' 10:00PM' ),
							  [
									  'in_type_id'    => 10,
									  'out_type_id'   => 10,
									  'branch_id'     => 0,
									  'department_id' => 0,
									  'job_id'        => 0,
									  'job_item_id'   => 0,
									  'punch_tag_id'  => []
							  ],
							  true
		);

		$udt_arr = $this->getUserDateTotalArray( $date_epoch, $date_epoch );
		//print_r($udt_arr);
		//Total Time
		$this->assertEquals( 5, $udt_arr[$date_epoch][0]['object_type_id'] );                               //5=System Total
		$this->assertEquals( $udt_arr[$date_epoch][0]['pay_code_id'], TTUUID::getZeroID() );
		$this->assertEquals( $udt_arr[$date_epoch][0]['total_time'], ( 14 * 3600 ) );
		//Overtime 3
		$this->assertEquals( 30, $udt_arr[$date_epoch][1]['object_type_id'] );                              //OverTime
		$this->assertEquals( $udt_arr[$date_epoch][1]['pay_code_id'], $policy_ids['pay_code'][2] );
		$this->assertEquals( $udt_arr[$date_epoch][1]['total_time'], ( 14 * 3600 ) );
		//Make sure no other hours
		$this->assertCount( 2, $udt_arr[$date_epoch] );

		//
		//Day of Week: 3
		//
		$date_epoch = TTDate::incrementDate( TTDate::getMiddleDayEpoch( TTDate::getBeginWeekEpoch( $start_epoch ) ), 9, 'day' );
		$date_stamp = TTDate::getDate( 'DATE', $date_epoch );

		$dd->createPunchPair( $this->user_id,
							  strtotime( $date_stamp . ' 8:00AM' ),
							  strtotime( $date_stamp . ' 10:00PM' ),
							  [
									  'in_type_id'    => 10,
									  'out_type_id'   => 10,
									  'branch_id'     => 0,
									  'department_id' => 0,
									  'job_id'        => 0,
									  'job_item_id'   => 0,
									  'punch_tag_id'  => []
							  ],
							  true
		);

		$udt_arr = $this->getUserDateTotalArray( $date_epoch, $date_epoch );
		//print_r($udt_arr);
		//Total Time
		$this->assertEquals( 5, $udt_arr[$date_epoch][0]['object_type_id'] );                               //5=System Total
		$this->assertEquals( $udt_arr[$date_epoch][0]['pay_code_id'], TTUUID::getZeroID() );
		$this->assertEquals( $udt_arr[$date_epoch][0]['total_time'], ( 14 * 3600 ) );
		//Overtime 3
		$this->assertEquals( 30, $udt_arr[$date_epoch][1]['object_type_id'] );                              //OverTime
		$this->assertEquals( $udt_arr[$date_epoch][1]['pay_code_id'], $policy_ids['pay_code'][2] );
		$this->assertEquals( $udt_arr[$date_epoch][1]['total_time'], ( 14 * 3600 ) );
		//Make sure no other hours
		$this->assertCount( 2, $udt_arr[$date_epoch] );

		return true;
	}

	/**
	 * @group OvertimePolicy_testBiWeeklyOverTimePolicyC
	 */
	function testBiWeeklyOverTimePolicyC() {
		global $dd;

		//Test reaching the biweekly overtime just in the 2nd week.
		$policy_ids['pay_formula_policy'][] = $this->createPayFormulaPolicy( $this->company_id, 200 );      //OT1.5
		$policy_ids['pay_formula_policy'][] = $this->createPayFormulaPolicy( $this->company_id, 210 );      //OT2.0
		$policy_ids['pay_formula_policy'][] = $this->createPayFormulaPolicy( $this->company_id, 220 );      //OT2.5

		$policy_ids['pay_code'][] = $this->createPayCode( $this->company_id, 300, $policy_ids['pay_formula_policy'][0] );
		$policy_ids['pay_code'][] = $this->createPayCode( $this->company_id, 310, $policy_ids['pay_formula_policy'][1] );
		$policy_ids['pay_code'][] = $this->createPayCode( $this->company_id, 320, $policy_ids['pay_formula_policy'][2] );

		$policy_ids['overtime'][] = $this->createOverTimePolicy( $this->company_id, 300, $this->policy_ids['contributing_shift_policy'][12], $policy_ids['pay_code'][0] );
		$policy_ids['overtime'][] = $this->createOverTimePolicy( $this->company_id, 310, $this->policy_ids['contributing_shift_policy'][12], $policy_ids['pay_code'][1] );
		$policy_ids['overtime'][] = $this->createOverTimePolicy( $this->company_id, 320, $this->policy_ids['contributing_shift_policy'][12], $policy_ids['pay_code'][2] );
		//print_r($policy_ids['overtime']);

		//Create Policy Group
		$dd->createPolicyGroup( $this->company_id,
								null, //Meal
								null, //Exception
								null, //Holiday
								$policy_ids['overtime'], //OT
								null, //Premium
								null, //Round
								[ $this->user_id ], //Users
								null, //Break
								null, //Accrual
								null, //Expense
								null, //Absence
								[ $this->policy_ids['regular'][12] ] //Regular
		);

		//Start two weeks ago...
		$start_epoch = $date_epoch = TTDate::getMiddleDayEpoch( TTDate::getBeginWeekEpoch( time() ) );

		$current_pay_period_obj = $this->getCurrentPayPeriod( $date_epoch );
		if ( is_object( $current_pay_period_obj ) ) {
			$date_stamp = TTDate::getDate( 'DATE', ( $current_pay_period_obj->getStartDate() + ( 7 * 86400 + 3601 ) ) );
			$start_epoch = $date_epoch = TTDate::getMiddleDayEpoch( $current_pay_period_obj->getStartDate() + ( 7 * 86400 + 3601 ) );
		} else {
			$date_stamp = TTDate::getDate( 'DATE', $date_epoch );
		}
		Debug::text( 'Using date stamp: ' . TTDate::getDate( 'DATE+TIME', $date_stamp ), __FILE__, __LINE__, __METHOD__, 10 );

		//
		//Day of Week: 1
		//
		$dd->createPunchPair( $this->user_id,
							  strtotime( $date_stamp . ' 6:00AM' ),
							  strtotime( $date_stamp . ' 10:00PM' ),
							  [
									  'in_type_id'    => 10,
									  'out_type_id'   => 10,
									  'branch_id'     => 0,
									  'department_id' => 0,
									  'job_id'        => 0,
									  'job_item_id'   => 0,
									  'punch_tag_id'  => []
							  ],
							  true
		);

		$udt_arr = $this->getUserDateTotalArray( $date_epoch, $date_epoch );
		//print_r($udt_arr);
		//Total Time
		$this->assertEquals( 5, $udt_arr[$date_epoch][0]['object_type_id'] );                               //5=System Total
		$this->assertEquals( $udt_arr[$date_epoch][0]['pay_code_id'], TTUUID::getZeroID() );
		$this->assertEquals( $udt_arr[$date_epoch][0]['total_time'], ( 16 * 3600 ) );
		//Regular Time
		$this->assertEquals( 20, $udt_arr[$date_epoch][1]['object_type_id'] );                              //Regular Time
		$this->assertEquals( $udt_arr[$date_epoch][1]['pay_code_id'], $this->policy_ids['pay_code'][100] ); //Regular Time
		$this->assertEquals( $udt_arr[$date_epoch][1]['total_time'], ( 16 * 3600 ) );
		//Make sure no other hours
		$this->assertCount( 2, $udt_arr[$date_epoch] );

		//
		//Day of Week: 2
		//
		$date_epoch = TTDate::incrementDate( TTDate::getMiddleDayEpoch( TTDate::getBeginWeekEpoch( $start_epoch ) ), 1, 'day' );
		$date_stamp = TTDate::getDate( 'DATE', $date_epoch );

		$dd->createPunchPair( $this->user_id,
							  strtotime( $date_stamp . ' 6:00AM' ),
							  strtotime( $date_stamp . ' 10:00PM' ),
							  [
									  'in_type_id'    => 10,
									  'out_type_id'   => 10,
									  'branch_id'     => 0,
									  'department_id' => 0,
									  'job_id'        => 0,
									  'job_item_id'   => 0,
									  'punch_tag_id'  => []
							  ],
							  true
		);

		$udt_arr = $this->getUserDateTotalArray( $date_epoch, $date_epoch );
		//Total Time
		$this->assertEquals( 5, $udt_arr[$date_epoch][0]['object_type_id'] );                               //5=System Total
		$this->assertEquals( $udt_arr[$date_epoch][0]['pay_code_id'], TTUUID::getZeroID() );
		$this->assertEquals( $udt_arr[$date_epoch][0]['total_time'], ( 16 * 3600 ) );
		//Regular Time
		$this->assertEquals( 20, $udt_arr[$date_epoch][1]['object_type_id'] );                              //Regular Time
		$this->assertEquals( $udt_arr[$date_epoch][1]['pay_code_id'], $this->policy_ids['pay_code'][100] ); //Regular Time
		$this->assertEquals( $udt_arr[$date_epoch][1]['total_time'], ( 16 * 3600 ) );
		//Make sure no other hours
		$this->assertCount( 2, $udt_arr[$date_epoch] );

		//
		//Day of Week: 3
		//
		$date_epoch = TTDate::incrementDate( TTDate::getMiddleDayEpoch( TTDate::getBeginWeekEpoch( $start_epoch ) ), 2, 'day' );
		$date_stamp = TTDate::getDate( 'DATE', $date_epoch );

		$dd->createPunchPair( $this->user_id,
							  strtotime( $date_stamp . ' 6:00AM' ),
							  strtotime( $date_stamp . ' 10:00PM' ),
							  [
									  'in_type_id'    => 10,
									  'out_type_id'   => 10,
									  'branch_id'     => 0,
									  'department_id' => 0,
									  'job_id'        => 0,
									  'job_item_id'   => 0,
									  'punch_tag_id'  => []
							  ],
							  true
		);

		$udt_arr = $this->getUserDateTotalArray( $date_epoch, $date_epoch );
		//Total Time
		$this->assertEquals( 5, $udt_arr[$date_epoch][0]['object_type_id'] );                               //5=System Total
		$this->assertEquals( $udt_arr[$date_epoch][0]['pay_code_id'], TTUUID::getZeroID() );
		$this->assertEquals( $udt_arr[$date_epoch][0]['total_time'], ( 16 * 3600 ) );
		//Regular Time
		$this->assertEquals( 20, $udt_arr[$date_epoch][1]['object_type_id'] );                              //Regular Time
		$this->assertEquals( $udt_arr[$date_epoch][1]['pay_code_id'], $this->policy_ids['pay_code'][100] ); //Regular Time
		$this->assertEquals( $udt_arr[$date_epoch][1]['total_time'], ( 16 * 3600 ) );
		//Make sure no other hours
		$this->assertCount( 2, $udt_arr[$date_epoch] );

		//
		//Day of Week: 4
		//
		$date_epoch = TTDate::incrementDate( TTDate::getMiddleDayEpoch( TTDate::getBeginWeekEpoch( $start_epoch ) ), 3, 'day' );
		$date_stamp = TTDate::getDate( 'DATE', $date_epoch );

		$dd->createPunchPair( $this->user_id,
							  strtotime( $date_stamp . ' 6:00AM' ),
							  strtotime( $date_stamp . ' 10:00PM' ),
							  [
									  'in_type_id'    => 10,
									  'out_type_id'   => 10,
									  'branch_id'     => 0,
									  'department_id' => 0,
									  'job_id'        => 0,
									  'job_item_id'   => 0,
									  'punch_tag_id'  => []
							  ],
							  true
		);

		$udt_arr = $this->getUserDateTotalArray( $date_epoch, $date_epoch );
		//print_r($udt_arr);
		//Total Time
		$this->assertEquals( 5, $udt_arr[$date_epoch][0]['object_type_id'] );                               //5=System Total
		$this->assertEquals( $udt_arr[$date_epoch][0]['pay_code_id'], TTUUID::getZeroID() );
		$this->assertEquals( $udt_arr[$date_epoch][0]['total_time'], ( 16 * 3600 ) );
		//Regular Time
		$this->assertEquals( 20, $udt_arr[$date_epoch][1]['object_type_id'] );                              //Regular Time
		$this->assertEquals( $udt_arr[$date_epoch][1]['pay_code_id'], $this->policy_ids['pay_code'][100] ); //Regular Time
		$this->assertEquals( $udt_arr[$date_epoch][1]['total_time'], ( 16 * 3600 ) );
		//Make sure no other hours
		$this->assertCount( 2, $udt_arr[$date_epoch] );

		//
		//Day of Week: 5
		//
		$date_epoch = TTDate::incrementDate( TTDate::getMiddleDayEpoch( TTDate::getBeginWeekEpoch( $start_epoch ) ), 4, 'day' );
		$date_stamp = TTDate::getDate( 'DATE', $date_epoch );

		$dd->createPunchPair( $this->user_id,
							  strtotime( $date_stamp . ' 6:00AM' ),
							  strtotime( $date_stamp . ' 10:00PM' ),
							  [
									  'in_type_id'    => 10,
									  'out_type_id'   => 10,
									  'branch_id'     => 0,
									  'department_id' => 0,
									  'job_id'        => 0,
									  'job_item_id'   => 0,
									  'punch_tag_id'  => []
							  ],
							  true
		);

		$udt_arr = $this->getUserDateTotalArray( $date_epoch, $date_epoch );
		//print_r($udt_arr);
		//Total Time
		$this->assertEquals( 5, $udt_arr[$date_epoch][0]['object_type_id'] );                               //5=System Total
		$this->assertEquals( $udt_arr[$date_epoch][0]['pay_code_id'], TTUUID::getZeroID() );
		$this->assertEquals( $udt_arr[$date_epoch][0]['total_time'], ( 16 * 3600 ) );
		//Regular Time
		$this->assertEquals( 20, $udt_arr[$date_epoch][1]['object_type_id'] );                              //Regular Time
		$this->assertEquals( $udt_arr[$date_epoch][1]['pay_code_id'], $this->policy_ids['pay_code'][100] ); //Regular Time
		$this->assertEquals( $udt_arr[$date_epoch][1]['total_time'], ( 16 * 3600 ) );
		//Make sure no other hours
		$this->assertCount( 2, $udt_arr[$date_epoch] );

		//
		//Day of Week: 6
		//
		$date_epoch = TTDate::incrementDate( TTDate::getMiddleDayEpoch( TTDate::getBeginWeekEpoch( $start_epoch ) ), 5, 'day' );
		$date_stamp = TTDate::getDate( 'DATE', $date_epoch );

		$dd->createPunchPair( $this->user_id,
							  strtotime( $date_stamp . ' 6:00AM' ),
							  strtotime( $date_stamp . ' 10:00PM' ),
							  [
									  'in_type_id'    => 10,
									  'out_type_id'   => 10,
									  'branch_id'     => 0,
									  'department_id' => 0,
									  'job_id'        => 0,
									  'job_item_id'   => 0,
									  'punch_tag_id'  => []
							  ],
							  true
		);

		$udt_arr = $this->getUserDateTotalArray( $date_epoch, $date_epoch );
		//print_r($udt_arr);
		//Total Time
		$this->assertEquals( 5, $udt_arr[$date_epoch][0]['object_type_id'] );                               //5=System Total
		$this->assertEquals( $udt_arr[$date_epoch][0]['pay_code_id'], TTUUID::getZeroID() );
		$this->assertEquals( $udt_arr[$date_epoch][0]['total_time'], ( 16 * 3600 ) );
		//Overtime 1
		$this->assertEquals( 30, $udt_arr[$date_epoch][1]['object_type_id'] );                              //OverTime
		$this->assertEquals( $udt_arr[$date_epoch][1]['pay_code_id'], $policy_ids['pay_code'][2] );
		$this->assertEquals( $udt_arr[$date_epoch][1]['total_time'], ( 10 * 3600 ) );
		//Overtime 2
		$this->assertEquals( 30, $udt_arr[$date_epoch][2]['object_type_id'] );                              //OverTime
		$this->assertEquals( $udt_arr[$date_epoch][2]['pay_code_id'], $policy_ids['pay_code'][1] );
		$this->assertEquals( $udt_arr[$date_epoch][2]['total_time'], ( 2 * 3600 ) );
		//Overtime 3
		$this->assertEquals( 30, $udt_arr[$date_epoch][3]['object_type_id'] );                              //OverTime
		$this->assertEquals( $udt_arr[$date_epoch][3]['pay_code_id'], $policy_ids['pay_code'][0] );
		$this->assertEquals( $udt_arr[$date_epoch][3]['total_time'], ( 4 * 3600 ) );
		//Make sure no other hours
		$this->assertCount( 4, $udt_arr[$date_epoch] );

		//
		//Day of Week: 7
		//
		$date_epoch = TTDate::incrementDate( TTDate::getMiddleDayEpoch( TTDate::getBeginWeekEpoch( $start_epoch ) ), 6, 'day' );
		$date_stamp = TTDate::getDate( 'DATE', $date_epoch );

		$dd->createPunchPair( $this->user_id,
							  strtotime( $date_stamp . ' 6:00AM' ),
							  strtotime( $date_stamp . ' 10:00PM' ),
							  [
									  'in_type_id'    => 10,
									  'out_type_id'   => 10,
									  'branch_id'     => 0,
									  'department_id' => 0,
									  'job_id'        => 0,
									  'job_item_id'   => 0,
									  'punch_tag_id'  => []
							  ],
							  true
		);

		$udt_arr = $this->getUserDateTotalArray( $date_epoch, $date_epoch );
		//print_r($udt_arr);
		//Total Time
		$this->assertEquals( 5, $udt_arr[$date_epoch][0]['object_type_id'] );                               //5=System Total
		$this->assertEquals( $udt_arr[$date_epoch][0]['pay_code_id'], TTUUID::getZeroID() );
		$this->assertEquals( $udt_arr[$date_epoch][0]['total_time'], ( 16 * 3600 ) );
		//Overtime 2
		$this->assertEquals( 30, $udt_arr[$date_epoch][1]['object_type_id'] );                              //OverTime
		$this->assertEquals( $udt_arr[$date_epoch][1]['pay_code_id'], $policy_ids['pay_code'][2] );
		$this->assertEquals( $udt_arr[$date_epoch][1]['total_time'], ( 16 * 3600 ) );
		//Make sure no other hours
		$this->assertCount( 2, $udt_arr[$date_epoch] );

		return true;
	}

	/**
	 * @group OvertimePolicy_testEvery4WeeksOverTimePolicyA
	 */
	function testEvery4WeeksOverTimePolicyA() {
		global $dd;

		//Test reaching the biweekly overtime in the first week, and part of it going into the second.
		$policy_ids['pay_formula_policy'][] = $this->createPayFormulaPolicy( $this->company_id, 200 );      //OT1.5
		$policy_ids['pay_formula_policy'][] = $this->createPayFormulaPolicy( $this->company_id, 210 );      //OT2.0
		$policy_ids['pay_formula_policy'][] = $this->createPayFormulaPolicy( $this->company_id, 220 );      //OT2.5

		$policy_ids['pay_code'][] = $this->createPayCode( $this->company_id, 300, $policy_ids['pay_formula_policy'][0] );
		$policy_ids['pay_code'][] = $this->createPayCode( $this->company_id, 310, $policy_ids['pay_formula_policy'][1] );
		$policy_ids['pay_code'][] = $this->createPayCode( $this->company_id, 350, $policy_ids['pay_formula_policy'][2] );

		$policy_ids['overtime'][] = $this->createOverTimePolicy( $this->company_id, 5504, $this->policy_ids['contributing_shift_policy'][12], $policy_ids['pay_code'][2] );
		//print_r($policy_ids['overtime']);

		//Create Policy Group
		$dd->createPolicyGroup( $this->company_id,
								null, //Meal
								null, //Exception
								null, //Holiday
								$policy_ids['overtime'], //OT
								null, //Premium
								null, //Round
								[ $this->user_id ], //Users
								null, //Break
								null, //Accrual
								null, //Expense
								null, //Absence
								[ $this->policy_ids['regular'][12] ] //Regular
		);

		//Start four weeks ago...
		$start_epoch = $date_epoch = TTDate::incrementDate( TTDate::getMiddleDayEpoch( TTDate::getBeginWeekEpoch( time() ) ), -24, 'day' );

		$current_pay_period_obj = $this->getCurrentPayPeriod( $date_epoch );
		if ( is_object( $current_pay_period_obj ) ) {
			$date_stamp = TTDate::getDate( 'DATE', $current_pay_period_obj->getStartDate() );
			$start_epoch = $date_epoch = TTDate::getMiddleDayEpoch( $current_pay_period_obj->getStartDate() );
		} else {
			$date_stamp = TTDate::getDate( 'DATE', $date_epoch );
		}
		Debug::text( 'Using date stamp: ' . TTDate::getDate( 'DATE+TIME', $date_stamp ), __FILE__, __LINE__, __METHOD__, 10 );

		//
		//Day of Week: 1
		//
		$dd->createPunchPair( $this->user_id,
							  strtotime( $date_stamp . ' 8:00AM' ),
							  strtotime( $date_stamp . ' 8:00PM' ),
							  [
									  'in_type_id'    => 10,
									  'out_type_id'   => 10,
									  'branch_id'     => 0,
									  'department_id' => 0,
									  'job_id'        => 0,
									  'job_item_id'   => 0,
									  'punch_tag_id'  => []
							  ],
							  true
		);

		$udt_arr = $this->getUserDateTotalArray( $date_epoch, $date_epoch );
		//print_r($udt_arr);
		//Total Time
		$this->assertEquals( 5, $udt_arr[$date_epoch][0]['object_type_id'] );                               //5=System Total
		$this->assertEquals( $udt_arr[$date_epoch][0]['pay_code_id'], TTUUID::getZeroID() );
		$this->assertEquals( $udt_arr[$date_epoch][0]['total_time'], ( 12 * 3600 ) );
		//Regular Time
		$this->assertEquals( 20, $udt_arr[$date_epoch][1]['object_type_id'] );                              //Regular Time
		$this->assertEquals( $udt_arr[$date_epoch][1]['pay_code_id'], $this->policy_ids['pay_code'][100] ); //Regular Time
		$this->assertEquals( $udt_arr[$date_epoch][1]['total_time'], ( 12 * 3600 ) );
		//Make sure no other hours
		$this->assertCount( 2, $udt_arr[$date_epoch] );
		//
		//Day of Week: 2
		//
		$date_epoch = TTDate::incrementDate( TTDate::getMiddleDayEpoch( $start_epoch ), 1, 'day' );
		$date_stamp = TTDate::getDate( 'DATE', $date_epoch );

		$dd->createPunchPair( $this->user_id,
							  strtotime( $date_stamp . ' 8:00AM' ),
							  strtotime( $date_stamp . ' 8:00PM' ),
							  [
									  'in_type_id'    => 10,
									  'out_type_id'   => 10,
									  'branch_id'     => 0,
									  'department_id' => 0,
									  'job_id'        => 0,
									  'job_item_id'   => 0,
									  'punch_tag_id'  => []
							  ],
							  true
		);

		$udt_arr = $this->getUserDateTotalArray( $date_epoch, $date_epoch );
		//Total Time
		$this->assertEquals( 5, $udt_arr[$date_epoch][0]['object_type_id'] );                               //5=System Total
		$this->assertEquals( $udt_arr[$date_epoch][0]['pay_code_id'], TTUUID::getZeroID() );
		$this->assertEquals( $udt_arr[$date_epoch][0]['total_time'], ( 12 * 3600 ) );
		//Regular Time
		$this->assertEquals( 20, $udt_arr[$date_epoch][1]['object_type_id'] );                              //Regular Time
		$this->assertEquals( $udt_arr[$date_epoch][1]['pay_code_id'], $this->policy_ids['pay_code'][100] ); //Regular Time
		$this->assertEquals( $udt_arr[$date_epoch][1]['total_time'], ( 12 * 3600 ) );
		//Make sure no other hours
		$this->assertCount( 2, $udt_arr[$date_epoch] );

		//
		//Day of Week: 3
		//
		$date_epoch = TTDate::incrementDate( TTDate::getMiddleDayEpoch( $start_epoch ), 2, 'day' );
		$date_stamp = TTDate::getDate( 'DATE', $date_epoch );

		$dd->createPunchPair( $this->user_id,
							  strtotime( $date_stamp . ' 8:00AM' ),
							  strtotime( $date_stamp . ' 8:00PM' ),
							  [
									  'in_type_id'    => 10,
									  'out_type_id'   => 10,
									  'branch_id'     => 0,
									  'department_id' => 0,
									  'job_id'        => 0,
									  'job_item_id'   => 0,
									  'punch_tag_id'  => []
							  ],
							  true
		);

		$udt_arr = $this->getUserDateTotalArray( $date_epoch, $date_epoch );
		//Total Time
		$this->assertEquals( 5, $udt_arr[$date_epoch][0]['object_type_id'] );                               //5=System Total
		$this->assertEquals( $udt_arr[$date_epoch][0]['pay_code_id'], TTUUID::getZeroID() );
		$this->assertEquals( $udt_arr[$date_epoch][0]['total_time'], ( 12 * 3600 ) );
		//Regular Time
		$this->assertEquals( 20, $udt_arr[$date_epoch][1]['object_type_id'] );                              //Regular Time
		$this->assertEquals( $udt_arr[$date_epoch][1]['pay_code_id'], $this->policy_ids['pay_code'][100] ); //Regular Time
		$this->assertEquals( $udt_arr[$date_epoch][1]['total_time'], ( 12 * 3600 ) );
		//Make sure no other hours
		$this->assertCount( 2, $udt_arr[$date_epoch] );

		//
		//Day of Week: 4
		//
		$date_epoch = TTDate::incrementDate( TTDate::getMiddleDayEpoch( $start_epoch ), 3, 'day' );
		$date_stamp = TTDate::getDate( 'DATE', $date_epoch );

		$dd->createPunchPair( $this->user_id,
							  strtotime( $date_stamp . ' 8:00AM' ),
							  strtotime( $date_stamp . ' 8:00PM' ),
							  [
									  'in_type_id'    => 10,
									  'out_type_id'   => 10,
									  'branch_id'     => 0,
									  'department_id' => 0,
									  'job_id'        => 0,
									  'job_item_id'   => 0,
									  'punch_tag_id'  => []
							  ],
							  true
		);

		$udt_arr = $this->getUserDateTotalArray( $date_epoch, $date_epoch );
		//print_r($udt_arr);
		//Total Time
		$this->assertEquals( 5, $udt_arr[$date_epoch][0]['object_type_id'] );                               //5=System Total
		$this->assertEquals( $udt_arr[$date_epoch][0]['pay_code_id'], TTUUID::getZeroID() );
		$this->assertEquals( $udt_arr[$date_epoch][0]['total_time'], ( 12 * 3600 ) );
		//Regular Time
		$this->assertEquals( 20, $udt_arr[$date_epoch][1]['object_type_id'] );                              //Regular Time
		$this->assertEquals( $udt_arr[$date_epoch][1]['pay_code_id'], $this->policy_ids['pay_code'][100] ); //Regular Time
		$this->assertEquals( $udt_arr[$date_epoch][1]['total_time'], ( 12 * 3600 ) );
		//Make sure no other hours
		$this->assertCount( 2, $udt_arr[$date_epoch] );

		//
		//Day of Week: 5
		//
		$date_epoch = TTDate::incrementDate( TTDate::getMiddleDayEpoch( $start_epoch ), 4, 'day' );
		$date_stamp = TTDate::getDate( 'DATE', $date_epoch );

		$dd->createPunchPair( $this->user_id,
							  strtotime( $date_stamp . ' 8:00AM' ),
							  strtotime( $date_stamp . ' 8:00PM' ),
							  [
									  'in_type_id'    => 10,
									  'out_type_id'   => 10,
									  'branch_id'     => 0,
									  'department_id' => 0,
									  'job_id'        => 0,
									  'job_item_id'   => 0,
									  'punch_tag_id'  => []
							  ],
							  true
		);

		$udt_arr = $this->getUserDateTotalArray( $date_epoch, $date_epoch );
		//print_r($udt_arr);
		//Total Time
		$this->assertEquals( 5, $udt_arr[$date_epoch][0]['object_type_id'] );                               //5=System Total
		$this->assertEquals( $udt_arr[$date_epoch][0]['pay_code_id'], TTUUID::getZeroID() );
		$this->assertEquals( $udt_arr[$date_epoch][0]['total_time'], ( 12 * 3600 ) );
		//Regular Time
		$this->assertEquals( 20, $udt_arr[$date_epoch][1]['object_type_id'] );                              //Regular Time
		$this->assertEquals( $udt_arr[$date_epoch][1]['pay_code_id'], $this->policy_ids['pay_code'][100] ); //Regular Time
		$this->assertEquals( $udt_arr[$date_epoch][1]['total_time'], ( 12 * 3600 ) );
		//Make sure no other hours
		$this->assertCount( 2, $udt_arr[$date_epoch] );


		//
		//Day of Week: 2 - Beginning of next week...
		//
		$date_epoch = TTDate::incrementDate( TTDate::getMiddleDayEpoch( $start_epoch ), 7, 'day' );
		$date_stamp = TTDate::getDate( 'DATE', $date_epoch );

		$dd->createPunchPair( $this->user_id,
							  strtotime( $date_stamp . ' 8:05AM' ),
							  strtotime( $date_stamp . ' 8:05PM' ),
							  [
									  'in_type_id'    => 10,
									  'out_type_id'   => 10,
									  'branch_id'     => 0,
									  'department_id' => 0,
									  'job_id'        => 0,
									  'job_item_id'   => 0,
									  'punch_tag_id'  => []
							  ],
							  true
		);

		$udt_arr = $this->getUserDateTotalArray( $date_epoch, $date_epoch );
		//print_r($udt_arr);
		//Total Time
		$this->assertEquals( 5, $udt_arr[$date_epoch][0]['object_type_id'] );                               //5=System Total
		$this->assertEquals( $udt_arr[$date_epoch][0]['pay_code_id'], TTUUID::getZeroID() );
		$this->assertEquals( $udt_arr[$date_epoch][0]['total_time'], ( 12 * 3600 ) );
		//Regular Time
		$this->assertEquals( 20, $udt_arr[$date_epoch][1]['object_type_id'] );                              //Regular Time
		$this->assertEquals( $udt_arr[$date_epoch][1]['pay_code_id'], $this->policy_ids['pay_code'][100] ); //Regular Time
		$this->assertEquals( $udt_arr[$date_epoch][1]['total_time'], ( 12 * 3600 ) );
		//Make sure no other hours
		$this->assertCount( 2, $udt_arr[$date_epoch] );

		//
		//Day of Week: 2
		//
		$date_epoch = TTDate::incrementDate( TTDate::getMiddleDayEpoch( $start_epoch ), 8, 'day' );
		$date_stamp = TTDate::getDate( 'DATE', $date_epoch );

		$dd->createPunchPair( $this->user_id,
							  strtotime( $date_stamp . ' 8:05AM' ),
							  strtotime( $date_stamp . ' 8:05PM' ),
							  [
									  'in_type_id'    => 10,
									  'out_type_id'   => 10,
									  'branch_id'     => 0,
									  'department_id' => 0,
									  'job_id'        => 0,
									  'job_item_id'   => 0,
									  'punch_tag_id'  => []
							  ],
							  true
		);

		$udt_arr = $this->getUserDateTotalArray( $date_epoch, $date_epoch );
		//print_r($udt_arr);
		//Total Time
		$this->assertEquals( 5, $udt_arr[$date_epoch][0]['object_type_id'] );                               //5=System Total
		$this->assertEquals( $udt_arr[$date_epoch][0]['pay_code_id'], TTUUID::getZeroID() );
		$this->assertEquals( $udt_arr[$date_epoch][0]['total_time'], ( 12 * 3600 ) );
		//Regular Time
		$this->assertEquals( 20, $udt_arr[$date_epoch][1]['object_type_id'] );                              //Regular Time
		$this->assertEquals( $udt_arr[$date_epoch][1]['pay_code_id'], $this->policy_ids['pay_code'][100] ); //Regular Time
		$this->assertEquals( $udt_arr[$date_epoch][1]['total_time'], ( 12 * 3600 ) );
		//Make sure no other hours
		$this->assertCount( 2, $udt_arr[$date_epoch] );

		//
		//Day of Week: 3
		//
		$date_epoch = TTDate::incrementDate( TTDate::getMiddleDayEpoch( $start_epoch ), 9, 'day' );
		$date_stamp = TTDate::getDate( 'DATE', $date_epoch );

		$dd->createPunchPair( $this->user_id,
							  strtotime( $date_stamp . ' 8:05AM' ),
							  strtotime( $date_stamp . ' 8:05PM' ),
							  [
									  'in_type_id'    => 10,
									  'out_type_id'   => 10,
									  'branch_id'     => 0,
									  'department_id' => 0,
									  'job_id'        => 0,
									  'job_item_id'   => 0,
									  'punch_tag_id'  => []
							  ],
							  true
		);

		$udt_arr = $this->getUserDateTotalArray( $date_epoch, $date_epoch );
		//print_r($udt_arr);
		//Total Time
		$this->assertEquals( 5, $udt_arr[$date_epoch][0]['object_type_id'] );                               //5=System Total
		$this->assertEquals( $udt_arr[$date_epoch][0]['pay_code_id'], TTUUID::getZeroID() );
		$this->assertEquals( $udt_arr[$date_epoch][0]['total_time'], ( 12 * 3600 ) );
		//Regular Time
		$this->assertEquals( 20, $udt_arr[$date_epoch][1]['object_type_id'] );                              //Regular Time
		$this->assertEquals( $udt_arr[$date_epoch][1]['pay_code_id'], $this->policy_ids['pay_code'][100] ); //Regular Time
		$this->assertEquals( $udt_arr[$date_epoch][1]['total_time'], ( 12 * 3600 ) );
		//Make sure no other hours
		$this->assertCount( 2, $udt_arr[$date_epoch] );

		//
		//Day of Week: 4
		//
		$date_epoch = TTDate::incrementDate( TTDate::getMiddleDayEpoch( $start_epoch ), 10, 'day' );
		$date_stamp = TTDate::getDate( 'DATE', $date_epoch );

		$dd->createPunchPair( $this->user_id,
							  strtotime( $date_stamp . ' 8:05AM' ),
							  strtotime( $date_stamp . ' 8:05PM' ),
							  [
									  'in_type_id'    => 10,
									  'out_type_id'   => 10,
									  'branch_id'     => 0,
									  'department_id' => 0,
									  'job_id'        => 0,
									  'job_item_id'   => 0,
									  'punch_tag_id'  => []
							  ],
							  true
		);

		$udt_arr = $this->getUserDateTotalArray( $date_epoch, $date_epoch );
		//print_r($udt_arr);
		//Total Time
		$this->assertEquals( 5, $udt_arr[$date_epoch][0]['object_type_id'] );                               //5=System Total
		$this->assertEquals( $udt_arr[$date_epoch][0]['pay_code_id'], TTUUID::getZeroID() );
		$this->assertEquals( $udt_arr[$date_epoch][0]['total_time'], ( 12 * 3600 ) );
		//Regular Time
		$this->assertEquals( 20, $udt_arr[$date_epoch][1]['object_type_id'] );                              //Regular Time
		$this->assertEquals( $udt_arr[$date_epoch][1]['pay_code_id'], $this->policy_ids['pay_code'][100] ); //Regular Time
		$this->assertEquals( $udt_arr[$date_epoch][1]['total_time'], ( 12 * 3600 ) );
		//Make sure no other hours
		$this->assertCount( 2, $udt_arr[$date_epoch] );


		//
		//Day of Week: 5
		//
		$date_epoch = TTDate::incrementDate( TTDate::getMiddleDayEpoch( $start_epoch ), 11, 'day' );
		$date_stamp = TTDate::getDate( 'DATE', $date_epoch );

		$dd->createPunchPair( $this->user_id,
							  strtotime( $date_stamp . ' 8:05AM' ),
							  strtotime( $date_stamp . ' 8:05PM' ),
							  [
									  'in_type_id'    => 10,
									  'out_type_id'   => 10,
									  'branch_id'     => 0,
									  'department_id' => 0,
									  'job_id'        => 0,
									  'job_item_id'   => 0,
									  'punch_tag_id'  => []
							  ],
							  true
		);

		$udt_arr = $this->getUserDateTotalArray( $date_epoch, $date_epoch );
		//print_r($udt_arr);
		//Total Time
		$this->assertEquals( 5, $udt_arr[$date_epoch][0]['object_type_id'] );                               //5=System Total
		$this->assertEquals( $udt_arr[$date_epoch][0]['pay_code_id'], TTUUID::getZeroID() );
		$this->assertEquals( $udt_arr[$date_epoch][0]['total_time'], ( 12 * 3600 ) );
		//Regular Time
		$this->assertEquals( 20, $udt_arr[$date_epoch][1]['object_type_id'] );                              //Regular Time
		$this->assertEquals( $udt_arr[$date_epoch][1]['pay_code_id'], $this->policy_ids['pay_code'][100] ); //Regular Time
		$this->assertEquals( $udt_arr[$date_epoch][1]['total_time'], ( 12 * 3600 ) );
		//Make sure no other hours
		$this->assertCount( 2, $udt_arr[$date_epoch] );


		//
		//Day of Week: 3 - Beginning of next week...
		//
		$date_epoch = TTDate::incrementDate( TTDate::getMiddleDayEpoch( $start_epoch ), 14, 'day' );
		$date_stamp = TTDate::getDate( 'DATE', $date_epoch );

		$dd->createPunchPair( $this->user_id,
							  strtotime( $date_stamp . ' 8:10AM' ),
							  strtotime( $date_stamp . ' 8:10PM' ),
							  [
									  'in_type_id'    => 10,
									  'out_type_id'   => 10,
									  'branch_id'     => 0,
									  'department_id' => 0,
									  'job_id'        => 0,
									  'job_item_id'   => 0,
									  'punch_tag_id'  => []
							  ],
							  true
		);

		$udt_arr = $this->getUserDateTotalArray( $date_epoch, $date_epoch );
		//print_r($udt_arr);
		//Total Time
		$this->assertEquals( 5, $udt_arr[$date_epoch][0]['object_type_id'] );                               //5=System Total
		$this->assertEquals( $udt_arr[$date_epoch][0]['pay_code_id'], TTUUID::getZeroID() );
		$this->assertEquals( $udt_arr[$date_epoch][0]['total_time'], ( 12 * 3600 ) );
		//Regular Time
		$this->assertEquals( 20, $udt_arr[$date_epoch][1]['object_type_id'] );                              //Regular Time
		$this->assertEquals( $udt_arr[$date_epoch][1]['pay_code_id'], $this->policy_ids['pay_code'][100] ); //Regular Time
		$this->assertEquals( $udt_arr[$date_epoch][1]['total_time'], ( 12 * 3600 ) );
		//Make sure no other hours
		$this->assertCount( 2, $udt_arr[$date_epoch] );

		//
		//Day of Week: 2
		//
		$date_epoch = TTDate::incrementDate( TTDate::getMiddleDayEpoch( $start_epoch ), 15, 'day' );
		$date_stamp = TTDate::getDate( 'DATE', $date_epoch );

		$dd->createPunchPair( $this->user_id,
							  strtotime( $date_stamp . ' 8:10AM' ),
							  strtotime( $date_stamp . ' 8:10PM' ),
							  [
									  'in_type_id'    => 10,
									  'out_type_id'   => 10,
									  'branch_id'     => 0,
									  'department_id' => 0,
									  'job_id'        => 0,
									  'job_item_id'   => 0,
									  'punch_tag_id'  => []
							  ],
							  true
		);

		$udt_arr = $this->getUserDateTotalArray( $date_epoch, $date_epoch );
		//print_r($udt_arr);
		//Total Time
		$this->assertEquals( 5, $udt_arr[$date_epoch][0]['object_type_id'] );                               //5=System Total
		$this->assertEquals( $udt_arr[$date_epoch][0]['pay_code_id'], TTUUID::getZeroID() );
		$this->assertEquals( $udt_arr[$date_epoch][0]['total_time'], ( 12 * 3600 ) );
		//Regular Time
		$this->assertEquals( 20, $udt_arr[$date_epoch][1]['object_type_id'] );                              //Regular Time
		$this->assertEquals( $udt_arr[$date_epoch][1]['pay_code_id'], $this->policy_ids['pay_code'][100] ); //Regular Time
		$this->assertEquals( $udt_arr[$date_epoch][1]['total_time'], ( 12 * 3600 ) );
		//Make sure no other hours
		$this->assertCount( 2, $udt_arr[$date_epoch] );

		//
		//Day of Week: 3
		//
		$date_epoch = TTDate::incrementDate( TTDate::getMiddleDayEpoch( $start_epoch ), 16, 'day' );
		$date_stamp = TTDate::getDate( 'DATE', $date_epoch );

		$dd->createPunchPair( $this->user_id,
							  strtotime( $date_stamp . ' 8:10AM' ),
							  strtotime( $date_stamp . ' 8:10PM' ),
							  [
									  'in_type_id'    => 10,
									  'out_type_id'   => 10,
									  'branch_id'     => 0,
									  'department_id' => 0,
									  'job_id'        => 0,
									  'job_item_id'   => 0,
									  'punch_tag_id'  => []
							  ],
							  true
		);

		$udt_arr = $this->getUserDateTotalArray( $date_epoch, $date_epoch );
		//print_r($udt_arr);
		//Total Time
		$this->assertEquals( 5, $udt_arr[$date_epoch][0]['object_type_id'] );                               //5=System Total
		$this->assertEquals( $udt_arr[$date_epoch][0]['pay_code_id'], TTUUID::getZeroID() );
		$this->assertEquals( $udt_arr[$date_epoch][0]['total_time'], ( 12 * 3600 ) );
		//Regular Time
		$this->assertEquals( 20, $udt_arr[$date_epoch][1]['object_type_id'] );                              //Regular Time
		$this->assertEquals( $udt_arr[$date_epoch][1]['pay_code_id'], $this->policy_ids['pay_code'][100] ); //Regular Time
		$this->assertEquals( $udt_arr[$date_epoch][1]['total_time'], ( 12 * 3600 ) );
		//Make sure no other hours
		$this->assertCount( 2, $udt_arr[$date_epoch] );

		//
		//Day of Week: 4
		//
		$date_epoch = TTDate::incrementDate( TTDate::getMiddleDayEpoch( $start_epoch ), 17, 'day' );
		$date_stamp = TTDate::getDate( 'DATE', $date_epoch );

		$dd->createPunchPair( $this->user_id,
							  strtotime( $date_stamp . ' 8:10AM' ),
							  strtotime( $date_stamp . ' 8:10PM' ),
							  [
									  'in_type_id'    => 10,
									  'out_type_id'   => 10,
									  'branch_id'     => 0,
									  'department_id' => 0,
									  'job_id'        => 0,
									  'job_item_id'   => 0,
									  'punch_tag_id'  => []
							  ],
							  true
		);

		$udt_arr = $this->getUserDateTotalArray( $date_epoch, $date_epoch );
		//print_r($udt_arr);
		//Total Time
		$this->assertEquals( 5, $udt_arr[$date_epoch][0]['object_type_id'] );                               //5=System Total
		$this->assertEquals( $udt_arr[$date_epoch][0]['pay_code_id'], TTUUID::getZeroID() );
		$this->assertEquals( $udt_arr[$date_epoch][0]['total_time'], ( 12 * 3600 ) );
		//Regular Time
		$this->assertEquals( 20, $udt_arr[$date_epoch][1]['object_type_id'] );                              //Regular Time
		$this->assertEquals( $udt_arr[$date_epoch][1]['pay_code_id'], $this->policy_ids['pay_code'][100] ); //Regular Time
		$this->assertEquals( $udt_arr[$date_epoch][1]['total_time'], ( 12 * 3600 ) );
		//Make sure no other hours
		$this->assertCount( 2, $udt_arr[$date_epoch] );


		//
		//Day of Week: 5
		//
		$date_epoch = TTDate::incrementDate( TTDate::getMiddleDayEpoch( $start_epoch ), 18, 'day' );
		$date_stamp = TTDate::getDate( 'DATE', $date_epoch );

		$dd->createPunchPair( $this->user_id,
							  strtotime( $date_stamp . ' 8:10AM' ),
							  strtotime( $date_stamp . ' 8:10PM' ),
							  [
									  'in_type_id'    => 10,
									  'out_type_id'   => 10,
									  'branch_id'     => 0,
									  'department_id' => 0,
									  'job_id'        => 0,
									  'job_item_id'   => 0,
									  'punch_tag_id'  => []
							  ],
							  true
		);

		$udt_arr = $this->getUserDateTotalArray( $date_epoch, $date_epoch );
		//print_r($udt_arr);
		//Total Time
		$this->assertEquals( 5, $udt_arr[$date_epoch][0]['object_type_id'] );                               //5=System Total
		$this->assertEquals( $udt_arr[$date_epoch][0]['pay_code_id'], TTUUID::getZeroID() );
		$this->assertEquals( $udt_arr[$date_epoch][0]['total_time'], ( 12 * 3600 ) );
		//Regular Time
		$this->assertEquals( 20, $udt_arr[$date_epoch][1]['object_type_id'] );                              //Regular Time
		$this->assertEquals( $udt_arr[$date_epoch][1]['pay_code_id'], $this->policy_ids['pay_code'][100] ); //Regular Time
		$this->assertEquals( $udt_arr[$date_epoch][1]['total_time'], ( 12 * 3600 ) );
		//Make sure no other hours
		$this->assertCount( 2, $udt_arr[$date_epoch] );


		//
		//Day of Week: 4 - Beginning of next week...
		//
		$date_epoch = TTDate::incrementDate( TTDate::getMiddleDayEpoch( $start_epoch ), 21, 'day' );
		$date_stamp = TTDate::getDate( 'DATE', $date_epoch );

		$dd->createPunchPair( $this->user_id,
							  strtotime( $date_stamp . ' 8:10AM' ),
							  strtotime( $date_stamp . ' 8:10PM' ),
							  [
									  'in_type_id'    => 10,
									  'out_type_id'   => 10,
									  'branch_id'     => 0,
									  'department_id' => 0,
									  'job_id'        => 0,
									  'job_item_id'   => 0,
									  'punch_tag_id'  => []
							  ],
							  true
		);

		$udt_arr = $this->getUserDateTotalArray( $date_epoch, $date_epoch );
		//print_r($udt_arr);
		//Total Time
		$this->assertEquals( 5, $udt_arr[$date_epoch][0]['object_type_id'] );                               //5=System Total
		$this->assertEquals( $udt_arr[$date_epoch][0]['pay_code_id'], TTUUID::getZeroID() );
		$this->assertEquals( $udt_arr[$date_epoch][0]['total_time'], ( 12 * 3600 ) );
		//Regular Time
		$this->assertEquals( 20, $udt_arr[$date_epoch][1]['object_type_id'] );                              //Regular Time
		$this->assertEquals( $udt_arr[$date_epoch][1]['pay_code_id'], $this->policy_ids['pay_code'][100] ); //Regular Time
		$this->assertEquals( $udt_arr[$date_epoch][1]['total_time'], ( 12 * 3600 ) );
		//Make sure no other hours
		$this->assertCount( 2, $udt_arr[$date_epoch] );

		//
		//Day of Week: 2
		//
		$date_epoch = TTDate::incrementDate( TTDate::getMiddleDayEpoch( $start_epoch ), 22, 'day' );
		$date_stamp = TTDate::getDate( 'DATE', $date_epoch );

		$dd->createPunchPair( $this->user_id,
							  strtotime( $date_stamp . ' 8:10AM' ),
							  strtotime( $date_stamp . ' 8:10PM' ),
							  [
									  'in_type_id'    => 10,
									  'out_type_id'   => 10,
									  'branch_id'     => 0,
									  'department_id' => 0,
									  'job_id'        => 0,
									  'job_item_id'   => 0,
									  'punch_tag_id'  => []
							  ],
							  true
		);

		$udt_arr = $this->getUserDateTotalArray( $date_epoch, $date_epoch );
		//print_r($udt_arr);
		//Total Time
		$this->assertEquals( 5, $udt_arr[$date_epoch][0]['object_type_id'] );                               //5=System Total
		$this->assertEquals( $udt_arr[$date_epoch][0]['pay_code_id'], TTUUID::getZeroID() );
		$this->assertEquals( $udt_arr[$date_epoch][0]['total_time'], ( 12 * 3600 ) );
		//Regular Time
		$this->assertEquals( 20, $udt_arr[$date_epoch][1]['object_type_id'] );                              //Regular Time
		$this->assertEquals( $udt_arr[$date_epoch][1]['pay_code_id'], $this->policy_ids['pay_code'][100] ); //Regular Time
		$this->assertEquals( $udt_arr[$date_epoch][1]['total_time'], ( 12 * 3600 ) );
		//Make sure no other hours
		$this->assertCount( 2, $udt_arr[$date_epoch] );

		//
		//Day of Week: 3
		//
		$date_epoch = TTDate::incrementDate( TTDate::getMiddleDayEpoch( $start_epoch ), 23, 'day' );
		$date_stamp = TTDate::getDate( 'DATE', $date_epoch );

		$dd->createPunchPair( $this->user_id,
							  strtotime( $date_stamp . ' 8:10AM' ),
							  strtotime( $date_stamp . ' 8:10PM' ),
							  [
									  'in_type_id'    => 10,
									  'out_type_id'   => 10,
									  'branch_id'     => 0,
									  'department_id' => 0,
									  'job_id'        => 0,
									  'job_item_id'   => 0,
									  'punch_tag_id'  => []
							  ],
							  true
		);

		$udt_arr = $this->getUserDateTotalArray( $date_epoch, $date_epoch );
		//print_r($udt_arr);
		//Total Time
		$this->assertEquals( 5, $udt_arr[$date_epoch][0]['object_type_id'] );                               //5=System Total
		$this->assertEquals( $udt_arr[$date_epoch][0]['pay_code_id'], TTUUID::getZeroID() );
		$this->assertEquals( $udt_arr[$date_epoch][0]['total_time'], ( 12 * 3600 ) );
		//Regular Time
		$this->assertEquals( 20, $udt_arr[$date_epoch][1]['object_type_id'] );                              //Regular Time
		$this->assertEquals( $udt_arr[$date_epoch][1]['pay_code_id'], $this->policy_ids['pay_code'][100] ); //Regular Time
		$this->assertEquals( $udt_arr[$date_epoch][1]['total_time'], ( 12 * 3600 ) );
		//Make sure no other hours
		$this->assertCount( 2, $udt_arr[$date_epoch] );

		//
		//Day of Week: 4
		//
		$date_epoch = TTDate::incrementDate( TTDate::getMiddleDayEpoch( $start_epoch ), 24, 'day' );
		$date_stamp = TTDate::getDate( 'DATE', $date_epoch );

		$dd->createPunchPair( $this->user_id,
							  strtotime( $date_stamp . ' 8:10AM' ),
							  strtotime( $date_stamp . ' 8:10PM' ),
							  [
									  'in_type_id'    => 10,
									  'out_type_id'   => 10,
									  'branch_id'     => 0,
									  'department_id' => 0,
									  'job_id'        => 0,
									  'job_item_id'   => 0,
									  'punch_tag_id'  => []
							  ],
							  true
		);

		$udt_arr = $this->getUserDateTotalArray( $date_epoch, $date_epoch );
		//print_r($udt_arr);
		//Total Time
		$this->assertEquals( 5, $udt_arr[$date_epoch][0]['object_type_id'] );                               //5=System Total
		$this->assertEquals( $udt_arr[$date_epoch][0]['pay_code_id'], TTUUID::getZeroID() );
		$this->assertEquals( $udt_arr[$date_epoch][0]['total_time'], ( 12 * 3600 ) );
		//Regular Time
		$this->assertEquals( 20, $udt_arr[$date_epoch][1]['object_type_id'] );                              //Regular Time
		$this->assertEquals( $udt_arr[$date_epoch][1]['pay_code_id'], $this->policy_ids['pay_code'][100] ); //Regular Time
		$this->assertEquals( $udt_arr[$date_epoch][1]['total_time'], ( 12 * 3600 ) );
		//Make sure no other hours
		$this->assertCount( 2, $udt_arr[$date_epoch] );


		//
		//Day of Week: 5
		//
		$date_epoch = TTDate::incrementDate( TTDate::getMiddleDayEpoch( $start_epoch ), 25, 'day' );
		$date_stamp = TTDate::getDate( 'DATE', $date_epoch );

		$dd->createPunchPair( $this->user_id,
							  strtotime( $date_stamp . ' 8:10AM' ),
							  strtotime( $date_stamp . ' 8:10PM' ),
							  [
									  'in_type_id'    => 10,
									  'out_type_id'   => 10,
									  'branch_id'     => 0,
									  'department_id' => 0,
									  'job_id'        => 0,
									  'job_item_id'   => 0,
									  'punch_tag_id'  => []
							  ],
							  true
		);

		$udt_arr = $this->getUserDateTotalArray( $date_epoch, $date_epoch );
		//print_r($udt_arr);
		//Total Time
		$this->assertEquals( 5, $udt_arr[$date_epoch][0]['object_type_id'] );                               //5=System Total
		$this->assertEquals( $udt_arr[$date_epoch][0]['pay_code_id'], TTUUID::getZeroID() );
		$this->assertEquals( $udt_arr[$date_epoch][0]['total_time'], ( 12 * 3600 ) );
		//Regular Time
		$this->assertEquals( 20, $udt_arr[$date_epoch][1]['object_type_id'] );                              //Regular Time
		$this->assertEquals( $udt_arr[$date_epoch][1]['pay_code_id'], $this->policy_ids['pay_code'][100] ); //Regular Time
		$this->assertEquals( $udt_arr[$date_epoch][1]['total_time'], ( 6 * 3600 ) );
		//Overtime 1
		$this->assertEquals( 30, $udt_arr[$date_epoch][2]['object_type_id'] );                              //OverTime
		$this->assertEquals( $udt_arr[$date_epoch][2]['pay_code_id'], $policy_ids['pay_code'][2] );
		$this->assertEquals( $udt_arr[$date_epoch][2]['total_time'], ( 6 * 3600 ) );
		//Make sure no other hours
		$this->assertCount( 3, $udt_arr[$date_epoch] );

		return true;
	}


	/**
	 * @group OvertimePolicy_testDailyAndWeeklyOverTimePolicyA
	 */
	function testDailyAndWeeklyOverTimePolicyA() {
		global $dd;

		$policy_ids['pay_formula_policy'][] = $this->createPayFormulaPolicy( $this->company_id, 200 );      //OT1.5
		$policy_ids['pay_formula_policy'][] = $this->createPayFormulaPolicy( $this->company_id, 210 );      //OT2.0
		$policy_ids['pay_formula_policy'][] = $this->createPayFormulaPolicy( $this->company_id, 220 );      //OT2.5

		//Daily
		$policy_ids['pay_code'][] = $this->createPayCode( $this->company_id, 100, $policy_ids['pay_formula_policy'][0] );
		$policy_ids['pay_code'][] = $this->createPayCode( $this->company_id, 110, $policy_ids['pay_formula_policy'][1] );
		$policy_ids['pay_code'][] = $this->createPayCode( $this->company_id, 120, $policy_ids['pay_formula_policy'][2] );

		//Weekly
		$policy_ids['pay_code'][] = $this->createPayCode( $this->company_id, 230, $policy_ids['pay_formula_policy'][0] );
		$policy_ids['pay_code'][] = $this->createPayCode( $this->company_id, 240, $policy_ids['pay_formula_policy'][1] );
		$policy_ids['pay_code'][] = $this->createPayCode( $this->company_id, 250, $policy_ids['pay_formula_policy'][2] );

		$policy_ids['overtime'][] = $this->createOverTimePolicy( $this->company_id, 100, $this->policy_ids['contributing_shift_policy'][12], $policy_ids['pay_code'][0] );
		$policy_ids['overtime'][] = $this->createOverTimePolicy( $this->company_id, 110, $this->policy_ids['contributing_shift_policy'][12], $policy_ids['pay_code'][1] );
		$policy_ids['overtime'][] = $this->createOverTimePolicy( $this->company_id, 120, $this->policy_ids['contributing_shift_policy'][12], $policy_ids['pay_code'][2] );

		$policy_ids['overtime'][] = $this->createOverTimePolicy( $this->company_id, 230, $this->policy_ids['contributing_shift_policy'][12], $policy_ids['pay_code'][3] );
		$policy_ids['overtime'][] = $this->createOverTimePolicy( $this->company_id, 240, $this->policy_ids['contributing_shift_policy'][12], $policy_ids['pay_code'][4] );
		$policy_ids['overtime'][] = $this->createOverTimePolicy( $this->company_id, 250, $this->policy_ids['contributing_shift_policy'][12], $policy_ids['pay_code'][5] );

		//Create Policy Group
		$dd->createPolicyGroup( $this->company_id,
								null, //Meal
								null, //Exception
								null, //Holiday
								$policy_ids['overtime'], //OT
								null, //Premium
								null, //Round
								[ $this->user_id ], //Users
								null, //Break
								null, //Accrual
								null, //Expense
								null, //Absence
								[ $this->policy_ids['regular'][12] ] //Regular
		);


		$date_epoch = TTDate::getMiddleDayEpoch( TTDate::getBeginWeekEpoch( time() ) );
		$date_stamp = TTDate::getDate( 'DATE', $date_epoch );

		//
		//Day of Week: 1
		//
		$dd->createPunchPair( $this->user_id,
							  strtotime( $date_stamp . ' 8:00AM' ),
							  strtotime( $date_stamp . ' 8:00PM' ),
							  [
									  'in_type_id'    => 10,
									  'out_type_id'   => 10,
									  'branch_id'     => 0,
									  'department_id' => 0,
									  'job_id'        => 0,
									  'job_item_id'   => 0,
									  'punch_tag_id'  => []
							  ],
							  true
		);

		$udt_arr = $this->getUserDateTotalArray( $date_epoch, $date_epoch );
		//print_r($udt_arr);
		//Total Time
		$this->assertEquals( 5, $udt_arr[$date_epoch][0]['object_type_id'] );                               //5=System Total
		$this->assertEquals( $udt_arr[$date_epoch][0]['pay_code_id'], TTUUID::getZeroID() );
		$this->assertEquals( $udt_arr[$date_epoch][0]['total_time'], ( 12 * 3600 ) );
		//Regular Time
		$this->assertEquals( 20, $udt_arr[$date_epoch][1]['object_type_id'] );                              //Regular Time
		$this->assertEquals( $udt_arr[$date_epoch][1]['pay_code_id'], $this->policy_ids['pay_code'][100] ); //Regular Time
		$this->assertEquals( $udt_arr[$date_epoch][1]['total_time'], ( 8 * 3600 ) );
		//Overtime1
		$this->assertEquals( 30, $udt_arr[$date_epoch][4]['object_type_id'] );                              //Overtime
		$this->assertEquals( $udt_arr[$date_epoch][4]['pay_code_id'], $policy_ids['pay_code'][0] );
		$this->assertEquals( $udt_arr[$date_epoch][4]['total_time'], ( 1 * 3600 ) );
		//Overtime2
		$this->assertEquals( 30, $udt_arr[$date_epoch][3]['object_type_id'] );                              //Overtime
		$this->assertEquals( $udt_arr[$date_epoch][3]['pay_code_id'], $policy_ids['pay_code'][1] );
		$this->assertEquals( $udt_arr[$date_epoch][3]['total_time'], ( 1 * 3600 ) );
		//Overtime3
		$this->assertEquals( 30, $udt_arr[$date_epoch][2]['object_type_id'] );                              //Overtime
		$this->assertEquals( $udt_arr[$date_epoch][2]['pay_code_id'], $policy_ids['pay_code'][2] );
		$this->assertEquals( $udt_arr[$date_epoch][2]['total_time'], ( 2 * 3600 ) );
		//Make sure no other hours
		$this->assertCount( 5, $udt_arr[$date_epoch] );

		//
		//Day of Week: 2
		//
		$date_epoch = TTDate::incrementDate( TTDate::getMiddleDayEpoch( TTDate::getBeginWeekEpoch( time() ) ), 1, 'day' );
		$date_stamp = TTDate::getDate( 'DATE', $date_epoch );

		$dd->createPunchPair( $this->user_id,
							  strtotime( $date_stamp . ' 8:00AM' ),
							  strtotime( $date_stamp . ' 8:00PM' ),
							  [
									  'in_type_id'    => 10,
									  'out_type_id'   => 10,
									  'branch_id'     => 0,
									  'department_id' => 0,
									  'job_id'        => 0,
									  'job_item_id'   => 0,
									  'punch_tag_id'  => []
							  ],
							  true
		);

		$udt_arr = $this->getUserDateTotalArray( $date_epoch, $date_epoch );
		//Total Time
		$this->assertEquals( 5, $udt_arr[$date_epoch][0]['object_type_id'] );                               //5=System Total
		$this->assertEquals( $udt_arr[$date_epoch][0]['pay_code_id'], TTUUID::getZeroID() );
		$this->assertEquals( $udt_arr[$date_epoch][0]['total_time'], ( 12 * 3600 ) );
		//Regular Time
		$this->assertEquals( 20, $udt_arr[$date_epoch][1]['object_type_id'] );                              //Regular Time
		$this->assertEquals( $udt_arr[$date_epoch][1]['pay_code_id'], $this->policy_ids['pay_code'][100] ); //Regular Time
		$this->assertEquals( $udt_arr[$date_epoch][1]['total_time'], ( 8 * 3600 ) );
		//Overtime1
		$this->assertEquals( 30, $udt_arr[$date_epoch][4]['object_type_id'] );                              //Overtime
		$this->assertEquals( $udt_arr[$date_epoch][4]['pay_code_id'], $policy_ids['pay_code'][0] );
		$this->assertEquals( $udt_arr[$date_epoch][4]['total_time'], ( 1 * 3600 ) );
		//Overtime2
		$this->assertEquals( 30, $udt_arr[$date_epoch][3]['object_type_id'] );                              //Overtime
		$this->assertEquals( $udt_arr[$date_epoch][3]['pay_code_id'], $policy_ids['pay_code'][1] );
		$this->assertEquals( $udt_arr[$date_epoch][3]['total_time'], ( 1 * 3600 ) );
		//Overtime3
		$this->assertEquals( 30, $udt_arr[$date_epoch][2]['object_type_id'] );                              //Overtime
		$this->assertEquals( $udt_arr[$date_epoch][2]['pay_code_id'], $policy_ids['pay_code'][2] );
		$this->assertEquals( $udt_arr[$date_epoch][2]['total_time'], ( 2 * 3600 ) );
		//Make sure no other hours
		$this->assertCount( 5, $udt_arr[$date_epoch] );

		//
		//Day of Week: 3
		//
		$date_epoch = TTDate::incrementDate( TTDate::getMiddleDayEpoch( TTDate::getBeginWeekEpoch( time() ) ), 2, 'day' );
		$date_stamp = TTDate::getDate( 'DATE', $date_epoch );

		$dd->createPunchPair( $this->user_id,
							  strtotime( $date_stamp . ' 8:00AM' ),
							  strtotime( $date_stamp . ' 8:00PM' ),
							  [
									  'in_type_id'    => 10,
									  'out_type_id'   => 10,
									  'branch_id'     => 0,
									  'department_id' => 0,
									  'job_id'        => 0,
									  'job_item_id'   => 0,
									  'punch_tag_id'  => []
							  ],
							  true
		);

		$udt_arr = $this->getUserDateTotalArray( $date_epoch, $date_epoch );
		//Total Time
		$this->assertEquals( 5, $udt_arr[$date_epoch][0]['object_type_id'] );                               //5=System Total
		$this->assertEquals( $udt_arr[$date_epoch][0]['pay_code_id'], TTUUID::getZeroID() );
		$this->assertEquals( $udt_arr[$date_epoch][0]['total_time'], ( 12 * 3600 ) );
		//Regular Time
		$this->assertEquals( 20, $udt_arr[$date_epoch][1]['object_type_id'] );                              //Regular Time
		$this->assertEquals( $udt_arr[$date_epoch][1]['pay_code_id'], $this->policy_ids['pay_code'][100] ); //Regular Time
		$this->assertEquals( $udt_arr[$date_epoch][1]['total_time'], ( 8 * 3600 ) );
		//Overtime1
		$this->assertEquals( 30, $udt_arr[$date_epoch][4]['object_type_id'] );                              //Overtime
		$this->assertEquals( $udt_arr[$date_epoch][4]['pay_code_id'], $policy_ids['pay_code'][0] );
		$this->assertEquals( $udt_arr[$date_epoch][4]['total_time'], ( 1 * 3600 ) );
		//Overtime2
		$this->assertEquals( 30, $udt_arr[$date_epoch][3]['object_type_id'] );                              //Overtime
		$this->assertEquals( $udt_arr[$date_epoch][3]['pay_code_id'], $policy_ids['pay_code'][1] );
		$this->assertEquals( $udt_arr[$date_epoch][3]['total_time'], ( 1 * 3600 ) );
		//Overtime3
		$this->assertEquals( 30, $udt_arr[$date_epoch][2]['object_type_id'] );                              //Overtime
		$this->assertEquals( $udt_arr[$date_epoch][2]['pay_code_id'], $policy_ids['pay_code'][2] );
		$this->assertEquals( $udt_arr[$date_epoch][2]['total_time'], ( 2 * 3600 ) );
		//Make sure no other hours
		$this->assertCount( 5, $udt_arr[$date_epoch] );

		//
		//Day of Week: 4
		//
		$date_epoch = TTDate::incrementDate( TTDate::getMiddleDayEpoch( TTDate::getBeginWeekEpoch( time() ) ), 3, 'day' );
		$date_stamp = TTDate::getDate( 'DATE', $date_epoch );

		$dd->createPunchPair( $this->user_id,
							  strtotime( $date_stamp . ' 8:00AM' ),
							  strtotime( $date_stamp . ' 8:00PM' ),
							  [
									  'in_type_id'    => 10,
									  'out_type_id'   => 10,
									  'branch_id'     => 0,
									  'department_id' => 0,
									  'job_id'        => 0,
									  'job_item_id'   => 0,
									  'punch_tag_id'  => []
							  ],
							  true
		);

		$udt_arr = $this->getUserDateTotalArray( $date_epoch, $date_epoch );
		//print_r($udt_arr);
		//Total Time
		$this->assertEquals( 5, $udt_arr[$date_epoch][0]['object_type_id'] );                               //5=System Total
		$this->assertEquals( $udt_arr[$date_epoch][0]['pay_code_id'], TTUUID::getZeroID() );
		$this->assertEquals( $udt_arr[$date_epoch][0]['total_time'], ( 12 * 3600 ) );
		//Regular Time
		$this->assertEquals( 20, $udt_arr[$date_epoch][1]['object_type_id'] );                              //Regular Time
		$this->assertEquals( $udt_arr[$date_epoch][1]['pay_code_id'], $this->policy_ids['pay_code'][100] ); //Regular Time
		$this->assertEquals( $udt_arr[$date_epoch][1]['total_time'], ( 7 * 3600 ) );
		//Weekly Overtime1
		$this->assertEquals( 30, $udt_arr[$date_epoch][2]['object_type_id'] );                              //Overtime
		$this->assertEquals( $udt_arr[$date_epoch][2]['pay_code_id'], $policy_ids['pay_code'][3] );
		$this->assertEquals( $udt_arr[$date_epoch][2]['total_time'], ( 1 * 3600 ) );
		//Overtime1
		$this->assertEquals( 30, $udt_arr[$date_epoch][5]['object_type_id'] );                              //Overtime
		$this->assertEquals( $udt_arr[$date_epoch][5]['pay_code_id'], $policy_ids['pay_code'][0] );
		$this->assertEquals( $udt_arr[$date_epoch][5]['total_time'], ( 1 * 3600 ) );
		//Overtime2
		$this->assertEquals( 30, $udt_arr[$date_epoch][4]['object_type_id'] );                              //Overtime
		$this->assertEquals( $udt_arr[$date_epoch][4]['pay_code_id'], $policy_ids['pay_code'][1] );
		$this->assertEquals( $udt_arr[$date_epoch][4]['total_time'], ( 1 * 3600 ) );
		//Overtime3
		$this->assertEquals( 30, $udt_arr[$date_epoch][3]['object_type_id'] );                              //Overtime
		$this->assertEquals( $udt_arr[$date_epoch][3]['pay_code_id'], $policy_ids['pay_code'][2] );
		$this->assertEquals( $udt_arr[$date_epoch][3]['total_time'], ( 2 * 3600 ) );
		//Make sure no other hours
		$this->assertCount( 6, $udt_arr[$date_epoch] );

		//
		//Day of Week: 5
		//
		$date_epoch = TTDate::incrementDate( TTDate::getMiddleDayEpoch( TTDate::getBeginWeekEpoch( time() ) ), 4, 'day' );
		$date_stamp = TTDate::getDate( 'DATE', $date_epoch );

		$dd->createPunchPair( $this->user_id,
							  strtotime( $date_stamp . ' 8:00AM' ),
							  strtotime( $date_stamp . ' 8:00PM' ),
							  [
									  'in_type_id'    => 10,
									  'out_type_id'   => 10,
									  'branch_id'     => 0,
									  'department_id' => 0,
									  'job_id'        => 0,
									  'job_item_id'   => 0,
									  'punch_tag_id'  => []
							  ],
							  true
		);

		$udt_arr = $this->getUserDateTotalArray( $date_epoch, $date_epoch );
		//print_r($udt_arr);
		//Total Time
		$this->assertEquals( 5, $udt_arr[$date_epoch][0]['object_type_id'] );                               //5=System Total
		$this->assertEquals( $udt_arr[$date_epoch][0]['pay_code_id'], TTUUID::getZeroID() );
		$this->assertEquals( $udt_arr[$date_epoch][0]['total_time'], ( 12 * 3600 ) );
		//Weekly Overtime1 >39
		$this->assertEquals( 30, $udt_arr[$date_epoch][1]['object_type_id'] );                              //Overtime
		$this->assertEquals( $udt_arr[$date_epoch][1]['pay_code_id'], $policy_ids['pay_code'][4] );
		$this->assertEquals( $udt_arr[$date_epoch][1]['total_time'], ( 2 * 3600 ) );
		//Weekly Overtime2 >31
		$this->assertEquals( 30, $udt_arr[$date_epoch][2]['object_type_id'] );                              //Overtime
		$this->assertEquals( $udt_arr[$date_epoch][2]['pay_code_id'], $policy_ids['pay_code'][3] );
		$this->assertEquals( $udt_arr[$date_epoch][2]['total_time'], ( 7 * 3600 ) );
		//Overtime1
		//$this->assertEquals( $udt_arr[$date_epoch][5]['object_type_id'], 30 ); //Overtime
		//$this->assertEquals( $udt_arr[$date_epoch][5]['pay_code_id'], $policy_ids['pay_code'][0] );
		//$this->assertEquals( $udt_arr[$date_epoch][5]['total_time'], (1*3600) );
		//Overtime2
		$this->assertEquals( 30, $udt_arr[$date_epoch][4]['object_type_id'] );                              //Overtime
		$this->assertEquals( $udt_arr[$date_epoch][4]['pay_code_id'], $policy_ids['pay_code'][1] );
		$this->assertEquals( $udt_arr[$date_epoch][4]['total_time'], ( 1 * 3600 ) );
		//Overtime3
		$this->assertEquals( 30, $udt_arr[$date_epoch][3]['object_type_id'] );                              //Overtime
		$this->assertEquals( $udt_arr[$date_epoch][3]['pay_code_id'], $policy_ids['pay_code'][2] );
		$this->assertEquals( $udt_arr[$date_epoch][3]['total_time'], ( 2 * 3600 ) );
		//Make sure no other hours
		$this->assertCount( 5, $udt_arr[$date_epoch] );

		//
		//Day of Week: 6
		//
		$date_epoch = TTDate::incrementDate( TTDate::getMiddleDayEpoch( TTDate::getBeginWeekEpoch( time() ) ), 5, 'day' );
		$date_stamp = TTDate::getDate( 'DATE', $date_epoch );

		$dd->createPunchPair( $this->user_id,
							  strtotime( $date_stamp . ' 8:00AM' ),
							  strtotime( $date_stamp . ' 8:00PM' ),
							  [
									  'in_type_id'    => 10,
									  'out_type_id'   => 10,
									  'branch_id'     => 0,
									  'department_id' => 0,
									  'job_id'        => 0,
									  'job_item_id'   => 0,
									  'punch_tag_id'  => []
							  ],
							  true
		);

		$udt_arr = $this->getUserDateTotalArray( $date_epoch, $date_epoch );
		//print_r($udt_arr);

		//Total Time
		$this->assertEquals( 5, $udt_arr[$date_epoch][0]['object_type_id'] );                               //5=System Total
		$this->assertEquals( $udt_arr[$date_epoch][0]['pay_code_id'], TTUUID::getZeroID() );
		$this->assertEquals( $udt_arr[$date_epoch][0]['total_time'], ( 12 * 3600 ) );
		//Weekly Overtime1 >47
		$this->assertEquals( 30, $udt_arr[$date_epoch][1]['object_type_id'] );                              //Overtime
		$this->assertEquals( $udt_arr[$date_epoch][1]['pay_code_id'], $policy_ids['pay_code'][5] );
		$this->assertEquals( $udt_arr[$date_epoch][1]['total_time'], ( 4 * 3600 ) );
		//Weekly Overtime2 >39
		$this->assertEquals( 30, $udt_arr[$date_epoch][2]['object_type_id'] );                              //Overtime
		$this->assertEquals( $udt_arr[$date_epoch][2]['pay_code_id'], $policy_ids['pay_code'][4] );
		$this->assertEquals( $udt_arr[$date_epoch][2]['total_time'], ( 6 * 3600 ) );
		//Overtime1 >8
		//$this->assertEquals( $udt_arr[$date_epoch][5]['object_type_id'], 30 ); //Overtime
		//$this->assertEquals( $udt_arr[$date_epoch][5]['pay_code_id'], $policy_ids['pay_code'][0] );
		//$this->assertEquals( $udt_arr[$date_epoch][5]['total_time'], (1*3600) );
		//Overtime2 >9
		//$this->assertEquals( $udt_arr[$date_epoch][4]['object_type_id'], 30 ); //Overtime
		//$this->assertEquals( $udt_arr[$date_epoch][4]['pay_code_id'], $policy_ids['pay_code'][1] );
		//$this->assertEquals( $udt_arr[$date_epoch][4]['total_time'], (1*3600) );
		//Overtime3 >10
		$this->assertEquals( 30, $udt_arr[$date_epoch][3]['object_type_id'] );                              //Overtime
		$this->assertEquals( $udt_arr[$date_epoch][3]['pay_code_id'], $policy_ids['pay_code'][2] );
		$this->assertEquals( $udt_arr[$date_epoch][3]['total_time'], ( 2 * 3600 ) );
		//Make sure no other hours
		$this->assertCount( 4, $udt_arr[$date_epoch] );

		return true;
	}

	/**
	 * @group OvertimePolicy_testDailyAndWeeklyOverTimePolicyB
	 */
	function testDailyAndWeeklyOverTimePolicyB() {
		global $dd;

		$policy_ids['pay_formula_policy'][] = $this->createPayFormulaPolicy( $this->company_id, 200 );      //OT1.5
		$policy_ids['pay_formula_policy'][] = $this->createPayFormulaPolicy( $this->company_id, 210 );      //OT2.0
		$policy_ids['pay_formula_policy'][] = $this->createPayFormulaPolicy( $this->company_id, 220 );      //OT2.5

		//Daily
		$policy_ids['pay_code'][] = $this->createPayCode( $this->company_id, 100, $policy_ids['pay_formula_policy'][0] );
		$policy_ids['pay_code'][] = $this->createPayCode( $this->company_id, 110, $policy_ids['pay_formula_policy'][1] );
		$policy_ids['pay_code'][] = $this->createPayCode( $this->company_id, 120, $policy_ids['pay_formula_policy'][2] );

		//Weekly
		$policy_ids['pay_code'][] = $this->createPayCode( $this->company_id, 230, $policy_ids['pay_formula_policy'][0] );
		//$policy_ids['pay_code'][]  = $this->createPayCode( $this->company_id, 240, $policy_ids['pay_formula_policy'][1] );
		//$policy_ids['pay_code'][]  = $this->createPayCode( $this->company_id, 250, $policy_ids['pay_formula_policy'][2] );

		$policy_ids['overtime'][] = $this->createOverTimePolicy( $this->company_id, 100, $this->policy_ids['contributing_shift_policy'][12], $policy_ids['pay_code'][0] );
		//$policy_ids['overtime'][] = $this->createOverTimePolicy( $this->company_id, 110, $this->policy_ids['contributing_shift_policy'][12], $policy_ids['pay_code'][1] );
		//$policy_ids['overtime'][] = $this->createOverTimePolicy( $this->company_id, 120, $this->policy_ids['contributing_shift_policy'][12], $policy_ids['pay_code'][2] );

		$policy_ids['overtime'][] = $this->createOverTimePolicy( $this->company_id, 230, $this->policy_ids['contributing_shift_policy'][12], $policy_ids['pay_code'][3] );
		//$policy_ids['overtime'][] = $this->createOverTimePolicy( $this->company_id, 240, $this->policy_ids['contributing_shift_policy'][12], $policy_ids['pay_code'][4] );
		//$policy_ids['overtime'][] = $this->createOverTimePolicy( $this->company_id, 250, $this->policy_ids['contributing_shift_policy'][12], $policy_ids['pay_code'][5] );

		//Create Policy Group
		$dd->createPolicyGroup( $this->company_id,
								null, //Meal
								null, //Exception
								null, //Holiday
								$policy_ids['overtime'], //OT
								null, //Premium
								null, //Round
								[ $this->user_id ], //Users
								null, //Break
								null, //Accrual
								null, //Expense
								null, //Absence
								[ $this->policy_ids['regular'][12] ] //Regular
		);


		$date_epoch = TTDate::getMiddleDayEpoch( TTDate::getBeginWeekEpoch( time() ) );
		$date_stamp = TTDate::getDate( 'DATE', $date_epoch );

		//
		//Day of Week: 1
		//
		$dd->createPunchPair( $this->user_id,
							  strtotime( $date_stamp . ' 8:00AM' ),
							  strtotime( $date_stamp . ' 8:00PM' ),
							  [
									  'in_type_id'    => 10,
									  'out_type_id'   => 10,
									  'branch_id'     => 0,
									  'department_id' => 0,
									  'job_id'        => 0,
									  'job_item_id'   => 0,
									  'punch_tag_id'  => []
							  ],
							  true
		);

		$udt_arr = $this->getUserDateTotalArray( $date_epoch, $date_epoch );
		//print_r($udt_arr);
		//Total Time
		$this->assertEquals( 5, $udt_arr[$date_epoch][0]['object_type_id'] );                               //5=System Total
		$this->assertEquals( $udt_arr[$date_epoch][0]['pay_code_id'], TTUUID::getZeroID() );
		$this->assertEquals( $udt_arr[$date_epoch][0]['total_time'], ( 12 * 3600 ) );
		//Regular Time
		$this->assertEquals( 20, $udt_arr[$date_epoch][1]['object_type_id'] );                              //Regular Time
		$this->assertEquals( $udt_arr[$date_epoch][1]['pay_code_id'], $this->policy_ids['pay_code'][100] ); //Regular Time
		$this->assertEquals( $udt_arr[$date_epoch][1]['total_time'], ( 8 * 3600 ) );
		//Overtime1
		$this->assertEquals( 30, $udt_arr[$date_epoch][2]['object_type_id'] );                              //Overtime
		$this->assertEquals( $udt_arr[$date_epoch][2]['pay_code_id'], $policy_ids['pay_code'][0] );
		$this->assertEquals( $udt_arr[$date_epoch][2]['total_time'], ( 4 * 3600 ) );
		//Make sure no other hours
		$this->assertCount( 3, $udt_arr[$date_epoch] );

		//
		//Day of Week: 2
		//
		$date_epoch = TTDate::incrementDate( TTDate::getMiddleDayEpoch( TTDate::getBeginWeekEpoch( time() ) ), 1, 'day' );
		$date_stamp = TTDate::getDate( 'DATE', $date_epoch );

		$dd->createPunchPair( $this->user_id,
							  strtotime( $date_stamp . ' 8:00AM' ),
							  strtotime( $date_stamp . ' 8:00PM' ),
							  [
									  'in_type_id'    => 10,
									  'out_type_id'   => 10,
									  'branch_id'     => 0,
									  'department_id' => 0,
									  'job_id'        => 0,
									  'job_item_id'   => 0,
									  'punch_tag_id'  => []
							  ],
							  true
		);

		$udt_arr = $this->getUserDateTotalArray( $date_epoch, $date_epoch );
		//Total Time
		$this->assertEquals( 5, $udt_arr[$date_epoch][0]['object_type_id'] );                               //5=System Total
		$this->assertEquals( $udt_arr[$date_epoch][0]['pay_code_id'], TTUUID::getZeroID() );
		$this->assertEquals( $udt_arr[$date_epoch][0]['total_time'], ( 12 * 3600 ) );
		//Regular Time
		$this->assertEquals( 20, $udt_arr[$date_epoch][1]['object_type_id'] );                              //Regular Time
		$this->assertEquals( $udt_arr[$date_epoch][1]['pay_code_id'], $this->policy_ids['pay_code'][100] ); //Regular Time
		$this->assertEquals( $udt_arr[$date_epoch][1]['total_time'], ( 8 * 3600 ) );
		//Overtime1
		$this->assertEquals( 30, $udt_arr[$date_epoch][2]['object_type_id'] );                              //Overtime
		$this->assertEquals( $udt_arr[$date_epoch][2]['pay_code_id'], $policy_ids['pay_code'][0] );
		$this->assertEquals( $udt_arr[$date_epoch][2]['total_time'], ( 4 * 3600 ) );
		//Make sure no other hours
		$this->assertCount( 3, $udt_arr[$date_epoch] );

		//
		//Day of Week: 3
		//
		$date_epoch = TTDate::incrementDate( TTDate::getMiddleDayEpoch( TTDate::getBeginWeekEpoch( time() ) ), 2, 'day' );
		$date_stamp = TTDate::getDate( 'DATE', $date_epoch );

		$dd->createPunchPair( $this->user_id,
							  strtotime( $date_stamp . ' 8:00AM' ),
							  strtotime( $date_stamp . ' 8:00PM' ),
							  [
									  'in_type_id'    => 10,
									  'out_type_id'   => 10,
									  'branch_id'     => 0,
									  'department_id' => 0,
									  'job_id'        => 0,
									  'job_item_id'   => 0,
									  'punch_tag_id'  => []
							  ],
							  true
		);

		$udt_arr = $this->getUserDateTotalArray( $date_epoch, $date_epoch );
		//Total Time
		$this->assertEquals( 5, $udt_arr[$date_epoch][0]['object_type_id'] );                               //5=System Total
		$this->assertEquals( $udt_arr[$date_epoch][0]['pay_code_id'], TTUUID::getZeroID() );
		$this->assertEquals( $udt_arr[$date_epoch][0]['total_time'], ( 12 * 3600 ) );
		//Regular Time
		$this->assertEquals( 20, $udt_arr[$date_epoch][1]['object_type_id'] );                              //Regular Time
		$this->assertEquals( $udt_arr[$date_epoch][1]['pay_code_id'], $this->policy_ids['pay_code'][100] ); //Regular Time
		$this->assertEquals( $udt_arr[$date_epoch][1]['total_time'], ( 8 * 3600 ) );
		//Overtime1
		$this->assertEquals( 30, $udt_arr[$date_epoch][2]['object_type_id'] );                              //Overtime
		$this->assertEquals( $udt_arr[$date_epoch][2]['pay_code_id'], $policy_ids['pay_code'][0] );
		$this->assertEquals( $udt_arr[$date_epoch][2]['total_time'], ( 4 * 3600 ) );
		//Make sure no other hours
		$this->assertCount( 3, $udt_arr[$date_epoch] );

		//
		//Day of Week: 4
		//
		$date_epoch = TTDate::incrementDate( TTDate::getMiddleDayEpoch( TTDate::getBeginWeekEpoch( time() ) ), 3, 'day' );
		$date_stamp = TTDate::getDate( 'DATE', $date_epoch );

		$dd->createPunchPair( $this->user_id,
							  strtotime( $date_stamp . ' 8:00AM' ),
							  strtotime( $date_stamp . ' 6:00PM' ),
							  [
									  'in_type_id'    => 10,
									  'out_type_id'   => 10,
									  'branch_id'     => 0,
									  'department_id' => 0,
									  'job_id'        => 0,
									  'job_item_id'   => 0,
									  'punch_tag_id'  => []
							  ],
							  true
		);
		$dd->createPunchPair( $this->user_id,
							  strtotime( $date_stamp . ' 6:00PM' ),
							  strtotime( $date_stamp . ' 8:00PM' ),
							  [
									  'in_type_id'    => 10,
									  'out_type_id'   => 10,
									  'branch_id'     => 0,
									  'department_id' => 0,
									  'job_id'        => 0,
									  'job_item_id'   => 0,
									  'punch_tag_id'  => []
							  ],
							  true
		);

		$udt_arr = $this->getUserDateTotalArray( $date_epoch, $date_epoch );
		//print_r($udt_arr);
		//Total Time
		$this->assertEquals( 5, $udt_arr[$date_epoch][0]['object_type_id'] );                               //5=System Total
		$this->assertEquals( $udt_arr[$date_epoch][0]['pay_code_id'], TTUUID::getZeroID() );
		$this->assertEquals( $udt_arr[$date_epoch][0]['total_time'], ( 12 * 3600 ) );
		//Regular Time
		$this->assertEquals( 20, $udt_arr[$date_epoch][1]['object_type_id'] );                              //Regular Time
		$this->assertEquals( $udt_arr[$date_epoch][1]['pay_code_id'], $this->policy_ids['pay_code'][100] ); //Regular Time
		$this->assertEquals( $udt_arr[$date_epoch][1]['total_time'], ( 7 * 3600 ) );
		//Weekly Overtime1
		$this->assertEquals( 30, $udt_arr[$date_epoch][2]['object_type_id'] );                              //Overtime
		$this->assertEquals( $udt_arr[$date_epoch][2]['pay_code_id'], $policy_ids['pay_code'][3] );
		$this->assertEquals( $udt_arr[$date_epoch][2]['total_time'], ( 1 * 3600 ) );
		//Overtime1
		$this->assertEquals( 30, $udt_arr[$date_epoch][3]['object_type_id'] );                              //Overtime
		$this->assertEquals( $udt_arr[$date_epoch][3]['pay_code_id'], $policy_ids['pay_code'][0] );
		$this->assertEquals( $udt_arr[$date_epoch][3]['total_time'], ( 2 * 3600 ) );
		//Overtime1
		$this->assertEquals( 30, $udt_arr[$date_epoch][4]['object_type_id'] );                              //Overtime
		$this->assertEquals( $udt_arr[$date_epoch][4]['pay_code_id'], $policy_ids['pay_code'][0] );
		$this->assertEquals( $udt_arr[$date_epoch][4]['total_time'], ( 2 * 3600 ) );

		//Make sure no other hours
		$this->assertCount( 5, $udt_arr[$date_epoch] );

		return true;
	}

	/**
	 * @group OvertimePolicy_testDailyAndWeeklyOverTimePolicyC
	 */
	function testDailyAndWeeklyOverTimePolicyC() {
		global $dd;

		$policy_ids['pay_formula_policy'][] = $this->createPayFormulaPolicy( $this->company_id, 200 );      //OT1.5
		$policy_ids['pay_formula_policy'][] = $this->createPayFormulaPolicy( $this->company_id, 210 );      //OT2.0
		$policy_ids['pay_formula_policy'][] = $this->createPayFormulaPolicy( $this->company_id, 220 );      //OT2.5

		//Daily
		$policy_ids['pay_code'][] = $this->createPayCode( $this->company_id, 100, $policy_ids['pay_formula_policy'][0] );
		$policy_ids['pay_code'][] = $this->createPayCode( $this->company_id, 120, $policy_ids['pay_formula_policy'][2] );

		//Weekly
		$policy_ids['pay_code'][] = $this->createPayCode( $this->company_id, 240, $policy_ids['pay_formula_policy'][1] );

		$policy_ids['overtime'][] = $this->createOverTimePolicy( $this->company_id, 100, $this->policy_ids['contributing_shift_policy'][12], $policy_ids['pay_code'][0] );
		$policy_ids['overtime'][] = $this->createOverTimePolicy( $this->company_id, 120, $this->policy_ids['contributing_shift_policy'][12], $policy_ids['pay_code'][1] );
		$policy_ids['overtime'][] = $this->createOverTimePolicy( $this->company_id, 242, $this->policy_ids['contributing_shift_policy'][12], $policy_ids['pay_code'][2] );

		//Create Policy Group
		$dd->createPolicyGroup( $this->company_id,
								null, //Meal
								null, //Exception
								null, //Holiday
								$policy_ids['overtime'], //OT
								null, //Premium
								null, //Round
								[ $this->user_id ], //Users
								null, //Break
								null, //Accrual
								null, //Expense
								null, //Absence
								[ $this->policy_ids['regular'][12] ] //Regular
		);


		$date_epoch = TTDate::getMiddleDayEpoch( TTDate::getBeginWeekEpoch( time() ) );
		$date_stamp = TTDate::getDate( 'DATE', $date_epoch );

		//
		//Day of Week: 1
		//
		$dd->createPunchPair( $this->user_id,
							  strtotime( $date_stamp . ' 8:00AM' ),
							  strtotime( $date_stamp . ' 8:00PM' ),
							  [
									  'in_type_id'    => 10,
									  'out_type_id'   => 10,
									  'branch_id'     => 0,
									  'department_id' => 0,
									  'job_id'        => 0,
									  'job_item_id'   => 0,
									  'punch_tag_id'  => []
							  ],
							  true
		);

		$udt_arr = $this->getUserDateTotalArray( $date_epoch, $date_epoch );
		//print_r($udt_arr);
		//Total Time
		$this->assertEquals( 5, $udt_arr[$date_epoch][0]['object_type_id'] );                               //5=System Total
		$this->assertEquals( $udt_arr[$date_epoch][0]['pay_code_id'], TTUUID::getZeroID() );
		$this->assertEquals( $udt_arr[$date_epoch][0]['total_time'], ( 12 * 3600 ) );
		//Regular Time
		$this->assertEquals( 20, $udt_arr[$date_epoch][1]['object_type_id'] );                              //Regular Time
		$this->assertEquals( $udt_arr[$date_epoch][1]['pay_code_id'], $this->policy_ids['pay_code'][100] ); //Regular Time
		$this->assertEquals( $udt_arr[$date_epoch][1]['total_time'], ( 8 * 3600 ) );
		//Overtime2
		$this->assertEquals( 30, $udt_arr[$date_epoch][3]['object_type_id'] );                              //Overtime
		$this->assertEquals( $udt_arr[$date_epoch][3]['pay_code_id'], $policy_ids['pay_code'][0] );
		$this->assertEquals( $udt_arr[$date_epoch][3]['total_time'], ( 2 * 3600 ) );
		//Overtime3
		$this->assertEquals( 30, $udt_arr[$date_epoch][2]['object_type_id'] );                              //Overtime
		$this->assertEquals( $udt_arr[$date_epoch][2]['pay_code_id'], $policy_ids['pay_code'][1] );
		$this->assertEquals( $udt_arr[$date_epoch][2]['total_time'], ( 2 * 3600 ) );
		//Make sure no other hours
		$this->assertCount( 4, $udt_arr[$date_epoch] );

		//
		//Day of Week: 2
		//
		$date_epoch = TTDate::incrementDate( TTDate::getMiddleDayEpoch( TTDate::getBeginWeekEpoch( time() ) ), 1, 'day' );
		$date_stamp = TTDate::getDate( 'DATE', $date_epoch );

		$dd->createPunchPair( $this->user_id,
							  strtotime( $date_stamp . ' 8:00AM' ),
							  strtotime( $date_stamp . ' 8:00PM' ),
							  [
									  'in_type_id'    => 10,
									  'out_type_id'   => 10,
									  'branch_id'     => 0,
									  'department_id' => 0,
									  'job_id'        => 0,
									  'job_item_id'   => 0,
									  'punch_tag_id'  => []
							  ],
							  true
		);

		$udt_arr = $this->getUserDateTotalArray( $date_epoch, $date_epoch );
		//Total Time
		$this->assertEquals( 5, $udt_arr[$date_epoch][0]['object_type_id'] );                               //5=System Total
		$this->assertEquals( $udt_arr[$date_epoch][0]['pay_code_id'], TTUUID::getZeroID() );
		$this->assertEquals( $udt_arr[$date_epoch][0]['total_time'], ( 12 * 3600 ) );
		//Regular Time
		$this->assertEquals( 20, $udt_arr[$date_epoch][1]['object_type_id'] );                              //Regular Time
		$this->assertEquals( $udt_arr[$date_epoch][1]['pay_code_id'], $this->policy_ids['pay_code'][100] ); //Regular Time
		$this->assertEquals( $udt_arr[$date_epoch][1]['total_time'], ( 8 * 3600 ) );
		//Overtime2
		$this->assertEquals( 30, $udt_arr[$date_epoch][3]['object_type_id'] );                              //Overtime
		$this->assertEquals( $udt_arr[$date_epoch][3]['pay_code_id'], $policy_ids['pay_code'][0] );
		$this->assertEquals( $udt_arr[$date_epoch][3]['total_time'], ( 2 * 3600 ) );
		//Overtime3
		$this->assertEquals( 30, $udt_arr[$date_epoch][2]['object_type_id'] );                              //Overtime
		$this->assertEquals( $udt_arr[$date_epoch][2]['pay_code_id'], $policy_ids['pay_code'][1] );
		$this->assertEquals( $udt_arr[$date_epoch][2]['total_time'], ( 2 * 3600 ) );
		//Make sure no other hours
		$this->assertCount( 4, $udt_arr[$date_epoch] );


		//
		//Day of Week: 3
		//
		$date_epoch = TTDate::incrementDate( TTDate::getMiddleDayEpoch( TTDate::getBeginWeekEpoch( time() ) ), 2, 'day' );
		$date_stamp = TTDate::getDate( 'DATE', $date_epoch );

		$dd->createPunchPair( $this->user_id,
							  strtotime( $date_stamp . ' 8:00AM' ),
							  strtotime( $date_stamp . ' 8:00PM' ),
							  [
									  'in_type_id'    => 10,
									  'out_type_id'   => 10,
									  'branch_id'     => 0,
									  'department_id' => 0,
									  'job_id'        => 0,
									  'job_item_id'   => 0,
									  'punch_tag_id'  => []
							  ],
							  true
		);

		$udt_arr = $this->getUserDateTotalArray( $date_epoch, $date_epoch );
		//Total Time
		$this->assertEquals( 5, $udt_arr[$date_epoch][0]['object_type_id'] );                               //5=System Total
		$this->assertEquals( $udt_arr[$date_epoch][0]['pay_code_id'], TTUUID::getZeroID() );
		$this->assertEquals( $udt_arr[$date_epoch][0]['total_time'], ( 12 * 3600 ) );
		//Regular Time
		$this->assertEquals( 20, $udt_arr[$date_epoch][1]['object_type_id'] );                              //Regular Time
		$this->assertEquals( $udt_arr[$date_epoch][1]['pay_code_id'], $this->policy_ids['pay_code'][100] ); //Regular Time
		$this->assertEquals( $udt_arr[$date_epoch][1]['total_time'], ( 8 * 3600 ) );
		//Overtime2
		$this->assertEquals( 30, $udt_arr[$date_epoch][3]['object_type_id'] );                              //Overtime
		$this->assertEquals( $udt_arr[$date_epoch][3]['pay_code_id'], $policy_ids['pay_code'][0] );
		$this->assertEquals( $udt_arr[$date_epoch][3]['total_time'], ( 2 * 3600 ) );
		//Overtime3
		$this->assertEquals( 30, $udt_arr[$date_epoch][2]['object_type_id'] );                              //Overtime
		$this->assertEquals( $udt_arr[$date_epoch][2]['pay_code_id'], $policy_ids['pay_code'][1] );
		$this->assertEquals( $udt_arr[$date_epoch][2]['total_time'], ( 2 * 3600 ) );
		//Make sure no other hours
		$this->assertCount( 4, $udt_arr[$date_epoch] );


		//
		//Day of Week: 4
		//
		$date_epoch = TTDate::incrementDate( TTDate::getMiddleDayEpoch( TTDate::getBeginWeekEpoch( time() ) ), 3, 'day' );
		$date_stamp = TTDate::getDate( 'DATE', $date_epoch );

		$dd->createPunchPair( $this->user_id,
							  strtotime( $date_stamp . ' 8:00AM' ),
							  strtotime( $date_stamp . ' 8:00PM' ),
							  [
									  'in_type_id'    => 10,
									  'out_type_id'   => 10,
									  'branch_id'     => 0,
									  'department_id' => 0,
									  'job_id'        => 0,
									  'job_item_id'   => 0,
									  'punch_tag_id'  => []
							  ],
							  true
		);

		$udt_arr = $this->getUserDateTotalArray( $date_epoch, $date_epoch );
		//print_r($udt_arr);
		//Total Time
		$this->assertEquals( 5, $udt_arr[$date_epoch][0]['object_type_id'] );                               //5=System Total
		$this->assertEquals( $udt_arr[$date_epoch][0]['pay_code_id'], TTUUID::getZeroID() );
		$this->assertEquals( $udt_arr[$date_epoch][0]['total_time'], ( 12 * 3600 ) );
		//Regular Time
		$this->assertEquals( 20, $udt_arr[$date_epoch][1]['object_type_id'] );                              //Regular Time
		$this->assertEquals( $udt_arr[$date_epoch][1]['pay_code_id'], $this->policy_ids['pay_code'][100] ); //Regular Time
		$this->assertEquals( $udt_arr[$date_epoch][1]['total_time'], ( 8 * 3600 ) );
		//Overtime2
		$this->assertEquals( 30, $udt_arr[$date_epoch][3]['object_type_id'] );                              //Overtime
		$this->assertEquals( $udt_arr[$date_epoch][3]['pay_code_id'], $policy_ids['pay_code'][0] );
		$this->assertEquals( $udt_arr[$date_epoch][3]['total_time'], ( 2 * 3600 ) );
		//Overtime3
		$this->assertEquals( 30, $udt_arr[$date_epoch][2]['object_type_id'] );                              //Overtime
		$this->assertEquals( $udt_arr[$date_epoch][2]['pay_code_id'], $policy_ids['pay_code'][1] );
		$this->assertEquals( $udt_arr[$date_epoch][2]['total_time'], ( 2 * 3600 ) );
		//Make sure no other hours
		$this->assertCount( 4, $udt_arr[$date_epoch] );


		//
		//Day of Week: 5
		//

		//
		//Test split shift where the first part of the shift doesn't cross into overtime and only the 2nd half does.
		//
		$date_epoch = TTDate::incrementDate( TTDate::getMiddleDayEpoch( TTDate::getBeginWeekEpoch( time() ) ), 4, 'day' );
		$date_stamp = TTDate::getDate( 'DATE', $date_epoch );

		$dd->createPunchPair( $this->user_id,
							  strtotime( $date_stamp . ' 9:35AM' ),
							  strtotime( $date_stamp . ' 2:10PM' ),
							  [
									  'in_type_id'    => 10,
									  'out_type_id'   => 10,
									  'branch_id'     => 0,
									  'department_id' => 0,
									  'job_id'        => 0,
									  'job_item_id'   => 0,
									  'punch_tag_id'  => []
							  ],
							  true
		);
		$dd->createPunchPair( $this->user_id,
							  strtotime( $date_stamp . ' 2:20PM' ),
							  strtotime( $date_stamp . ' 6:45PM' ),
							  [
									  'in_type_id'    => 10,
									  'out_type_id'   => 10,
									  'branch_id'     => 0,
									  'department_id' => 0,
									  'job_id'        => 0,
									  'job_item_id'   => 0,
									  'punch_tag_id'  => []
							  ],
							  true
		);

		$udt_arr = $this->getUserDateTotalArray( $date_epoch, $date_epoch );
		//print_r($udt_arr);
		//Total Time
		$this->assertEquals( 5, $udt_arr[$date_epoch][0]['object_type_id'] );                               //5=System Total
		$this->assertEquals( $udt_arr[$date_epoch][0]['pay_code_id'], TTUUID::getZeroID() );
		$this->assertEquals( $udt_arr[$date_epoch][0]['total_time'], ( 9 * 3600 ) );
		//Regular Time
		$this->assertEquals( 20, $udt_arr[$date_epoch][1]['object_type_id'] );                              //Regular Time
		$this->assertEquals( $udt_arr[$date_epoch][1]['pay_code_id'], $this->policy_ids['pay_code'][100] ); //Regular Time
		$this->assertEquals( $udt_arr[$date_epoch][1]['total_time'], ( 12300 ) );
		//Regular Time
		$this->assertEquals( 20, $udt_arr[$date_epoch][2]['object_type_id'] );                              //Regular Time
		$this->assertEquals( $udt_arr[$date_epoch][2]['pay_code_id'], $this->policy_ids['pay_code'][100] ); //Regular Time
		$this->assertEquals( $udt_arr[$date_epoch][2]['total_time'], ( 16500 ) );
		//Overtime2
		//This could be Daily >8 or Weekly >39 as they both apply at the exact same time.
		//However even though Daily OT has a lower calculation order and is calculated first, Weekly > 39 has a higher rate.
		//Which one should be used? Go with Daily OT for now as its calculated first and always needs to apply even after Weekly OT (ie: >12hrs)
		$this->assertEquals( 30, $udt_arr[$date_epoch][3]['object_type_id'] );                              //Overtime
		//$this->assertEquals( $udt_arr[$date_epoch][3]['pay_code_id'], $policy_ids['pay_code'][0] ); //Daily >8
		$this->assertEquals( $udt_arr[$date_epoch][3]['pay_code_id'], $policy_ids['pay_code'][2] );         //Weekly >39
		$this->assertEquals( $udt_arr[$date_epoch][3]['total_time'], ( 1 * 3600 ) );

		//Make sure no other hours
		$this->assertCount( 4, $udt_arr[$date_epoch] );

		return true;
	}

	/**
	 * @group OvertimePolicy_testDailyAndWeeklyOverTimePolicyC2
	 */
	function testDailyAndWeeklyOverTimePolicyC2() {
		global $dd;

		$policy_ids['pay_formula_policy'][] = $this->createPayFormulaPolicy( $this->company_id, 200 ); //OT1.5
		$policy_ids['pay_formula_policy'][] = $this->createPayFormulaPolicy( $this->company_id, 210 ); //OT2.0
		$policy_ids['pay_formula_policy'][] = $this->createPayFormulaPolicy( $this->company_id, 220 ); //OT2.5

		//Daily
		$policy_ids['pay_code'][] = $this->createPayCode( $this->company_id, 100, $policy_ids['pay_formula_policy'][0] );
		$policy_ids['pay_code'][] = $this->createPayCode( $this->company_id, 120, $policy_ids['pay_formula_policy'][2] );

		//Weekly
		$policy_ids['pay_code'][] = $this->createPayCode( $this->company_id, 240, $policy_ids['pay_formula_policy'][1] );

		$policy_ids['overtime'][] = $this->createOverTimePolicy( $this->company_id, 100, $this->policy_ids['contributing_shift_policy'][12], $policy_ids['pay_code'][0] );
		$policy_ids['overtime'][] = $this->createOverTimePolicy( $this->company_id, 120, $this->policy_ids['contributing_shift_policy'][12], $policy_ids['pay_code'][1] );
		$policy_ids['overtime'][] = $this->createOverTimePolicy( $this->company_id, 242, $this->policy_ids['contributing_shift_policy'][12], $policy_ids['pay_code'][0] ); //Test with same rate as Daily >8

		//Create Policy Group
		$dd->createPolicyGroup( $this->company_id,
								null, //Meal
								null, //Exception
								null, //Holiday
								$policy_ids['overtime'], //OT
								null, //Premium
								null, //Round
								[ $this->user_id ], //Users
								null, //Break
								null, //Accrual
								null, //Expense
								null, //Absence
								[ $this->policy_ids['regular'][12] ] //Regular
		);


		$date_epoch = TTDate::getMiddleDayEpoch( TTDate::getBeginWeekEpoch( time() ) );
		$date_stamp = TTDate::getDate( 'DATE', $date_epoch );

		//
		//Day of Week: 1
		//
		$dd->createPunchPair( $this->user_id,
							  strtotime( $date_stamp . ' 8:00AM' ),
							  strtotime( $date_stamp . ' 8:00PM' ),
							  [
									  'in_type_id'    => 10,
									  'out_type_id'   => 10,
									  'branch_id'     => 0,
									  'department_id' => 0,
									  'job_id'        => 0,
									  'job_item_id'   => 0,
									  'punch_tag_id'  => []
							  ],
							  true
		);

		$udt_arr = $this->getUserDateTotalArray( $date_epoch, $date_epoch );
		//print_r($udt_arr);
		//Total Time
		$this->assertEquals( 5, $udt_arr[$date_epoch][0]['object_type_id'] );                                                                                              //5=System Total
		$this->assertEquals( $udt_arr[$date_epoch][0]['pay_code_id'], TTUUID::getZeroID() );
		$this->assertEquals( $udt_arr[$date_epoch][0]['total_time'], ( 12 * 3600 ) );
		//Regular Time
		$this->assertEquals( 20, $udt_arr[$date_epoch][1]['object_type_id'] );                                                                                             //Regular Time
		$this->assertEquals( $udt_arr[$date_epoch][1]['pay_code_id'], $this->policy_ids['pay_code'][100] );                                                                //Regular Time
		$this->assertEquals( $udt_arr[$date_epoch][1]['total_time'], ( 8 * 3600 ) );
		//Overtime2
		$this->assertEquals( 30, $udt_arr[$date_epoch][3]['object_type_id'] );                                                                                             //Overtime
		$this->assertEquals( $udt_arr[$date_epoch][3]['pay_code_id'], $policy_ids['pay_code'][0] );
		$this->assertEquals( $udt_arr[$date_epoch][3]['total_time'], ( 2 * 3600 ) );
		//Overtime3
		$this->assertEquals( 30, $udt_arr[$date_epoch][2]['object_type_id'] );                                                                                             //Overtime
		$this->assertEquals( $udt_arr[$date_epoch][2]['pay_code_id'], $policy_ids['pay_code'][1] );
		$this->assertEquals( $udt_arr[$date_epoch][2]['total_time'], ( 2 * 3600 ) );
		//Make sure no other hours
		$this->assertCount( 4, $udt_arr[$date_epoch] );

		//
		//Day of Week: 2
		//
		$date_epoch = TTDate::incrementDate( TTDate::getMiddleDayEpoch( TTDate::getBeginWeekEpoch( time() ) ), 1, 'day' );
		$date_stamp = TTDate::getDate( 'DATE', $date_epoch );

		$dd->createPunchPair( $this->user_id,
							  strtotime( $date_stamp . ' 8:00AM' ),
							  strtotime( $date_stamp . ' 8:00PM' ),
							  [
									  'in_type_id'    => 10,
									  'out_type_id'   => 10,
									  'branch_id'     => 0,
									  'department_id' => 0,
									  'job_id'        => 0,
									  'job_item_id'   => 0,
									  'punch_tag_id'  => []
							  ],
							  true
		);

		$udt_arr = $this->getUserDateTotalArray( $date_epoch, $date_epoch );
		//Total Time
		$this->assertEquals( 5, $udt_arr[$date_epoch][0]['object_type_id'] );                                                                                              //5=System Total
		$this->assertEquals( $udt_arr[$date_epoch][0]['pay_code_id'], TTUUID::getZeroID() );
		$this->assertEquals( $udt_arr[$date_epoch][0]['total_time'], ( 12 * 3600 ) );
		//Regular Time
		$this->assertEquals( 20, $udt_arr[$date_epoch][1]['object_type_id'] );                                                                                             //Regular Time
		$this->assertEquals( $udt_arr[$date_epoch][1]['pay_code_id'], $this->policy_ids['pay_code'][100] );                                                                //Regular Time
		$this->assertEquals( $udt_arr[$date_epoch][1]['total_time'], ( 8 * 3600 ) );
		//Overtime2
		$this->assertEquals( 30, $udt_arr[$date_epoch][3]['object_type_id'] );                                                                                             //Overtime
		$this->assertEquals( $udt_arr[$date_epoch][3]['pay_code_id'], $policy_ids['pay_code'][0] );
		$this->assertEquals( $udt_arr[$date_epoch][3]['total_time'], ( 2 * 3600 ) );
		//Overtime3
		$this->assertEquals( 30, $udt_arr[$date_epoch][2]['object_type_id'] );                                                                                             //Overtime
		$this->assertEquals( $udt_arr[$date_epoch][2]['pay_code_id'], $policy_ids['pay_code'][1] );
		$this->assertEquals( $udt_arr[$date_epoch][2]['total_time'], ( 2 * 3600 ) );
		//Make sure no other hours
		$this->assertCount( 4, $udt_arr[$date_epoch] );


		//
		//Day of Week: 3
		//
		$date_epoch = TTDate::incrementDate( TTDate::getMiddleDayEpoch( TTDate::getBeginWeekEpoch( time() ) ), 2, 'day' );
		$date_stamp = TTDate::getDate( 'DATE', $date_epoch );

		$dd->createPunchPair( $this->user_id,
							  strtotime( $date_stamp . ' 8:00AM' ),
							  strtotime( $date_stamp . ' 8:00PM' ),
							  [
									  'in_type_id'    => 10,
									  'out_type_id'   => 10,
									  'branch_id'     => 0,
									  'department_id' => 0,
									  'job_id'        => 0,
									  'job_item_id'   => 0,
									  'punch_tag_id'  => []
							  ],
							  true
		);

		$udt_arr = $this->getUserDateTotalArray( $date_epoch, $date_epoch );
		//Total Time
		$this->assertEquals( 5, $udt_arr[$date_epoch][0]['object_type_id'] );                                                                                              //5=System Total
		$this->assertEquals( $udt_arr[$date_epoch][0]['pay_code_id'], TTUUID::getZeroID() );
		$this->assertEquals( $udt_arr[$date_epoch][0]['total_time'], ( 12 * 3600 ) );
		//Regular Time
		$this->assertEquals( 20, $udt_arr[$date_epoch][1]['object_type_id'] );                                                                                             //Regular Time
		$this->assertEquals( $udt_arr[$date_epoch][1]['pay_code_id'], $this->policy_ids['pay_code'][100] );                                                                //Regular Time
		$this->assertEquals( $udt_arr[$date_epoch][1]['total_time'], ( 8 * 3600 ) );
		//Overtime2
		$this->assertEquals( 30, $udt_arr[$date_epoch][3]['object_type_id'] );                                                                                             //Overtime
		$this->assertEquals( $udt_arr[$date_epoch][3]['pay_code_id'], $policy_ids['pay_code'][0] );
		$this->assertEquals( $udt_arr[$date_epoch][3]['total_time'], ( 2 * 3600 ) );
		//Overtime3
		$this->assertEquals( 30, $udt_arr[$date_epoch][2]['object_type_id'] );                                                                                             //Overtime
		$this->assertEquals( $udt_arr[$date_epoch][2]['pay_code_id'], $policy_ids['pay_code'][1] );
		$this->assertEquals( $udt_arr[$date_epoch][2]['total_time'], ( 2 * 3600 ) );
		//Make sure no other hours
		$this->assertCount( 4, $udt_arr[$date_epoch] );


		//
		//Day of Week: 4
		//
		$date_epoch = TTDate::incrementDate( TTDate::getMiddleDayEpoch( TTDate::getBeginWeekEpoch( time() ) ), 3, 'day' );
		$date_stamp = TTDate::getDate( 'DATE', $date_epoch );

		$dd->createPunchPair( $this->user_id,
							  strtotime( $date_stamp . ' 8:00AM' ),
							  strtotime( $date_stamp . ' 8:00PM' ),
							  [
									  'in_type_id'    => 10,
									  'out_type_id'   => 10,
									  'branch_id'     => 0,
									  'department_id' => 0,
									  'job_id'        => 0,
									  'job_item_id'   => 0,
									  'punch_tag_id'  => []
							  ],
							  true
		);

		$udt_arr = $this->getUserDateTotalArray( $date_epoch, $date_epoch );
		//print_r($udt_arr);
		//Total Time
		$this->assertEquals( 5, $udt_arr[$date_epoch][0]['object_type_id'] );                                                                                              //5=System Total
		$this->assertEquals( $udt_arr[$date_epoch][0]['pay_code_id'], TTUUID::getZeroID() );
		$this->assertEquals( $udt_arr[$date_epoch][0]['total_time'], ( 12 * 3600 ) );
		//Regular Time
		$this->assertEquals( 20, $udt_arr[$date_epoch][1]['object_type_id'] );                                                                                             //Regular Time
		$this->assertEquals( $udt_arr[$date_epoch][1]['pay_code_id'], $this->policy_ids['pay_code'][100] );                                                                //Regular Time
		$this->assertEquals( $udt_arr[$date_epoch][1]['total_time'], ( 8 * 3600 ) );
		//Overtime2
		$this->assertEquals( 30, $udt_arr[$date_epoch][3]['object_type_id'] );                                                                                             //Overtime
		$this->assertEquals( $udt_arr[$date_epoch][3]['pay_code_id'], $policy_ids['pay_code'][0] );
		$this->assertEquals( $udt_arr[$date_epoch][3]['total_time'], ( 2 * 3600 ) );
		//Overtime3
		$this->assertEquals( 30, $udt_arr[$date_epoch][2]['object_type_id'] );                                                                                             //Overtime
		$this->assertEquals( $udt_arr[$date_epoch][2]['pay_code_id'], $policy_ids['pay_code'][1] );
		$this->assertEquals( $udt_arr[$date_epoch][2]['total_time'], ( 2 * 3600 ) );
		//Make sure no other hours
		$this->assertCount( 4, $udt_arr[$date_epoch] );


		//
		//Day of Week: 5
		//

		//
		//Test split shift where the first part of the shift doesn't cross into overtime and only the 2nd half does.
		//
		$date_epoch = TTDate::incrementDate( TTDate::getMiddleDayEpoch( TTDate::getBeginWeekEpoch( time() ) ), 4, 'day' );
		$date_stamp = TTDate::getDate( 'DATE', $date_epoch );

		$dd->createPunchPair( $this->user_id,
							  strtotime( $date_stamp . ' 9:35AM' ),
							  strtotime( $date_stamp . ' 2:10PM' ),
							  [
									  'in_type_id'    => 10,
									  'out_type_id'   => 10,
									  'branch_id'     => 0,
									  'department_id' => 0,
									  'job_id'        => 0,
									  'job_item_id'   => 0,
									  'punch_tag_id'  => []
							  ],
							  true
		);
		$dd->createPunchPair( $this->user_id,
							  strtotime( $date_stamp . ' 2:20PM' ),
							  strtotime( $date_stamp . ' 6:45PM' ),
							  [
									  'in_type_id'    => 10,
									  'out_type_id'   => 10,
									  'branch_id'     => 0,
									  'department_id' => 0,
									  'job_id'        => 0,
									  'job_item_id'   => 0,
									  'punch_tag_id'  => []
							  ],
							  true
		);

		$udt_arr = $this->getUserDateTotalArray( $date_epoch, $date_epoch );
		//print_r($udt_arr);
		//Total Time
		$this->assertEquals( 5, $udt_arr[$date_epoch][0]['object_type_id'] );                                                                                              //5=System Total
		$this->assertEquals( $udt_arr[$date_epoch][0]['pay_code_id'], TTUUID::getZeroID() );
		$this->assertEquals( $udt_arr[$date_epoch][0]['total_time'], ( 9 * 3600 ) );
		//Regular Time
		$this->assertEquals( 20, $udt_arr[$date_epoch][1]['object_type_id'] );                                                                                             //Regular Time
		$this->assertEquals( $udt_arr[$date_epoch][1]['pay_code_id'], $this->policy_ids['pay_code'][100] );                                                                //Regular Time
		$this->assertEquals( $udt_arr[$date_epoch][1]['total_time'], ( 12300 ) );
		//Regular Time
		$this->assertEquals( 20, $udt_arr[$date_epoch][2]['object_type_id'] );                                                                                             //Regular Time
		$this->assertEquals( $udt_arr[$date_epoch][2]['pay_code_id'], $this->policy_ids['pay_code'][100] );                                                                //Regular Time
		$this->assertEquals( $udt_arr[$date_epoch][2]['total_time'], ( 16500 ) );
		//Overtime2
		//This could be Daily >8 or Weekly >39 as they both apply at the exact same time.
		//However both have the same rate, so Daily >8 should *definitely* be used over Weekly OT.
		$this->assertEquals( 30, $udt_arr[$date_epoch][3]['object_type_id'] );                                                                                             //Overtime
		$this->assertEquals( $udt_arr[$date_epoch][3]['pay_code_id'], $policy_ids['pay_code'][0] );                                                                        //Daily >8
		$this->assertEquals( $udt_arr[$date_epoch][3]['total_time'], ( 1 * 3600 ) );

		//Make sure no other hours
		$this->assertCount( 4, $udt_arr[$date_epoch] );

		return true;
	}

	/**
	 * @group OvertimePolicy_testDailyAndWeeklyOverTimePolicyD
	 */
	function testDailyAndWeeklyOverTimePolicyD() {
		global $dd;

		$policy_ids['pay_formula_policy'][] = $this->createPayFormulaPolicy( $this->company_id, 200 );      //OT1.5
		$policy_ids['pay_formula_policy'][] = $this->createPayFormulaPolicy( $this->company_id, 210 );      //OT2.0
		$policy_ids['pay_formula_policy'][] = $this->createPayFormulaPolicy( $this->company_id, 220 );      //OT2.5

		//Daily
		$policy_ids['pay_code'][] = $this->createPayCode( $this->company_id, 100, $policy_ids['pay_formula_policy'][0] );
		$policy_ids['pay_code'][] = $this->createPayCode( $this->company_id, 120, $policy_ids['pay_formula_policy'][2] );

		//Weekly
		$policy_ids['pay_code'][] = $this->createPayCode( $this->company_id, 240, $policy_ids['pay_formula_policy'][1] );

		$policy_ids['overtime'][] = $this->createOverTimePolicy( $this->company_id, 100, $this->policy_ids['contributing_shift_policy'][12], $policy_ids['pay_code'][0] );
		$policy_ids['overtime'][] = $this->createOverTimePolicy( $this->company_id, 120, $this->policy_ids['contributing_shift_policy'][12], $policy_ids['pay_code'][1] );
		$policy_ids['overtime'][] = $this->createOverTimePolicy( $this->company_id, 242, $this->policy_ids['contributing_shift_policy'][12], $policy_ids['pay_code'][2] );

		//Create Policy Group
		$dd->createPolicyGroup( $this->company_id,
								null, //Meal
								null, //Exception
								null, //Holiday
								$policy_ids['overtime'], //OT
								null, //Premium
								null, //Round
								[ $this->user_id ], //Users
								null, //Break
								null, //Accrual
								null, //Expense
								null, //Absence
								[ $this->policy_ids['regular'][12] ] //Regular
		);


		$date_epoch = TTDate::getMiddleDayEpoch( TTDate::getBeginWeekEpoch( time() ) );
		$date_stamp = TTDate::getDate( 'DATE', $date_epoch );

		//
		//Day of Week: 1
		//
		$dd->createPunchPair( $this->user_id,
							  strtotime( $date_stamp . ' 8:00AM' ),
							  strtotime( $date_stamp . ' 8:00PM' ),
							  [
									  'in_type_id'    => 10,
									  'out_type_id'   => 10,
									  'branch_id'     => 0,
									  'department_id' => 0,
									  'job_id'        => 0,
									  'job_item_id'   => 0,
									  'punch_tag_id'  => []
							  ],
							  true
		);

		$udt_arr = $this->getUserDateTotalArray( $date_epoch, $date_epoch );
		//print_r($udt_arr);
		//Total Time
		$this->assertEquals( 5, $udt_arr[$date_epoch][0]['object_type_id'] );                               //5=System Total
		$this->assertEquals( $udt_arr[$date_epoch][0]['pay_code_id'], TTUUID::getZeroID() );
		$this->assertEquals( $udt_arr[$date_epoch][0]['total_time'], ( 12 * 3600 ) );
		//Regular Time
		$this->assertEquals( 20, $udt_arr[$date_epoch][1]['object_type_id'] );                              //Regular Time
		$this->assertEquals( $udt_arr[$date_epoch][1]['pay_code_id'], $this->policy_ids['pay_code'][100] ); //Regular Time
		$this->assertEquals( $udt_arr[$date_epoch][1]['total_time'], ( 8 * 3600 ) );
		//Overtime2
		$this->assertEquals( 30, $udt_arr[$date_epoch][3]['object_type_id'] );                              //Overtime
		$this->assertEquals( $udt_arr[$date_epoch][3]['pay_code_id'], $policy_ids['pay_code'][0] );
		$this->assertEquals( $udt_arr[$date_epoch][3]['total_time'], ( 2 * 3600 ) );
		//Overtime3
		$this->assertEquals( 30, $udt_arr[$date_epoch][2]['object_type_id'] );                              //Overtime
		$this->assertEquals( $udt_arr[$date_epoch][2]['pay_code_id'], $policy_ids['pay_code'][1] );
		$this->assertEquals( $udt_arr[$date_epoch][2]['total_time'], ( 2 * 3600 ) );
		//Make sure no other hours
		$this->assertCount( 4, $udt_arr[$date_epoch] );

		//
		//Day of Week: 2
		//
		$date_epoch = TTDate::incrementDate( TTDate::getMiddleDayEpoch( TTDate::getBeginWeekEpoch( time() ) ), 1, 'day' );
		$date_stamp = TTDate::getDate( 'DATE', $date_epoch );

		$dd->createPunchPair( $this->user_id,
							  strtotime( $date_stamp . ' 8:00AM' ),
							  strtotime( $date_stamp . ' 8:00PM' ),
							  [
									  'in_type_id'    => 10,
									  'out_type_id'   => 10,
									  'branch_id'     => 0,
									  'department_id' => 0,
									  'job_id'        => 0,
									  'job_item_id'   => 0,
									  'punch_tag_id'  => []
							  ],
							  true
		);

		$udt_arr = $this->getUserDateTotalArray( $date_epoch, $date_epoch );
		//Total Time
		$this->assertEquals( 5, $udt_arr[$date_epoch][0]['object_type_id'] );                               //5=System Total
		$this->assertEquals( $udt_arr[$date_epoch][0]['pay_code_id'], TTUUID::getZeroID() );
		$this->assertEquals( $udt_arr[$date_epoch][0]['total_time'], ( 12 * 3600 ) );
		//Regular Time
		$this->assertEquals( 20, $udt_arr[$date_epoch][1]['object_type_id'] );                              //Regular Time
		$this->assertEquals( $udt_arr[$date_epoch][1]['pay_code_id'], $this->policy_ids['pay_code'][100] ); //Regular Time
		$this->assertEquals( $udt_arr[$date_epoch][1]['total_time'], ( 8 * 3600 ) );
		//Overtime2
		$this->assertEquals( 30, $udt_arr[$date_epoch][3]['object_type_id'] );                              //Overtime
		$this->assertEquals( $udt_arr[$date_epoch][3]['pay_code_id'], $policy_ids['pay_code'][0] );
		$this->assertEquals( $udt_arr[$date_epoch][3]['total_time'], ( 2 * 3600 ) );
		//Overtime3
		$this->assertEquals( 30, $udt_arr[$date_epoch][2]['object_type_id'] );                              //Overtime
		$this->assertEquals( $udt_arr[$date_epoch][2]['pay_code_id'], $policy_ids['pay_code'][1] );
		$this->assertEquals( $udt_arr[$date_epoch][2]['total_time'], ( 2 * 3600 ) );
		//Make sure no other hours
		$this->assertCount( 4, $udt_arr[$date_epoch] );


		//
		//Day of Week: 3
		//
		$date_epoch = TTDate::incrementDate( TTDate::getMiddleDayEpoch( TTDate::getBeginWeekEpoch( time() ) ), 2, 'day' );
		$date_stamp = TTDate::getDate( 'DATE', $date_epoch );

		$dd->createPunchPair( $this->user_id,
							  strtotime( $date_stamp . ' 8:00AM' ),
							  strtotime( $date_stamp . ' 8:00PM' ),
							  [
									  'in_type_id'    => 10,
									  'out_type_id'   => 10,
									  'branch_id'     => 0,
									  'department_id' => 0,
									  'job_id'        => 0,
									  'job_item_id'   => 0,
									  'punch_tag_id'  => []
							  ],
							  true
		);

		$udt_arr = $this->getUserDateTotalArray( $date_epoch, $date_epoch );
		//Total Time
		$this->assertEquals( 5, $udt_arr[$date_epoch][0]['object_type_id'] );                               //5=System Total
		$this->assertEquals( $udt_arr[$date_epoch][0]['pay_code_id'], TTUUID::getZeroID() );
		$this->assertEquals( $udt_arr[$date_epoch][0]['total_time'], ( 12 * 3600 ) );
		//Regular Time
		$this->assertEquals( 20, $udt_arr[$date_epoch][1]['object_type_id'] );                              //Regular Time
		$this->assertEquals( $udt_arr[$date_epoch][1]['pay_code_id'], $this->policy_ids['pay_code'][100] ); //Regular Time
		$this->assertEquals( $udt_arr[$date_epoch][1]['total_time'], ( 8 * 3600 ) );
		//Overtime2
		$this->assertEquals( 30, $udt_arr[$date_epoch][3]['object_type_id'] );                              //Overtime
		$this->assertEquals( $udt_arr[$date_epoch][3]['pay_code_id'], $policy_ids['pay_code'][0] );
		$this->assertEquals( $udt_arr[$date_epoch][3]['total_time'], ( 2 * 3600 ) );
		//Overtime3
		$this->assertEquals( 30, $udt_arr[$date_epoch][2]['object_type_id'] );                              //Overtime
		$this->assertEquals( $udt_arr[$date_epoch][2]['pay_code_id'], $policy_ids['pay_code'][1] );
		$this->assertEquals( $udt_arr[$date_epoch][2]['total_time'], ( 2 * 3600 ) );
		//Make sure no other hours
		$this->assertCount( 4, $udt_arr[$date_epoch] );


		//
		//Day of Week: 4
		//
		$date_epoch = TTDate::incrementDate( TTDate::getMiddleDayEpoch( TTDate::getBeginWeekEpoch( time() ) ), 3, 'day' );
		$date_stamp = TTDate::getDate( 'DATE', $date_epoch );

		$dd->createPunchPair( $this->user_id,
							  strtotime( $date_stamp . ' 8:00AM' ),
							  strtotime( $date_stamp . ' 8:00PM' ),
							  [
									  'in_type_id'    => 10,
									  'out_type_id'   => 10,
									  'branch_id'     => 0,
									  'department_id' => 0,
									  'job_id'        => 0,
									  'job_item_id'   => 0,
									  'punch_tag_id'  => []
							  ],
							  true
		);

		$udt_arr = $this->getUserDateTotalArray( $date_epoch, $date_epoch );
		//print_r($udt_arr);
		//Total Time
		$this->assertEquals( 5, $udt_arr[$date_epoch][0]['object_type_id'] );                               //5=System Total
		$this->assertEquals( $udt_arr[$date_epoch][0]['pay_code_id'], TTUUID::getZeroID() );
		$this->assertEquals( $udt_arr[$date_epoch][0]['total_time'], ( 12 * 3600 ) );
		//Regular Time
		$this->assertEquals( 20, $udt_arr[$date_epoch][1]['object_type_id'] );                              //Regular Time
		$this->assertEquals( $udt_arr[$date_epoch][1]['pay_code_id'], $this->policy_ids['pay_code'][100] ); //Regular Time
		$this->assertEquals( $udt_arr[$date_epoch][1]['total_time'], ( 8 * 3600 ) );
		//Overtime2
		$this->assertEquals( 30, $udt_arr[$date_epoch][3]['object_type_id'] );                              //Overtime
		$this->assertEquals( $udt_arr[$date_epoch][3]['pay_code_id'], $policy_ids['pay_code'][0] );
		$this->assertEquals( $udt_arr[$date_epoch][3]['total_time'], ( 2 * 3600 ) );
		//Overtime3
		$this->assertEquals( 30, $udt_arr[$date_epoch][2]['object_type_id'] );                              //Overtime
		$this->assertEquals( $udt_arr[$date_epoch][2]['pay_code_id'], $policy_ids['pay_code'][1] );
		$this->assertEquals( $udt_arr[$date_epoch][2]['total_time'], ( 2 * 3600 ) );
		//Make sure no other hours
		$this->assertCount( 4, $udt_arr[$date_epoch] );


		//
		//Day of Week: 5
		//

		//
		//Test split shift where the first part of the shift doesn't cross into overtime and only the 2nd half does.
		//
		$date_epoch = TTDate::incrementDate( TTDate::getMiddleDayEpoch( TTDate::getBeginWeekEpoch( time() ) ), 4, 'day' );
		$date_stamp = TTDate::getDate( 'DATE', $date_epoch );

		$dd->createPunchPair( $this->user_id,
							  strtotime( $date_stamp . ' 9:35AM' ),
							  strtotime( $date_stamp . ' 11:10AM' ),
							  [
									  'in_type_id'    => 10,
									  'out_type_id'   => 10,
									  'branch_id'     => 0,
									  'department_id' => 0,
									  'job_id'        => 0,
									  'job_item_id'   => 0,
									  'punch_tag_id'  => []
							  ],
							  true
		);
		$dd->createPunchPair( $this->user_id,
							  strtotime( $date_stamp . ' 11:20AM' ),
							  strtotime( $date_stamp . ' 6:45PM' ),
							  [
									  'in_type_id'    => 10,
									  'out_type_id'   => 10,
									  'branch_id'     => 0,
									  'department_id' => 0,
									  'job_id'        => 0,
									  'job_item_id'   => 0,
									  'punch_tag_id'  => []
							  ],
							  true
		);

		$udt_arr = $this->getUserDateTotalArray( $date_epoch, $date_epoch );
		//print_r($udt_arr);
		//Total Time
		$this->assertEquals( 5, $udt_arr[$date_epoch][0]['object_type_id'] );                               //5=System Total
		$this->assertEquals( $udt_arr[$date_epoch][0]['pay_code_id'], TTUUID::getZeroID() );
		$this->assertEquals( $udt_arr[$date_epoch][0]['total_time'], ( 9 * 3600 ) );
		//Regular Time
		$this->assertEquals( 20, $udt_arr[$date_epoch][1]['object_type_id'] );                              //Regular Time
		$this->assertEquals( $udt_arr[$date_epoch][1]['pay_code_id'], $this->policy_ids['pay_code'][100] ); //Regular Time
		$this->assertEquals( $udt_arr[$date_epoch][1]['total_time'], ( 5700 ) );
		//Regular Time
		$this->assertEquals( 20, $udt_arr[$date_epoch][2]['object_type_id'] );                              //Regular Time
		$this->assertEquals( $udt_arr[$date_epoch][2]['pay_code_id'], $this->policy_ids['pay_code'][100] ); //Regular Time
		$this->assertEquals( $udt_arr[$date_epoch][2]['total_time'], ( 23100 ) );
		//Overtime2
		//This could be Daily >8 or Weekly >39 as they both apply at the exact same time.
		//However even though Daily OT has a lower calculation order and is calculated first, Weekly > 39 has a higher rate.
		//Which one should be used? Go with Daily OT for now as its calculated first and always needs to apply even after Weekly OT (ie: >12hrs)
		$this->assertEquals( 30, $udt_arr[$date_epoch][3]['object_type_id'] );                              //Overtime
		//$this->assertEquals( $udt_arr[$date_epoch][3]['pay_code_id'], $policy_ids['pay_code'][0] ); //Daily >8
		$this->assertEquals( $udt_arr[$date_epoch][3]['pay_code_id'], $policy_ids['pay_code'][2] );         //Weekly >39
		$this->assertEquals( $udt_arr[$date_epoch][3]['total_time'], ( 1 * 3600 ) );

		//Make sure no other hours
		$this->assertCount( 4, $udt_arr[$date_epoch] );

		return true;
	}

	/**
	 * @group OvertimePolicy_testDailyAndWeeklyOverTimePolicyE
	 */
	function testDailyAndWeeklyOverTimePolicyE() {
		//Test Daily and Weekly OT policies using the same pay code, as this causes problems for calculating weekly OT properly.
		global $dd;

		$policy_ids['pay_formula_policy'][] = $this->createPayFormulaPolicy( $this->company_id, 200 );      //OT1.5
		$policy_ids['pay_formula_policy'][] = $this->createPayFormulaPolicy( $this->company_id, 210 );      //OT2.0
		$policy_ids['pay_formula_policy'][] = $this->createPayFormulaPolicy( $this->company_id, 220 );      //OT2.5

		//Daily
		$policy_ids['pay_code'][] = $this->createPayCode( $this->company_id, 100, $policy_ids['pay_formula_policy'][0] );
		//$policy_ids['pay_code'][]  = $this->createPayCode( $this->company_id, 120, $policy_ids['pay_formula_policy'][2] );

		//Weekly
		$policy_ids['pay_code'][] = $this->createPayCode( $this->company_id, 240, $policy_ids['pay_formula_policy'][1] );

		$policy_ids['overtime'][] = $this->createOverTimePolicy( $this->company_id, 100, $this->policy_ids['contributing_shift_policy'][12], $policy_ids['pay_code'][0] );
		//$policy_ids['overtime'][] = $this->createOverTimePolicy( $this->company_id, 120, $this->policy_ids['contributing_shift_policy'][12], $policy_ids['pay_code'][1] );
		$policy_ids['overtime'][] = $this->createOverTimePolicy( $this->company_id, 242, $this->policy_ids['contributing_shift_policy'][12], $policy_ids['pay_code'][0] );

		//Create Policy Group
		$dd->createPolicyGroup( $this->company_id,
								null, //Meal
								null, //Exception
								null, //Holiday
								$policy_ids['overtime'], //OT
								null, //Premium
								null, //Round
								[ $this->user_id ], //Users
								null, //Break
								null, //Accrual
								null, //Expense
								null, //Absence
								[ $this->policy_ids['regular'][12] ] //Regular
		);


		$date_epoch = TTDate::getMiddleDayEpoch( TTDate::getBeginWeekEpoch( time() ) );
		$date_stamp = TTDate::getDate( 'DATE', $date_epoch );

		//
		//Day of Week: 1
		//
		$dd->createPunchPair( $this->user_id,
							  strtotime( $date_stamp . ' 8:00AM' ),
							  strtotime( $date_stamp . ' 6:00PM' ),
							  [
									  'in_type_id'    => 10,
									  'out_type_id'   => 10,
									  'branch_id'     => 0,
									  'department_id' => 0,
									  'job_id'        => 0,
									  'job_item_id'   => 0,
									  'punch_tag_id'  => []
							  ],
							  true
		);

		$udt_arr = $this->getUserDateTotalArray( $date_epoch, $date_epoch );
		//print_r($udt_arr);
		//Total Time
		$this->assertEquals( 5, $udt_arr[$date_epoch][0]['object_type_id'] );                               //5=System Total
		$this->assertEquals( $udt_arr[$date_epoch][0]['pay_code_id'], TTUUID::getZeroID() );
		$this->assertEquals( $udt_arr[$date_epoch][0]['total_time'], ( 10 * 3600 ) );
		//Regular Time
		$this->assertEquals( 20, $udt_arr[$date_epoch][1]['object_type_id'] );                              //Regular Time
		$this->assertEquals( $udt_arr[$date_epoch][1]['pay_code_id'], $this->policy_ids['pay_code'][100] ); //Regular Time
		$this->assertEquals( $udt_arr[$date_epoch][1]['total_time'], ( 8 * 3600 ) );
		//Overtime2
		$this->assertEquals( 30, $udt_arr[$date_epoch][2]['object_type_id'] );                              //Overtime
		$this->assertEquals( $udt_arr[$date_epoch][2]['pay_code_id'], $policy_ids['pay_code'][0] );
		$this->assertEquals( $udt_arr[$date_epoch][2]['total_time'], ( 2 * 3600 ) );
		//Make sure no other hours
		$this->assertCount( 3, $udt_arr[$date_epoch] );

		//
		//Day of Week: 2
		//
		$date_epoch = TTDate::incrementDate( TTDate::getMiddleDayEpoch( TTDate::getBeginWeekEpoch( time() ) ), 1, 'day' );
		$date_stamp = TTDate::getDate( 'DATE', $date_epoch );

		$dd->createPunchPair( $this->user_id,
							  strtotime( $date_stamp . ' 8:00AM' ),
							  strtotime( $date_stamp . ' 6:00PM' ),
							  [
									  'in_type_id'    => 10,
									  'out_type_id'   => 10,
									  'branch_id'     => 0,
									  'department_id' => 0,
									  'job_id'        => 0,
									  'job_item_id'   => 0,
									  'punch_tag_id'  => []
							  ],
							  true
		);

		$udt_arr = $this->getUserDateTotalArray( $date_epoch, $date_epoch );
		//Total Time
		$this->assertEquals( 5, $udt_arr[$date_epoch][0]['object_type_id'] );                               //5=System Total
		$this->assertEquals( $udt_arr[$date_epoch][0]['pay_code_id'], TTUUID::getZeroID() );
		$this->assertEquals( $udt_arr[$date_epoch][0]['total_time'], ( 10 * 3600 ) );
		//Regular Time
		$this->assertEquals( 20, $udt_arr[$date_epoch][1]['object_type_id'] );                              //Regular Time
		$this->assertEquals( $udt_arr[$date_epoch][1]['pay_code_id'], $this->policy_ids['pay_code'][100] ); //Regular Time
		$this->assertEquals( $udt_arr[$date_epoch][1]['total_time'], ( 8 * 3600 ) );
		//Overtime2
		$this->assertEquals( 30, $udt_arr[$date_epoch][2]['object_type_id'] );                              //Overtime
		$this->assertEquals( $udt_arr[$date_epoch][2]['pay_code_id'], $policy_ids['pay_code'][0] );
		$this->assertEquals( $udt_arr[$date_epoch][2]['total_time'], ( 2 * 3600 ) );
		//Make sure no other hours
		$this->assertCount( 3, $udt_arr[$date_epoch] );


		//
		//Day of Week: 3
		//
		$date_epoch = TTDate::incrementDate( TTDate::getMiddleDayEpoch( TTDate::getBeginWeekEpoch( time() ) ), 2, 'day' );
		$date_stamp = TTDate::getDate( 'DATE', $date_epoch );

		$dd->createPunchPair( $this->user_id,
							  strtotime( $date_stamp . ' 8:00AM' ),
							  strtotime( $date_stamp . ' 6:00PM' ),
							  [
									  'in_type_id'    => 10,
									  'out_type_id'   => 10,
									  'branch_id'     => 0,
									  'department_id' => 0,
									  'job_id'        => 0,
									  'job_item_id'   => 0,
									  'punch_tag_id'  => []
							  ],
							  true
		);

		$udt_arr = $this->getUserDateTotalArray( $date_epoch, $date_epoch );
		//Total Time
		$this->assertEquals( 5, $udt_arr[$date_epoch][0]['object_type_id'] );                               //5=System Total
		$this->assertEquals( $udt_arr[$date_epoch][0]['pay_code_id'], TTUUID::getZeroID() );
		$this->assertEquals( $udt_arr[$date_epoch][0]['total_time'], ( 10 * 3600 ) );
		//Regular Time
		$this->assertEquals( 20, $udt_arr[$date_epoch][1]['object_type_id'] );                              //Regular Time
		$this->assertEquals( $udt_arr[$date_epoch][1]['pay_code_id'], $this->policy_ids['pay_code'][100] ); //Regular Time
		$this->assertEquals( $udt_arr[$date_epoch][1]['total_time'], ( 8 * 3600 ) );
		//Overtime2
		$this->assertEquals( 30, $udt_arr[$date_epoch][2]['object_type_id'] );                              //Overtime
		$this->assertEquals( $udt_arr[$date_epoch][2]['pay_code_id'], $policy_ids['pay_code'][0] );
		$this->assertEquals( $udt_arr[$date_epoch][2]['total_time'], ( 2 * 3600 ) );
		//Make sure no other hours
		$this->assertCount( 3, $udt_arr[$date_epoch] );


		//
		//Day of Week: 4
		//
		$date_epoch = TTDate::incrementDate( TTDate::getMiddleDayEpoch( TTDate::getBeginWeekEpoch( time() ) ), 3, 'day' );
		$date_stamp = TTDate::getDate( 'DATE', $date_epoch );

		$dd->createPunchPair( $this->user_id,
							  strtotime( $date_stamp . ' 8:00AM' ),
							  strtotime( $date_stamp . ' 1:00PM' ),
							  [
									  'in_type_id'    => 10,
									  'out_type_id'   => 10,
									  'branch_id'     => 0,
									  'department_id' => 0,
									  'job_id'        => 0,
									  'job_item_id'   => 0,
									  'punch_tag_id'  => []
							  ],
							  true
		);

		$udt_arr = $this->getUserDateTotalArray( $date_epoch, $date_epoch );
		//print_r($udt_arr);
		//Total Time
		$this->assertEquals( 5, $udt_arr[$date_epoch][0]['object_type_id'] );                               //5=System Total
		$this->assertEquals( $udt_arr[$date_epoch][0]['pay_code_id'], TTUUID::getZeroID() );
		$this->assertEquals( $udt_arr[$date_epoch][0]['total_time'], ( 5 * 3600 ) );
		//Regular Time
		$this->assertEquals( 20, $udt_arr[$date_epoch][1]['object_type_id'] );                              //Regular Time
		$this->assertEquals( $udt_arr[$date_epoch][1]['pay_code_id'], $this->policy_ids['pay_code'][100] ); //Regular Time
		$this->assertEquals( $udt_arr[$date_epoch][1]['total_time'], ( 5 * 3600 ) );
		//Make sure no other hours
		$this->assertCount( 2, $udt_arr[$date_epoch] );


		//
		//Day of Week: 5
		//

		//
		//Test split shift where the first part of the shift doesn't cross into overtime and only the 2nd half does.
		//
		$date_epoch = TTDate::incrementDate( TTDate::getMiddleDayEpoch( TTDate::getBeginWeekEpoch( time() ) ), 4, 'day' );
		$date_stamp = TTDate::getDate( 'DATE', $date_epoch );

		$dd->createPunchPair( $this->user_id,
							  strtotime( $date_stamp . ' 8:00AM' ),
							  strtotime( $date_stamp . ' 12:00PM' ),
							  [
									  'in_type_id'    => 10,
									  'out_type_id'   => 10,
									  'branch_id'     => 0,
									  'department_id' => 0,
									  'job_id'        => 0,
									  'job_item_id'   => 0,
									  'punch_tag_id'  => []
							  ],
							  true
		);
		$dd->createPunchPair( $this->user_id,
							  strtotime( $date_stamp . ' 1:00PM' ),
							  strtotime( $date_stamp . ' 7:00PM' ),
							  [
									  'in_type_id'    => 10,
									  'out_type_id'   => 10,
									  'branch_id'     => 0,
									  'department_id' => 0,
									  'job_id'        => 0,
									  'job_item_id'   => 0,
									  'punch_tag_id'  => []
							  ],
							  true
		);

		$udt_arr = $this->getUserDateTotalArray( $date_epoch, $date_epoch );
		//print_r($udt_arr);
		//Total Time
		$this->assertEquals( 5, $udt_arr[$date_epoch][0]['object_type_id'] );                               //5=System Total
		$this->assertEquals( $udt_arr[$date_epoch][0]['pay_code_id'], TTUUID::getZeroID() );
		$this->assertEquals( $udt_arr[$date_epoch][0]['total_time'], ( 10 * 3600 ) );
		//Regular Time
		$this->assertEquals( 20, $udt_arr[$date_epoch][1]['object_type_id'] );                              //Regular Time
		$this->assertEquals( $udt_arr[$date_epoch][1]['pay_code_id'], $this->policy_ids['pay_code'][100] ); //Regular Time
		$this->assertEquals( $udt_arr[$date_epoch][1]['total_time'], ( 4 * 3600 ) );
		//Regular Time
		$this->assertEquals( 20, $udt_arr[$date_epoch][2]['object_type_id'] );                              //Regular Time
		$this->assertEquals( $udt_arr[$date_epoch][2]['pay_code_id'], $this->policy_ids['pay_code'][100] ); //Regular Time
		$this->assertEquals( $udt_arr[$date_epoch][2]['total_time'], ( 4 * 3600 ) );
		//Overtime2
		$this->assertEquals( 30, $udt_arr[$date_epoch][3]['object_type_id'] );                              //Overtime
		$this->assertEquals( $udt_arr[$date_epoch][3]['pay_code_id'], $policy_ids['pay_code'][0] );
		$this->assertEquals( $udt_arr[$date_epoch][3]['total_time'], ( 2 * 3600 ) );

		//Make sure no other hours
		$this->assertCount( 4, $udt_arr[$date_epoch] );

		return true;
	}

	/**
	 * @group OvertimePolicy_testDailyAndWeeklyOverTimePolicyE2
	 */
	function testDailyAndWeeklyOverTimePolicyE2() {
		//Test Daily and Weekly OT policies using the same pay code, as this causes problems for calculating weekly OT properly.
		// Also have the Weekly OT trigger on the same day that Daily OT, but after 10hrs.
		global $dd;

		$policy_ids['pay_formula_policy'][] = $this->createPayFormulaPolicy( $this->company_id, 200 ); //OT1.5

		$policy_ids['pay_code'][] = $this->createPayCode( $this->company_id, 100, $policy_ids['pay_formula_policy'][0] ); //OT

		$policy_ids['overtime'][] = $this->createOverTimePolicy( $this->company_id, 100, $this->policy_ids['contributing_shift_policy'][12], $policy_ids['pay_code'][0] ); //Daily
		$policy_ids['overtime'][] = $this->createOverTimePolicy( $this->company_id, 242, $this->policy_ids['contributing_shift_policy'][12], $policy_ids['pay_code'][0] ); //Weekly

		//Create Policy Group
		$dd->createPolicyGroup( $this->company_id,
								null, //Meal
								null, //Exception
								null, //Holiday
								$policy_ids['overtime'], //OT
								null, //Premium
								null, //Round
								[ $this->user_id ], //Users
								null, //Break
								null, //Accrual
								null, //Expense
								null, //Absence
								[ $this->policy_ids['regular'][12] ] //Regular
		);


		$date_epoch = TTDate::getMiddleDayEpoch( TTDate::getBeginWeekEpoch( time() ) );
		$date_stamp = TTDate::getDate( 'DATE', $date_epoch );

		//
		//Day of Week: 1
		//
		$dd->createPunchPair( $this->user_id,
							  strtotime( $date_stamp . ' 8:00AM' ),
							  strtotime( $date_stamp . ' 2:00PM' ),
							  [
									  'in_type_id'    => 10,
									  'out_type_id'   => 10,
									  'branch_id'     => 0,
									  'department_id' => 0,
									  'job_id'        => 0,
									  'job_item_id'   => 0,
									  'punch_tag_id'  => []
							  ],
							  true
		);

		$udt_arr = $this->getUserDateTotalArray( $date_epoch, $date_epoch );
		//print_r($udt_arr);
		//Total Time
		$this->assertEquals( 5, $udt_arr[$date_epoch][0]['object_type_id'] );                                                                                              //5=System Total
		$this->assertEquals( $udt_arr[$date_epoch][0]['pay_code_id'], TTUUID::getZeroID() );
		$this->assertEquals( $udt_arr[$date_epoch][0]['total_time'], ( 6 * 3600 ) );
		//Regular Time
		$this->assertEquals( 20, $udt_arr[$date_epoch][1]['object_type_id'] );                                                                                             //Regular Time
		$this->assertEquals( $udt_arr[$date_epoch][1]['pay_code_id'], $this->policy_ids['pay_code'][100] );                                                                //Regular Time
		$this->assertEquals( $udt_arr[$date_epoch][1]['total_time'], ( 6 * 3600 ) );
		//Make sure no other hours
		$this->assertCount( 2, $udt_arr[$date_epoch] );

		//
		//Day of Week: 2
		//
		$date_epoch = TTDate::incrementDate( TTDate::getMiddleDayEpoch( TTDate::getBeginWeekEpoch( time() ) ), 1, 'day' );
		$date_stamp = TTDate::getDate( 'DATE', $date_epoch );

		$dd->createPunchPair( $this->user_id,
							  strtotime( $date_stamp . ' 8:00AM' ),
							  strtotime( $date_stamp . ' 6:00PM' ),
							  [
									  'in_type_id'    => 10,
									  'out_type_id'   => 10,
									  'branch_id'     => 0,
									  'department_id' => 0,
									  'job_id'        => 0,
									  'job_item_id'   => 0,
									  'punch_tag_id'  => []
							  ],
							  true
		);

		$udt_arr = $this->getUserDateTotalArray( $date_epoch, $date_epoch );
		//Total Time
		$this->assertEquals( 5, $udt_arr[$date_epoch][0]['object_type_id'] );                                                                                              //5=System Total
		$this->assertEquals( $udt_arr[$date_epoch][0]['pay_code_id'], TTUUID::getZeroID() );
		$this->assertEquals( $udt_arr[$date_epoch][0]['total_time'], ( 10 * 3600 ) );
		//Regular Time
		$this->assertEquals( 20, $udt_arr[$date_epoch][1]['object_type_id'] );                                                                                             //Regular Time
		$this->assertEquals( $udt_arr[$date_epoch][1]['pay_code_id'], $this->policy_ids['pay_code'][100] );                                                                //Regular Time
		$this->assertEquals( $udt_arr[$date_epoch][1]['total_time'], ( 8 * 3600 ) );
		//Overtime2
		$this->assertEquals( 30, $udt_arr[$date_epoch][2]['object_type_id'] );                                                                                             //Overtime
		$this->assertEquals( $udt_arr[$date_epoch][2]['pay_code_id'], $policy_ids['pay_code'][0] );
		$this->assertEquals( $udt_arr[$date_epoch][2]['total_time'], ( 2 * 3600 ) );
		//Make sure no other hours
		$this->assertCount( 3, $udt_arr[$date_epoch] );


		//
		//Day of Week: 3
		//
		$date_epoch = TTDate::incrementDate( TTDate::getMiddleDayEpoch( TTDate::getBeginWeekEpoch( time() ) ), 2, 'day' );
		$date_stamp = TTDate::getDate( 'DATE', $date_epoch );

		$dd->createPunchPair( $this->user_id,
							  strtotime( $date_stamp . ' 8:00AM' ),
							  strtotime( $date_stamp . ' 6:00PM' ),
							  [
									  'in_type_id'    => 10,
									  'out_type_id'   => 10,
									  'branch_id'     => 0,
									  'department_id' => 0,
									  'job_id'        => 0,
									  'job_item_id'   => 0,
									  'punch_tag_id'  => []
							  ],
							  true
		);

		$udt_arr = $this->getUserDateTotalArray( $date_epoch, $date_epoch );
		//Total Time
		$this->assertEquals( 5, $udt_arr[$date_epoch][0]['object_type_id'] );                                                                                              //5=System Total
		$this->assertEquals( $udt_arr[$date_epoch][0]['pay_code_id'], TTUUID::getZeroID() );
		$this->assertEquals( $udt_arr[$date_epoch][0]['total_time'], ( 10 * 3600 ) );
		//Regular Time
		$this->assertEquals( 20, $udt_arr[$date_epoch][1]['object_type_id'] );                                                                                             //Regular Time
		$this->assertEquals( $udt_arr[$date_epoch][1]['pay_code_id'], $this->policy_ids['pay_code'][100] );                                                                //Regular Time
		$this->assertEquals( $udt_arr[$date_epoch][1]['total_time'], ( 8 * 3600 ) );
		//Overtime2
		$this->assertEquals( 30, $udt_arr[$date_epoch][2]['object_type_id'] );                                                                                             //Overtime
		$this->assertEquals( $udt_arr[$date_epoch][2]['pay_code_id'], $policy_ids['pay_code'][0] );
		$this->assertEquals( $udt_arr[$date_epoch][2]['total_time'], ( 2 * 3600 ) );
		//Make sure no other hours
		$this->assertCount( 3, $udt_arr[$date_epoch] );


		//
		//Day of Week: 4
		//
		$date_epoch = TTDate::incrementDate( TTDate::getMiddleDayEpoch( TTDate::getBeginWeekEpoch( time() ) ), 3, 'day' );
		$date_stamp = TTDate::getDate( 'DATE', $date_epoch );

		$dd->createPunchPair( $this->user_id,
							  strtotime( $date_stamp . ' 8:00AM' ),
							  strtotime( $date_stamp . ' 6:00PM' ),
							  [
									  'in_type_id'    => 10,
									  'out_type_id'   => 10,
									  'branch_id'     => 0,
									  'department_id' => 0,
									  'job_id'        => 0,
									  'job_item_id'   => 0,
									  'punch_tag_id'  => []
							  ],
							  true
		);

		$udt_arr = $this->getUserDateTotalArray( $date_epoch, $date_epoch );
		//Total Time
		$this->assertEquals( 5, $udt_arr[$date_epoch][0]['object_type_id'] );                                                                                              //5=System Total
		$this->assertEquals( $udt_arr[$date_epoch][0]['pay_code_id'], TTUUID::getZeroID() );
		$this->assertEquals( $udt_arr[$date_epoch][0]['total_time'], ( 10 * 3600 ) );
		//Regular Time
		$this->assertEquals( 20, $udt_arr[$date_epoch][1]['object_type_id'] );                                                                                             //Regular Time
		$this->assertEquals( $udt_arr[$date_epoch][1]['pay_code_id'], $this->policy_ids['pay_code'][100] );                                                                //Regular Time
		$this->assertEquals( $udt_arr[$date_epoch][1]['total_time'], ( 8 * 3600 ) );
		//Overtime2
		$this->assertEquals( 30, $udt_arr[$date_epoch][2]['object_type_id'] );                                                                                             //Overtime
		$this->assertEquals( $udt_arr[$date_epoch][2]['pay_code_id'], $policy_ids['pay_code'][0] );
		$this->assertEquals( $udt_arr[$date_epoch][2]['total_time'], ( 2 * 3600 ) );
		//Make sure no other hours
		$this->assertCount( 3, $udt_arr[$date_epoch] );


		//
		//Day of Week: 5
		//
		$date_epoch = TTDate::incrementDate( TTDate::getMiddleDayEpoch( TTDate::getBeginWeekEpoch( time() ) ), 4, 'day' );
		$date_stamp = TTDate::getDate( 'DATE', $date_epoch );

		$dd->createPunchPair( $this->user_id,
							  strtotime( $date_stamp . ' 8:00AM' ),
							  strtotime( $date_stamp . ' 8:00PM' ),
							  [
									  'in_type_id'    => 10,
									  'out_type_id'   => 10,
									  'branch_id'     => 0,
									  'department_id' => 0,
									  'job_id'        => 0,
									  'job_item_id'   => 0,
									  'punch_tag_id'  => []
							  ],
							  true
		);

		$udt_arr = $this->getUserDateTotalArray( $date_epoch, $date_epoch );
		//Total Time
		$this->assertEquals( 5, $udt_arr[$date_epoch][0]['object_type_id'] );                                                                                              //5=System Total
		$this->assertEquals( $udt_arr[$date_epoch][0]['pay_code_id'], TTUUID::getZeroID() );
		$this->assertEquals( $udt_arr[$date_epoch][0]['total_time'], ( 12 * 3600 ) );
		//Regular Time
		$this->assertEquals( 20, $udt_arr[$date_epoch][1]['object_type_id'] );                                                                                             //Regular Time
		$this->assertEquals( $udt_arr[$date_epoch][1]['pay_code_id'], $this->policy_ids['pay_code'][100] );                                                                //Regular Time
		$this->assertEquals( $udt_arr[$date_epoch][1]['total_time'], ( 8 * 3600 ) );
		//Overtime2
		$this->assertEquals( 30, $udt_arr[$date_epoch][2]['object_type_id'] );                                                                                             //Overtime
		$this->assertEquals( $udt_arr[$date_epoch][2]['pay_code_id'], $policy_ids['pay_code'][0] );
		$this->assertEquals( $udt_arr[$date_epoch][2]['total_time'], ( 4 * 3600 ) );
		//Make sure no other hours
		$this->assertCount( 3, $udt_arr[$date_epoch] );

		return true;
	}

	/**
	 * @group OvertimePolicy_testDailyAndWeeklyOverTimePolicyE3
	 */
	function testDailyAndWeeklyOverTimePolicyE3() {
		//Test Daily and Weekly OT policies using the same pay code, as this causes problems for calculating weekly OT properly.
		// Also have the Weekly OT trigger on the same day that Daily OT, but after 10hrs.
		global $dd;

		$policy_ids['pay_formula_policy'][] = $this->createPayFormulaPolicy( $this->company_id, 200 ); //OT1.5
//		$policy_ids['pay_formula_policy'][]  = $this->createPayFormulaPolicy( $this->company_id, 210 ); //OT1.5
//		$policy_ids['pay_formula_policy'][]  = $this->createPayFormulaPolicy( $this->company_id, 220 ); //OT2.5

		//Daily
		$policy_ids['pay_code'][] = $this->createPayCode( $this->company_id, 100, $policy_ids['pay_formula_policy'][0] );

		//Weekly
		//$policy_ids['pay_code'][]  = $this->createPayCode( $this->company_id, 240, $policy_ids['pay_formula_policy'][1] );

		$policy_ids['overtime'][] = $this->createOverTimePolicy( $this->company_id, 100, $this->policy_ids['contributing_shift_policy'][12], $policy_ids['pay_code'][0] ); //Daily
		$policy_ids['overtime'][] = $this->createOverTimePolicy( $this->company_id, 1000, $this->policy_ids['contributing_shift_policy'][12], $policy_ids['pay_code'][0] ); //Daily - Differential

		$policy_ids['overtime'][] = $this->createOverTimePolicy( $this->company_id, 242, $this->policy_ids['contributing_shift_policy'][12], $policy_ids['pay_code'][0] );  //Weekly
		$policy_ids['overtime'][] = $this->createOverTimePolicy( $this->company_id, 1250, $this->policy_ids['contributing_shift_policy'][12], $policy_ids['pay_code'][0] ); //Weekly - Differential

		//Create Policy Group
		$dd->createPolicyGroup( $this->company_id,
								null, //Meal
								null, //Exception
								null, //Holiday
								$policy_ids['overtime'], //OT
								null, //Premium
								null, //Round
								[ $this->user_id ], //Users
								null, //Break
								null, //Accrual
								null, //Expense
								null, //Absence
								[ $this->policy_ids['regular'][12] ] //Regular
		);


		$date_epoch = TTDate::getMiddleDayEpoch( TTDate::getBeginWeekEpoch( time() ) );
		$date_stamp = TTDate::getDate( 'DATE', $date_epoch );

		//
		//Day of Week: 1
		//
		$dd->createPunchPair( $this->user_id,
							  strtotime( $date_stamp . ' 8:00AM' ),
							  strtotime( $date_stamp . ' 2:00PM' ),
							  [
									  'in_type_id'    => 10,
									  'out_type_id'   => 10,
									  'branch_id'     => 0,
									  'department_id' => 0,
									  'job_id'        => 0,
									  'job_item_id'   => 0,
									  'punch_tag_id'  => []
							  ],
							  true
		);

		$udt_arr = $this->getUserDateTotalArray( $date_epoch, $date_epoch );
		//print_r($udt_arr);
		//Total Time
		$this->assertEquals( 5, $udt_arr[$date_epoch][0]['object_type_id'] );                                                                                               //5=System Total
		$this->assertEquals( $udt_arr[$date_epoch][0]['pay_code_id'], TTUUID::getZeroID() );
		$this->assertEquals( $udt_arr[$date_epoch][0]['total_time'], ( 6 * 3600 ) );
		//Regular Time
		$this->assertEquals( 20, $udt_arr[$date_epoch][1]['object_type_id'] );                                                                                              //Regular Time
		$this->assertEquals( $udt_arr[$date_epoch][1]['pay_code_id'], $this->policy_ids['pay_code'][100] );                                                                 //Regular Time
		$this->assertEquals( $udt_arr[$date_epoch][1]['total_time'], ( 6 * 3600 ) );
		//Make sure no other hours
		$this->assertCount( 2, $udt_arr[$date_epoch] );

		//
		//Day of Week: 2
		//
		$date_epoch = TTDate::incrementDate( TTDate::getMiddleDayEpoch( TTDate::getBeginWeekEpoch( time() ) ), 1, 'day' );
		$date_stamp = TTDate::getDate( 'DATE', $date_epoch );

		$dd->createPunchPair( $this->user_id,
							  strtotime( $date_stamp . ' 8:00AM' ),
							  strtotime( $date_stamp . ' 6:00PM' ),
							  [
									  'in_type_id'    => 10,
									  'out_type_id'   => 10,
									  'branch_id'     => 0,
									  'department_id' => 0,
									  'job_id'        => 0,
									  'job_item_id'   => 0,
									  'punch_tag_id'  => []
							  ],
							  true
		);

		$udt_arr = $this->getUserDateTotalArray( $date_epoch, $date_epoch );
		//Total Time
		$this->assertEquals( 5, $udt_arr[$date_epoch][0]['object_type_id'] );                                                                                               //5=System Total
		$this->assertEquals( $udt_arr[$date_epoch][0]['pay_code_id'], TTUUID::getZeroID() );
		$this->assertEquals( $udt_arr[$date_epoch][0]['total_time'], ( 10 * 3600 ) );
		//Regular Time
		$this->assertEquals( 20, $udt_arr[$date_epoch][1]['object_type_id'] );                                                                                              //Regular Time
		$this->assertEquals( $udt_arr[$date_epoch][1]['pay_code_id'], $this->policy_ids['pay_code'][100] );                                                                 //Regular Time
		$this->assertEquals( $udt_arr[$date_epoch][1]['total_time'], ( 8 * 3600 ) );
		//Overtime2
		$this->assertEquals( 30, $udt_arr[$date_epoch][2]['object_type_id'] );                                                                                              //Overtime
		$this->assertEquals( $udt_arr[$date_epoch][2]['pay_code_id'], $policy_ids['pay_code'][0] );
		$this->assertEquals( $udt_arr[$date_epoch][2]['total_time'], ( 2 * 3600 ) );
		//Make sure no other hours
		$this->assertCount( 3, $udt_arr[$date_epoch] );


		//
		//Day of Week: 3
		//
		$date_epoch = TTDate::incrementDate( TTDate::getMiddleDayEpoch( TTDate::getBeginWeekEpoch( time() ) ), 2, 'day' );
		$date_stamp = TTDate::getDate( 'DATE', $date_epoch );

		$dd->createPunchPair( $this->user_id,
							  strtotime( $date_stamp . ' 8:00AM' ),
							  strtotime( $date_stamp . ' 6:00PM' ),
							  [
									  'in_type_id'    => 10,
									  'out_type_id'   => 10,
									  'branch_id'     => 0,
									  'department_id' => 0,
									  'job_id'        => 0,
									  'job_item_id'   => 0,
									  'punch_tag_id'  => []
							  ],
							  true
		);

		$udt_arr = $this->getUserDateTotalArray( $date_epoch, $date_epoch );
		//Total Time
		$this->assertEquals( 5, $udt_arr[$date_epoch][0]['object_type_id'] );                                                                                               //5=System Total
		$this->assertEquals( $udt_arr[$date_epoch][0]['pay_code_id'], TTUUID::getZeroID() );
		$this->assertEquals( $udt_arr[$date_epoch][0]['total_time'], ( 10 * 3600 ) );
		//Regular Time
		$this->assertEquals( 20, $udt_arr[$date_epoch][1]['object_type_id'] );                                                                                              //Regular Time
		$this->assertEquals( $udt_arr[$date_epoch][1]['pay_code_id'], $this->policy_ids['pay_code'][100] );                                                                 //Regular Time
		$this->assertEquals( $udt_arr[$date_epoch][1]['total_time'], ( 8 * 3600 ) );
		//Overtime2
		$this->assertEquals( 30, $udt_arr[$date_epoch][2]['object_type_id'] );                                                                                              //Overtime
		$this->assertEquals( $udt_arr[$date_epoch][2]['pay_code_id'], $policy_ids['pay_code'][0] );
		$this->assertEquals( $udt_arr[$date_epoch][2]['total_time'], ( 2 * 3600 ) );
		//Make sure no other hours
		$this->assertCount( 3, $udt_arr[$date_epoch] );


		//
		//Day of Week: 4
		//
		$date_epoch = TTDate::incrementDate( TTDate::getMiddleDayEpoch( TTDate::getBeginWeekEpoch( time() ) ), 3, 'day' );
		$date_stamp = TTDate::getDate( 'DATE', $date_epoch );

		$dd->createPunchPair( $this->user_id,
							  strtotime( $date_stamp . ' 8:00AM' ),
							  strtotime( $date_stamp . ' 6:00PM' ),
							  [
									  'in_type_id'    => 10,
									  'out_type_id'   => 10,
									  'branch_id'     => 0,
									  'department_id' => 0,
									  'job_id'        => 0,
									  'job_item_id'   => 0,
									  'punch_tag_id'  => []
							  ],
							  true
		);

		$udt_arr = $this->getUserDateTotalArray( $date_epoch, $date_epoch );
		//Total Time
		$this->assertEquals( 5, $udt_arr[$date_epoch][0]['object_type_id'] );                                                                                               //5=System Total
		$this->assertEquals( $udt_arr[$date_epoch][0]['pay_code_id'], TTUUID::getZeroID() );
		$this->assertEquals( $udt_arr[$date_epoch][0]['total_time'], ( 10 * 3600 ) );
		//Regular Time
		$this->assertEquals( 20, $udt_arr[$date_epoch][1]['object_type_id'] );                                                                                              //Regular Time
		$this->assertEquals( $udt_arr[$date_epoch][1]['pay_code_id'], $this->policy_ids['pay_code'][100] );                                                                 //Regular Time
		$this->assertEquals( $udt_arr[$date_epoch][1]['total_time'], ( 8 * 3600 ) );
		//Overtime2
		$this->assertEquals( 30, $udt_arr[$date_epoch][2]['object_type_id'] );                                                                                              //Overtime
		$this->assertEquals( $udt_arr[$date_epoch][2]['pay_code_id'], $policy_ids['pay_code'][0] );
		$this->assertEquals( $udt_arr[$date_epoch][2]['total_time'], ( 2 * 3600 ) );
		//Make sure no other hours
		$this->assertCount( 3, $udt_arr[$date_epoch] );


		//
		//Day of Week: 5
		//
		$date_epoch = TTDate::incrementDate( TTDate::getMiddleDayEpoch( TTDate::getBeginWeekEpoch( time() ) ), 4, 'day' );
		$date_stamp = TTDate::getDate( 'DATE', $date_epoch );

		$dd->createPunchPair( $this->user_id,
							  strtotime( $date_stamp . ' 8:00AM' ),
							  strtotime( $date_stamp . ' 7:00PM' ),
							  [
									  'in_type_id'    => 10,
									  'out_type_id'   => 10,
									  'branch_id'     => 0,
									  'department_id' => 0,
									  'job_id'        => 0,
									  'job_item_id'   => 0,
									  'punch_tag_id'  => []
							  ],
							  true
		);

		$udt_arr = $this->getUserDateTotalArray( $date_epoch, $date_epoch );
		//Total Time
		$this->assertEquals( 5, $udt_arr[$date_epoch][0]['object_type_id'] );                                                                                               //5=System Total
		$this->assertEquals( $udt_arr[$date_epoch][0]['pay_code_id'], TTUUID::getZeroID() );
		$this->assertEquals( $udt_arr[$date_epoch][0]['total_time'], ( 11 * 3600 ) );
		//Regular Time
		$this->assertEquals( 20, $udt_arr[$date_epoch][1]['object_type_id'] );                                                                                              //Regular Time
		$this->assertEquals( $udt_arr[$date_epoch][1]['pay_code_id'], $this->policy_ids['pay_code'][100] );                                                                 //Regular Time
		$this->assertEquals( $udt_arr[$date_epoch][1]['total_time'], ( 8 * 3600 ) );
		//Overtime2
		$this->assertEquals( 30, $udt_arr[$date_epoch][2]['object_type_id'] );                                                                                              //Overtime
		$this->assertEquals( $udt_arr[$date_epoch][2]['pay_code_id'], $policy_ids['pay_code'][0] );
		$this->assertEquals( $udt_arr[$date_epoch][2]['total_time'], ( 3 * 3600 ) );
		//Make sure no other hours
		$this->assertCount( 3, $udt_arr[$date_epoch] );

		return true;
	}

	/**
	 * @group OvertimePolicy_testDailyAndWeeklyOverTimePolicyF
	 */
	function testDailyAndWeeklyOverTimePolicyF() {
		//Test cases where Weekly OT has a higher rate than Daily OT and therefore takes priority.
		//For example when there is Daily >8 @ 1.5x, Daily >12 @ 2.0x, and Weekly > 40 @ 1.5x and Weekly > 44 @ 2.0x
		global $dd;

		$policy_ids['pay_formula_policy'][] = $this->createPayFormulaPolicy( $this->company_id, 200 );      //OT1.5
		$policy_ids['pay_formula_policy'][] = $this->createPayFormulaPolicy( $this->company_id, 210 );      //OT2.0
		$policy_ids['pay_formula_policy'][] = $this->createPayFormulaPolicy( $this->company_id, 220 );      //OT2.5

		//Daily
		$policy_ids['pay_code'][] = $this->createPayCode( $this->company_id, 100, $policy_ids['pay_formula_policy'][0] );
		$policy_ids['pay_code'][] = $this->createPayCode( $this->company_id, 120, $policy_ids['pay_formula_policy'][2] );

		//Weekly
		$policy_ids['pay_code'][] = $this->createPayCode( $this->company_id, 240, $policy_ids['pay_formula_policy'][1] );

		$policy_ids['overtime'][] = $this->createOverTimePolicy( $this->company_id, 100, $this->policy_ids['contributing_shift_policy'][12], $policy_ids['pay_code'][0] );
		$policy_ids['overtime'][] = $this->createOverTimePolicy( $this->company_id, 120, $this->policy_ids['contributing_shift_policy'][12], $policy_ids['pay_code'][1] );
		$policy_ids['overtime'][] = $this->createOverTimePolicy( $this->company_id, 242, $this->policy_ids['contributing_shift_policy'][12], $policy_ids['pay_code'][2] );

		//Create Policy Group
		$dd->createPolicyGroup( $this->company_id,
								null, //Meal
								null, //Exception
								null, //Holiday
								$policy_ids['overtime'], //OT
								null, //Premium
								null, //Round
								[ $this->user_id ], //Users
								null, //Break
								null, //Accrual
								null, //Expense
								null, //Absence
								[ $this->policy_ids['regular'][12] ] //Regular
		);


		$date_epoch = TTDate::getMiddleDayEpoch( TTDate::getBeginWeekEpoch( time() ) );
		$date_stamp = TTDate::getDate( 'DATE', $date_epoch );

		//
		//Day of Week: 1
		//
		$dd->createPunchPair( $this->user_id,
							  strtotime( $date_stamp . ' 8:00AM' ),
							  strtotime( $date_stamp . ' 8:00PM' ),
							  [
									  'in_type_id'    => 10,
									  'out_type_id'   => 10,
									  'branch_id'     => 0,
									  'department_id' => 0,
									  'job_id'        => 0,
									  'job_item_id'   => 0,
									  'punch_tag_id'  => []
							  ],
							  true
		);

		$udt_arr = $this->getUserDateTotalArray( $date_epoch, $date_epoch );
		//print_r($udt_arr);
		//Total Time
		$this->assertEquals( 5, $udt_arr[$date_epoch][0]['object_type_id'] );                               //5=System Total
		$this->assertEquals( $udt_arr[$date_epoch][0]['pay_code_id'], TTUUID::getZeroID() );
		$this->assertEquals( $udt_arr[$date_epoch][0]['total_time'], ( 12 * 3600 ) );
		//Regular Time
		$this->assertEquals( 20, $udt_arr[$date_epoch][1]['object_type_id'] );                              //Regular Time
		$this->assertEquals( $udt_arr[$date_epoch][1]['pay_code_id'], $this->policy_ids['pay_code'][100] ); //Regular Time
		$this->assertEquals( $udt_arr[$date_epoch][1]['total_time'], ( 8 * 3600 ) );
		//Overtime2
		$this->assertEquals( 30, $udt_arr[$date_epoch][3]['object_type_id'] );                              //Overtime
		$this->assertEquals( $udt_arr[$date_epoch][3]['pay_code_id'], $policy_ids['pay_code'][0] );
		$this->assertEquals( $udt_arr[$date_epoch][3]['total_time'], ( 2 * 3600 ) );
		//Overtime3
		$this->assertEquals( 30, $udt_arr[$date_epoch][2]['object_type_id'] );                              //Overtime
		$this->assertEquals( $udt_arr[$date_epoch][2]['pay_code_id'], $policy_ids['pay_code'][1] );
		$this->assertEquals( $udt_arr[$date_epoch][2]['total_time'], ( 2 * 3600 ) );
		//Make sure no other hours
		$this->assertCount( 4, $udt_arr[$date_epoch] );

		//
		//Day of Week: 2
		//
		$date_epoch = TTDate::incrementDate( TTDate::getMiddleDayEpoch( TTDate::getBeginWeekEpoch( time() ) ), 1, 'day' );
		$date_stamp = TTDate::getDate( 'DATE', $date_epoch );

		$dd->createPunchPair( $this->user_id,
							  strtotime( $date_stamp . ' 8:00AM' ),
							  strtotime( $date_stamp . ' 8:00PM' ),
							  [
									  'in_type_id'    => 10,
									  'out_type_id'   => 10,
									  'branch_id'     => 0,
									  'department_id' => 0,
									  'job_id'        => 0,
									  'job_item_id'   => 0,
									  'punch_tag_id'  => []
							  ],
							  true
		);

		$udt_arr = $this->getUserDateTotalArray( $date_epoch, $date_epoch );
		//Total Time
		$this->assertEquals( 5, $udt_arr[$date_epoch][0]['object_type_id'] );                               //5=System Total
		$this->assertEquals( $udt_arr[$date_epoch][0]['pay_code_id'], TTUUID::getZeroID() );
		$this->assertEquals( $udt_arr[$date_epoch][0]['total_time'], ( 12 * 3600 ) );
		//Regular Time
		$this->assertEquals( 20, $udt_arr[$date_epoch][1]['object_type_id'] );                              //Regular Time
		$this->assertEquals( $udt_arr[$date_epoch][1]['pay_code_id'], $this->policy_ids['pay_code'][100] ); //Regular Time
		$this->assertEquals( $udt_arr[$date_epoch][1]['total_time'], ( 8 * 3600 ) );
		//Overtime2
		$this->assertEquals( 30, $udt_arr[$date_epoch][3]['object_type_id'] );                              //Overtime
		$this->assertEquals( $udt_arr[$date_epoch][3]['pay_code_id'], $policy_ids['pay_code'][0] );
		$this->assertEquals( $udt_arr[$date_epoch][3]['total_time'], ( 2 * 3600 ) );
		//Overtime3
		$this->assertEquals( 30, $udt_arr[$date_epoch][2]['object_type_id'] );                              //Overtime
		$this->assertEquals( $udt_arr[$date_epoch][2]['pay_code_id'], $policy_ids['pay_code'][1] );
		$this->assertEquals( $udt_arr[$date_epoch][2]['total_time'], ( 2 * 3600 ) );
		//Make sure no other hours
		$this->assertCount( 4, $udt_arr[$date_epoch] );


		//
		//Day of Week: 3
		//
		$date_epoch = TTDate::incrementDate( TTDate::getMiddleDayEpoch( TTDate::getBeginWeekEpoch( time() ) ), 2, 'day' );
		$date_stamp = TTDate::getDate( 'DATE', $date_epoch );

		$dd->createPunchPair( $this->user_id,
							  strtotime( $date_stamp . ' 8:00AM' ),
							  strtotime( $date_stamp . ' 8:00PM' ),
							  [
									  'in_type_id'    => 10,
									  'out_type_id'   => 10,
									  'branch_id'     => 0,
									  'department_id' => 0,
									  'job_id'        => 0,
									  'job_item_id'   => 0,
									  'punch_tag_id'  => []
							  ],
							  true
		);

		$udt_arr = $this->getUserDateTotalArray( $date_epoch, $date_epoch );
		//Total Time
		$this->assertEquals( 5, $udt_arr[$date_epoch][0]['object_type_id'] );                               //5=System Total
		$this->assertEquals( $udt_arr[$date_epoch][0]['pay_code_id'], TTUUID::getZeroID() );
		$this->assertEquals( $udt_arr[$date_epoch][0]['total_time'], ( 12 * 3600 ) );
		//Regular Time
		$this->assertEquals( 20, $udt_arr[$date_epoch][1]['object_type_id'] );                              //Regular Time
		$this->assertEquals( $udt_arr[$date_epoch][1]['pay_code_id'], $this->policy_ids['pay_code'][100] ); //Regular Time
		$this->assertEquals( $udt_arr[$date_epoch][1]['total_time'], ( 8 * 3600 ) );
		//Overtime2
		$this->assertEquals( 30, $udt_arr[$date_epoch][3]['object_type_id'] );                              //Overtime
		$this->assertEquals( $udt_arr[$date_epoch][3]['pay_code_id'], $policy_ids['pay_code'][0] );
		$this->assertEquals( $udt_arr[$date_epoch][3]['total_time'], ( 2 * 3600 ) );
		//Overtime3
		$this->assertEquals( 30, $udt_arr[$date_epoch][2]['object_type_id'] );                              //Overtime
		$this->assertEquals( $udt_arr[$date_epoch][2]['pay_code_id'], $policy_ids['pay_code'][1] );
		$this->assertEquals( $udt_arr[$date_epoch][2]['total_time'], ( 2 * 3600 ) );
		//Make sure no other hours
		$this->assertCount( 4, $udt_arr[$date_epoch] );


		//
		//Day of Week: 4
		//
		$date_epoch = TTDate::incrementDate( TTDate::getMiddleDayEpoch( TTDate::getBeginWeekEpoch( time() ) ), 3, 'day' );
		$date_stamp = TTDate::getDate( 'DATE', $date_epoch );

		$dd->createPunchPair( $this->user_id,
							  strtotime( $date_stamp . ' 8:00AM' ),
							  strtotime( $date_stamp . ' 8:00PM' ),
							  [
									  'in_type_id'    => 10,
									  'out_type_id'   => 10,
									  'branch_id'     => 0,
									  'department_id' => 0,
									  'job_id'        => 0,
									  'job_item_id'   => 0,
									  'punch_tag_id'  => []
							  ],
							  true
		);

		$udt_arr = $this->getUserDateTotalArray( $date_epoch, $date_epoch );
		//print_r($udt_arr);
		//Total Time
		$this->assertEquals( 5, $udt_arr[$date_epoch][0]['object_type_id'] );                               //5=System Total
		$this->assertEquals( $udt_arr[$date_epoch][0]['pay_code_id'], TTUUID::getZeroID() );
		$this->assertEquals( $udt_arr[$date_epoch][0]['total_time'], ( 12 * 3600 ) );
		//Regular Time
		$this->assertEquals( 20, $udt_arr[$date_epoch][1]['object_type_id'] );                              //Regular Time
		$this->assertEquals( $udt_arr[$date_epoch][1]['pay_code_id'], $this->policy_ids['pay_code'][100] ); //Regular Time
		$this->assertEquals( $udt_arr[$date_epoch][1]['total_time'], ( 8 * 3600 ) );
		//Overtime2
		$this->assertEquals( 30, $udt_arr[$date_epoch][3]['object_type_id'] );                              //Overtime
		$this->assertEquals( $udt_arr[$date_epoch][3]['pay_code_id'], $policy_ids['pay_code'][0] );
		$this->assertEquals( $udt_arr[$date_epoch][3]['total_time'], ( 2 * 3600 ) );
		//Overtime3
		$this->assertEquals( 30, $udt_arr[$date_epoch][2]['object_type_id'] );                              //Overtime
		$this->assertEquals( $udt_arr[$date_epoch][2]['pay_code_id'], $policy_ids['pay_code'][1] );
		$this->assertEquals( $udt_arr[$date_epoch][2]['total_time'], ( 2 * 3600 ) );
		//Make sure no other hours
		$this->assertCount( 4, $udt_arr[$date_epoch] );


		//
		//Day of Week: 5
		//

		//
		//Test split shift where the first part of the shift doesn't cross into overtime and only the 2nd half does.
		//
		$date_epoch = TTDate::incrementDate( TTDate::getMiddleDayEpoch( TTDate::getBeginWeekEpoch( time() ) ), 4, 'day' );
		$date_stamp = TTDate::getDate( 'DATE', $date_epoch );

		$dd->createPunchPair( $this->user_id,
							  strtotime( $date_stamp . ' 9:35AM' ),
							  strtotime( $date_stamp . ' 11:10AM' ),
							  [
									  'in_type_id'    => 10,
									  'out_type_id'   => 10,
									  'branch_id'     => 0,
									  'department_id' => 0,
									  'job_id'        => 0,
									  'job_item_id'   => 0,
									  'punch_tag_id'  => []
							  ],
							  true
		);
		$dd->createPunchPair( $this->user_id,
							  strtotime( $date_stamp . ' 11:20AM' ),
							  strtotime( $date_stamp . ' 6:45PM' ),
							  [
									  'in_type_id'    => 10,
									  'out_type_id'   => 10,
									  'branch_id'     => 0,
									  'department_id' => 0,
									  'job_id'        => 0,
									  'job_item_id'   => 0,
									  'punch_tag_id'  => []
							  ],
							  true
		);

		$udt_arr = $this->getUserDateTotalArray( $date_epoch, $date_epoch );
		//print_r($udt_arr);
		//Total Time
		$this->assertEquals( 5, $udt_arr[$date_epoch][0]['object_type_id'] );                               //5=System Total
		$this->assertEquals( $udt_arr[$date_epoch][0]['pay_code_id'], TTUUID::getZeroID() );
		$this->assertEquals( $udt_arr[$date_epoch][0]['total_time'], ( 9 * 3600 ) );
		//Regular Time
		$this->assertEquals( 20, $udt_arr[$date_epoch][1]['object_type_id'] );                              //Regular Time
		$this->assertEquals( $udt_arr[$date_epoch][1]['pay_code_id'], $this->policy_ids['pay_code'][100] ); //Regular Time
		$this->assertEquals( $udt_arr[$date_epoch][1]['total_time'], ( 5700 ) );
		//Regular Time
		$this->assertEquals( 20, $udt_arr[$date_epoch][2]['object_type_id'] );                              //Regular Time
		$this->assertEquals( $udt_arr[$date_epoch][2]['pay_code_id'], $this->policy_ids['pay_code'][100] ); //Regular Time
		$this->assertEquals( $udt_arr[$date_epoch][2]['total_time'], ( 23100 ) );
		//Overtime2
		//This could be Daily >8 or Weekly >39 as they both apply at the exact same time.
		//However even though Daily OT has a lower calculation order and is calculated first, Weekly > 39 has a higher rate.
		//Which one should be used? Go with Daily OT for now as its calculated first and always needs to apply even after Weekly OT (ie: >12hrs)
		$this->assertEquals( 30, $udt_arr[$date_epoch][3]['object_type_id'] );                              //Overtime
		//$this->assertEquals( $udt_arr[$date_epoch][3]['pay_code_id'], $policy_ids['pay_code'][0] ); //Daily >8
		$this->assertEquals( $udt_arr[$date_epoch][3]['pay_code_id'], $policy_ids['pay_code'][2] );         //Weekly >39
		$this->assertEquals( $udt_arr[$date_epoch][3]['total_time'], ( 1 * 3600 ) );

		//Make sure no other hours
		$this->assertCount( 4, $udt_arr[$date_epoch] );

		//
		//Day of Week: 6
		//
		$date_epoch = TTDate::incrementDate( TTDate::getMiddleDayEpoch( TTDate::getBeginWeekEpoch( time() ) ), 5, 'day' );
		$date_stamp = TTDate::getDate( 'DATE', $date_epoch );

		$dd->createPunchPair( $this->user_id,
							  strtotime( $date_stamp . ' 8:00AM' ),
							  strtotime( $date_stamp . ' 8:00PM' ),
							  [
									  'in_type_id'    => 10,
									  'out_type_id'   => 10,
									  'branch_id'     => 0,
									  'department_id' => 0,
									  'job_id'        => 0,
									  'job_item_id'   => 0,
									  'punch_tag_id'  => []
							  ],
							  true
		);

		$udt_arr = $this->getUserDateTotalArray( $date_epoch, $date_epoch );
		//print_r($udt_arr);
		//Total Time
		$this->assertEquals( 5, $udt_arr[$date_epoch][0]['object_type_id'] );                               //5=System Total
		$this->assertEquals( $udt_arr[$date_epoch][0]['pay_code_id'], TTUUID::getZeroID() );
		$this->assertEquals( $udt_arr[$date_epoch][0]['total_time'], ( 12 * 3600 ) );
		//Overtime2
		$this->assertEquals( 30, $udt_arr[$date_epoch][2]['object_type_id'] );                              //Overtime
		$this->assertEquals( $udt_arr[$date_epoch][2]['pay_code_id'], $policy_ids['pay_code'][1] );
		$this->assertEquals( $udt_arr[$date_epoch][2]['total_time'], ( 2 * 3600 ) );
		//Overtime3
		$this->assertEquals( 30, $udt_arr[$date_epoch][1]['object_type_id'] );                              //Overtime
		$this->assertEquals( $udt_arr[$date_epoch][1]['pay_code_id'], $policy_ids['pay_code'][2] );
		$this->assertEquals( $udt_arr[$date_epoch][1]['total_time'], ( 10 * 3600 ) );
		//Make sure no other hours
		$this->assertCount( 3, $udt_arr[$date_epoch] );

		return true;
	}

	/**
	 * @group OvertimePolicy_testHolidayAndDailyAndWeeklyOverTimePolicyA
	 */
	function testHolidayAndDailyAndWeeklyOverTimePolicyA() {
		global $dd;

		$date_epoch = TTDate::getMiddleDayEpoch( TTDate::getBeginWeekEpoch( time() ) );
		$date_stamp = TTDate::getDate( 'DATE', $date_epoch );

		//Holiday
		$policy_ids['holiday'][] = $this->createHolidayPolicy( $this->company_id, 10 );
		$this->createHoliday( $this->company_id, 10, $date_epoch, $policy_ids['holiday'][0] );

		$policy_ids['pay_formula_policy'][] = $this->createPayFormulaPolicy( $this->company_id, 200 );      //OT1.5
		$policy_ids['pay_formula_policy'][] = $this->createPayFormulaPolicy( $this->company_id, 210 );      //OT2.0
		$policy_ids['pay_formula_policy'][] = $this->createPayFormulaPolicy( $this->company_id, 220 );      //OT2.5
		$policy_ids['pay_formula_policy'][] = $this->createPayFormulaPolicy( $this->company_id, 510 );      //OT4.0

		//Daily
		$policy_ids['pay_code'][] = $this->createPayCode( $this->company_id, 100, $policy_ids['pay_formula_policy'][0] );
		$policy_ids['pay_code'][] = $this->createPayCode( $this->company_id, 110, $policy_ids['pay_formula_policy'][1] );
		$policy_ids['pay_code'][] = $this->createPayCode( $this->company_id, 120, $policy_ids['pay_formula_policy'][2] );

		//Weekly
		$policy_ids['pay_code'][] = $this->createPayCode( $this->company_id, 230, $policy_ids['pay_formula_policy'][0] );
		$policy_ids['pay_code'][] = $this->createPayCode( $this->company_id, 240, $policy_ids['pay_formula_policy'][1] );
		$policy_ids['pay_code'][] = $this->createPayCode( $this->company_id, 250, $policy_ids['pay_formula_policy'][2] );

		//Holiday
		$policy_ids['pay_code'][] = $this->createPayCode( $this->company_id, 500, $policy_ids['pay_formula_policy'][3] );

		$policy_ids['overtime'][] = $this->createOverTimePolicy( $this->company_id, 100, $this->policy_ids['contributing_shift_policy'][12], $policy_ids['pay_code'][0] );
		$policy_ids['overtime'][] = $this->createOverTimePolicy( $this->company_id, 110, $this->policy_ids['contributing_shift_policy'][12], $policy_ids['pay_code'][1] );
		$policy_ids['overtime'][] = $this->createOverTimePolicy( $this->company_id, 120, $this->policy_ids['contributing_shift_policy'][12], $policy_ids['pay_code'][2] );

		$policy_ids['overtime'][] = $this->createOverTimePolicy( $this->company_id, 230, $this->policy_ids['contributing_shift_policy'][12], $policy_ids['pay_code'][3] );
		$policy_ids['overtime'][] = $this->createOverTimePolicy( $this->company_id, 240, $this->policy_ids['contributing_shift_policy'][12], $policy_ids['pay_code'][4] );
		$policy_ids['overtime'][] = $this->createOverTimePolicy( $this->company_id, 250, $this->policy_ids['contributing_shift_policy'][12], $policy_ids['pay_code'][5] );

		$policy_ids['overtime'][] = $this->createOverTimePolicy( $this->company_id, 500, $this->policy_ids['contributing_shift_policy'][12], $policy_ids['pay_code'][6] );

		//Create Policy Group
		$dd->createPolicyGroup( $this->company_id,
								null, //Meal
								null, //Exception
								$policy_ids['holiday'],
								$policy_ids['overtime'], //OT
								null, //Premium
								null, //Round
								[ $this->user_id ], //Users
								null, //Break
								null, //Accrual
								null, //Expense
								null, //Absence
								[ $this->policy_ids['regular'][12] ] //Regular
		);

		//
		//Day of Week: 1
		//
		$dd->createPunchPair( $this->user_id,
							  strtotime( $date_stamp . ' 8:00AM' ),
							  strtotime( $date_stamp . ' 8:00PM' ),
							  [
									  'in_type_id'    => 10,
									  'out_type_id'   => 10,
									  'branch_id'     => 0,
									  'department_id' => 0,
									  'job_id'        => 0,
									  'job_item_id'   => 0,
									  'punch_tag_id'  => []
							  ],
							  true
		);

		$udt_arr = $this->getUserDateTotalArray( $date_epoch, $date_epoch );
		//print_r($udt_arr);
		//Total Time
		$this->assertEquals( 5, $udt_arr[$date_epoch][0]['object_type_id'] );                               //5=System Total
		$this->assertEquals( $udt_arr[$date_epoch][0]['pay_code_id'], TTUUID::getZeroID() );
		$this->assertEquals( $udt_arr[$date_epoch][0]['total_time'], ( 12 * 3600 ) );

		//Since the Holiday OT rate is 4.0x, its higher than any other OT rate, so the employee should stay on holiday OT for the entire day.
		//Holiday OT
		$this->assertEquals( 30, $udt_arr[$date_epoch][1]['object_type_id'] );                              //Overtime
		$this->assertEquals( $udt_arr[$date_epoch][1]['pay_code_id'], $policy_ids['pay_code'][6] );
		$this->assertEquals( $udt_arr[$date_epoch][1]['total_time'], ( 12 * 3600 ) );

		//Holiday OT
		//$this->assertEquals( $udt_arr[$date_epoch][1]['object_type_id'], 30 ); //Overtime
		//$this->assertEquals( $udt_arr[$date_epoch][1]['pay_code_id'], $policy_ids['pay_code'][6] );
		//$this->assertEquals( $udt_arr[$date_epoch][1]['total_time'], (8*3600) );
		//Overtime 1
		//$this->assertEquals( $udt_arr[$date_epoch][4]['object_type_id'], 30 ); //Overtime
		//$this->assertEquals( $udt_arr[$date_epoch][4]['pay_code_id'], $policy_ids['pay_code'][0] );
		//$this->assertEquals( $udt_arr[$date_epoch][4]['total_time'], (1*3600) );
		//Overtime 2
		//$this->assertEquals( $udt_arr[$date_epoch][3]['object_type_id'], 30 ); //Overtime
		//$this->assertEquals( $udt_arr[$date_epoch][3]['pay_code_id'], $policy_ids['pay_code'][1] );
		//$this->assertEquals( $udt_arr[$date_epoch][3]['total_time'], (1*3600) );
		//Overtime 3
		//$this->assertEquals( $udt_arr[$date_epoch][2]['object_type_id'], 30 ); //Overtime
		//$this->assertEquals( $udt_arr[$date_epoch][2]['pay_code_id'], $policy_ids['pay_code'][2] );
		//$this->assertEquals( $udt_arr[$date_epoch][2]['total_time'], (2*3600) );

		//Make sure no other hours
		$this->assertCount( 2, $udt_arr[$date_epoch] );

		//
		//Day of Week: 2
		//
		$date_epoch = TTDate::incrementDate( TTDate::getMiddleDayEpoch( TTDate::getBeginWeekEpoch( time() ) ), 1, 'day' );
		$date_stamp = TTDate::getDate( 'DATE', $date_epoch );

		$dd->createPunchPair( $this->user_id,
							  strtotime( $date_stamp . ' 8:00AM' ),
							  strtotime( $date_stamp . ' 8:00PM' ),
							  [
									  'in_type_id'    => 10,
									  'out_type_id'   => 10,
									  'branch_id'     => 0,
									  'department_id' => 0,
									  'job_id'        => 0,
									  'job_item_id'   => 0,
									  'punch_tag_id'  => []
							  ],
							  true
		);

		$udt_arr = $this->getUserDateTotalArray( $date_epoch, $date_epoch );
		//Total Time
		$this->assertEquals( 5, $udt_arr[$date_epoch][0]['object_type_id'] );                               //5=System Total
		$this->assertEquals( $udt_arr[$date_epoch][0]['pay_code_id'], TTUUID::getZeroID() );
		$this->assertEquals( $udt_arr[$date_epoch][0]['total_time'], ( 12 * 3600 ) );
		//Regular Time
		$this->assertEquals( 20, $udt_arr[$date_epoch][1]['object_type_id'] );                              //Regular Time
		$this->assertEquals( $udt_arr[$date_epoch][1]['pay_code_id'], $this->policy_ids['pay_code'][100] ); //Regular Time
		$this->assertEquals( $udt_arr[$date_epoch][1]['total_time'], ( 8 * 3600 ) );
		//Overtime1
		$this->assertEquals( 30, $udt_arr[$date_epoch][4]['object_type_id'] );                              //Overtime
		$this->assertEquals( $udt_arr[$date_epoch][4]['pay_code_id'], $policy_ids['pay_code'][0] );
		$this->assertEquals( $udt_arr[$date_epoch][4]['total_time'], ( 1 * 3600 ) );
		//Overtime2
		$this->assertEquals( 30, $udt_arr[$date_epoch][3]['object_type_id'] );                              //Overtime
		$this->assertEquals( $udt_arr[$date_epoch][3]['pay_code_id'], $policy_ids['pay_code'][1] );
		$this->assertEquals( $udt_arr[$date_epoch][3]['total_time'], ( 1 * 3600 ) );
		//Overtime3
		$this->assertEquals( 30, $udt_arr[$date_epoch][2]['object_type_id'] );                              //Overtime
		$this->assertEquals( $udt_arr[$date_epoch][2]['pay_code_id'], $policy_ids['pay_code'][2] );
		$this->assertEquals( $udt_arr[$date_epoch][2]['total_time'], ( 2 * 3600 ) );
		//Make sure no other hours
		$this->assertCount( 5, $udt_arr[$date_epoch] );

		//
		//Day of Week: 3
		//
		$date_epoch = TTDate::incrementDate( TTDate::getMiddleDayEpoch( TTDate::getBeginWeekEpoch( time() ) ), 2, 'day' );
		$date_stamp = TTDate::getDate( 'DATE', $date_epoch );

		$dd->createPunchPair( $this->user_id,
							  strtotime( $date_stamp . ' 8:00AM' ),
							  strtotime( $date_stamp . ' 8:00PM' ),
							  [
									  'in_type_id'    => 10,
									  'out_type_id'   => 10,
									  'branch_id'     => 0,
									  'department_id' => 0,
									  'job_id'        => 0,
									  'job_item_id'   => 0,
									  'punch_tag_id'  => []
							  ],
							  true
		);

		$udt_arr = $this->getUserDateTotalArray( $date_epoch, $date_epoch );
		//Total Time
		$this->assertEquals( 5, $udt_arr[$date_epoch][0]['object_type_id'] );                               //5=System Total
		$this->assertEquals( $udt_arr[$date_epoch][0]['pay_code_id'], TTUUID::getZeroID() );
		$this->assertEquals( $udt_arr[$date_epoch][0]['total_time'], ( 12 * 3600 ) );
		//Regular Time
		$this->assertEquals( 20, $udt_arr[$date_epoch][1]['object_type_id'] );                              //Regular Time
		$this->assertEquals( $udt_arr[$date_epoch][1]['pay_code_id'], $this->policy_ids['pay_code'][100] ); //Regular Time
		$this->assertEquals( $udt_arr[$date_epoch][1]['total_time'], ( 8 * 3600 ) );
		//Overtime1
		$this->assertEquals( 30, $udt_arr[$date_epoch][4]['object_type_id'] );                              //Overtime
		$this->assertEquals( $udt_arr[$date_epoch][4]['pay_code_id'], $policy_ids['pay_code'][0] );
		$this->assertEquals( $udt_arr[$date_epoch][4]['total_time'], ( 1 * 3600 ) );
		//Overtime2
		$this->assertEquals( 30, $udt_arr[$date_epoch][3]['object_type_id'] );                              //Overtime
		$this->assertEquals( $udt_arr[$date_epoch][3]['pay_code_id'], $policy_ids['pay_code'][1] );
		$this->assertEquals( $udt_arr[$date_epoch][3]['total_time'], ( 1 * 3600 ) );
		//Overtime3
		$this->assertEquals( 30, $udt_arr[$date_epoch][2]['object_type_id'] );                              //Overtime
		$this->assertEquals( $udt_arr[$date_epoch][2]['pay_code_id'], $policy_ids['pay_code'][2] );
		$this->assertEquals( $udt_arr[$date_epoch][2]['total_time'], ( 2 * 3600 ) );
		//Make sure no other hours
		$this->assertCount( 5, $udt_arr[$date_epoch] );

		//
		//Day of Week: 4
		//
		$date_epoch = TTDate::incrementDate( TTDate::getMiddleDayEpoch( TTDate::getBeginWeekEpoch( time() ) ), 3, 'day' );
		$date_stamp = TTDate::getDate( 'DATE', $date_epoch );

		$dd->createPunchPair( $this->user_id,
							  strtotime( $date_stamp . ' 8:00AM' ),
							  strtotime( $date_stamp . ' 8:00PM' ),
							  [
									  'in_type_id'    => 10,
									  'out_type_id'   => 10,
									  'branch_id'     => 0,
									  'department_id' => 0,
									  'job_id'        => 0,
									  'job_item_id'   => 0,
									  'punch_tag_id'  => []
							  ],
							  true
		);

		$udt_arr = $this->getUserDateTotalArray( $date_epoch, $date_epoch );
		//print_r($udt_arr);
		//Total Time
		$this->assertEquals( 5, $udt_arr[$date_epoch][0]['object_type_id'] );                               //5=System Total
		$this->assertEquals( $udt_arr[$date_epoch][0]['pay_code_id'], TTUUID::getZeroID() );
		$this->assertEquals( $udt_arr[$date_epoch][0]['total_time'], ( 12 * 3600 ) );
		//Regular Time
		$this->assertEquals( 20, $udt_arr[$date_epoch][1]['object_type_id'] );                              //Regular Time
		$this->assertEquals( $udt_arr[$date_epoch][1]['pay_code_id'], $this->policy_ids['pay_code'][100] ); //Regular Time
		$this->assertEquals( $udt_arr[$date_epoch][1]['total_time'], ( 8 * 3600 ) );
		//Overtime1
		$this->assertEquals( 30, $udt_arr[$date_epoch][4]['object_type_id'] );                              //Overtime
		$this->assertEquals( $udt_arr[$date_epoch][4]['pay_code_id'], $policy_ids['pay_code'][0] );
		$this->assertEquals( $udt_arr[$date_epoch][4]['total_time'], ( 1 * 3600 ) );
		//Overtime2
		$this->assertEquals( 30, $udt_arr[$date_epoch][3]['object_type_id'] );                              //Overtime
		$this->assertEquals( $udt_arr[$date_epoch][3]['pay_code_id'], $policy_ids['pay_code'][1] );
		$this->assertEquals( $udt_arr[$date_epoch][3]['total_time'], ( 1 * 3600 ) );
		//Overtime3
		$this->assertEquals( 30, $udt_arr[$date_epoch][2]['object_type_id'] );                              //Overtime
		$this->assertEquals( $udt_arr[$date_epoch][2]['pay_code_id'], $policy_ids['pay_code'][2] );
		$this->assertEquals( $udt_arr[$date_epoch][2]['total_time'], ( 2 * 3600 ) );
		//Make sure no other hours
		$this->assertCount( 5, $udt_arr[$date_epoch] );

		//
		//Day of Week: 5
		//
		$date_epoch = TTDate::incrementDate( TTDate::getMiddleDayEpoch( TTDate::getBeginWeekEpoch( time() ) ), 4, 'day' );
		$date_stamp = TTDate::getDate( 'DATE', $date_epoch );

		$dd->createPunchPair( $this->user_id,
							  strtotime( $date_stamp . ' 8:00AM' ),
							  strtotime( $date_stamp . ' 8:00PM' ),
							  [
									  'in_type_id'    => 10,
									  'out_type_id'   => 10,
									  'branch_id'     => 0,
									  'department_id' => 0,
									  'job_id'        => 0,
									  'job_item_id'   => 0,
									  'punch_tag_id'  => []
							  ],
							  true
		);

		$udt_arr = $this->getUserDateTotalArray( $date_epoch, $date_epoch );
		//print_r($udt_arr);
		//Total Time
		$this->assertEquals( 5, $udt_arr[$date_epoch][0]['object_type_id'] );                               //5=System Total
		$this->assertEquals( $udt_arr[$date_epoch][0]['pay_code_id'], TTUUID::getZeroID() );
		$this->assertEquals( $udt_arr[$date_epoch][0]['total_time'], ( 12 * 3600 ) );
		//Regular Time
		$this->assertEquals( 20, $udt_arr[$date_epoch][1]['object_type_id'] );                              //Regular Time
		$this->assertEquals( $udt_arr[$date_epoch][1]['pay_code_id'], $this->policy_ids['pay_code'][100] ); //Regular Time
		$this->assertEquals( $udt_arr[$date_epoch][1]['total_time'], ( 7 * 3600 ) );
		//Weekly Overtime 1
		$this->assertEquals( 30, $udt_arr[$date_epoch][2]['object_type_id'] );                              //Overtime
		$this->assertEquals( $udt_arr[$date_epoch][2]['pay_code_id'], $policy_ids['pay_code'][3] );
		$this->assertEquals( $udt_arr[$date_epoch][2]['total_time'], ( 1 * 3600 ) );
		//Overtime1
		$this->assertEquals( 30, $udt_arr[$date_epoch][5]['object_type_id'] );                              //Overtime
		$this->assertEquals( $udt_arr[$date_epoch][5]['pay_code_id'], $policy_ids['pay_code'][0] );
		$this->assertEquals( $udt_arr[$date_epoch][5]['total_time'], ( 1 * 3600 ) );
		//Overtime2
		$this->assertEquals( 30, $udt_arr[$date_epoch][4]['object_type_id'] );                              //Overtime
		$this->assertEquals( $udt_arr[$date_epoch][4]['pay_code_id'], $policy_ids['pay_code'][1] );
		$this->assertEquals( $udt_arr[$date_epoch][4]['total_time'], ( 1 * 3600 ) );
		//Overtime3
		$this->assertEquals( 30, $udt_arr[$date_epoch][3]['object_type_id'] );                              //Overtime
		$this->assertEquals( $udt_arr[$date_epoch][3]['pay_code_id'], $policy_ids['pay_code'][2] );
		$this->assertEquals( $udt_arr[$date_epoch][3]['total_time'], ( 2 * 3600 ) );
		//Make sure no other hours
		$this->assertCount( 6, $udt_arr[$date_epoch] );

		//
		//Day of Week: 6
		//
		$date_epoch = TTDate::incrementDate( TTDate::getMiddleDayEpoch( TTDate::getBeginWeekEpoch( time() ) ), 5, 'day' );
		$date_stamp = TTDate::getDate( 'DATE', $date_epoch );

		$dd->createPunchPair( $this->user_id,
							  strtotime( $date_stamp . ' 8:00AM' ),
							  strtotime( $date_stamp . ' 8:00PM' ),
							  [
									  'in_type_id'    => 10,
									  'out_type_id'   => 10,
									  'branch_id'     => 0,
									  'department_id' => 0,
									  'job_id'        => 0,
									  'job_item_id'   => 0,
									  'punch_tag_id'  => []
							  ],
							  true
		);

		$udt_arr = $this->getUserDateTotalArray( $date_epoch, $date_epoch );
		//print_r($udt_arr);
		//Total Time
		$this->assertEquals( 5, $udt_arr[$date_epoch][0]['object_type_id'] );                               //5=System Total
		$this->assertEquals( $udt_arr[$date_epoch][0]['pay_code_id'], TTUUID::getZeroID() );
		$this->assertEquals( $udt_arr[$date_epoch][0]['total_time'], ( 12 * 3600 ) );
		//Weekly Overtime1 >39
		$this->assertEquals( 30, $udt_arr[$date_epoch][1]['object_type_id'] );                              //Overtime
		$this->assertEquals( $udt_arr[$date_epoch][1]['pay_code_id'], $policy_ids['pay_code'][4] );
		$this->assertEquals( $udt_arr[$date_epoch][1]['total_time'], ( 2 * 3600 ) );
		//Weekly Overtime1 >31
		$this->assertEquals( 30, $udt_arr[$date_epoch][2]['object_type_id'] );                              //Overtime
		$this->assertEquals( $udt_arr[$date_epoch][2]['pay_code_id'], $policy_ids['pay_code'][3] );
		$this->assertEquals( $udt_arr[$date_epoch][2]['total_time'], ( 7 * 3600 ) );
		//Overtime1
		//$this->assertEquals( $udt_arr[$date_epoch][5]['object_type_id'], 30 ); //Overtime
		//$this->assertEquals( $udt_arr[$date_epoch][5]['pay_code_id'], $policy_ids['pay_code'][0] );
		//$this->assertEquals( $udt_arr[$date_epoch][5]['total_time'], (1*3600) );
		//Overtime2
		$this->assertEquals( 30, $udt_arr[$date_epoch][4]['object_type_id'] );                              //Overtime
		$this->assertEquals( $udt_arr[$date_epoch][4]['pay_code_id'], $policy_ids['pay_code'][1] );
		$this->assertEquals( $udt_arr[$date_epoch][4]['total_time'], ( 1 * 3600 ) );
		//Overtime3
		$this->assertEquals( 30, $udt_arr[$date_epoch][3]['object_type_id'] );                              //Overtime
		$this->assertEquals( $udt_arr[$date_epoch][3]['pay_code_id'], $policy_ids['pay_code'][2] );
		$this->assertEquals( $udt_arr[$date_epoch][3]['total_time'], ( 2 * 3600 ) );
		//Make sure no other hours
		$this->assertCount( 5, $udt_arr[$date_epoch] );

		//
		//Day of Week: 7
		//
		$date_epoch = TTDate::incrementDate( TTDate::getMiddleDayEpoch( TTDate::getBeginWeekEpoch( time() ) ), 6, 'day' );
		$date_stamp = TTDate::getDate( 'DATE', $date_epoch );

		$dd->createPunchPair( $this->user_id,
							  strtotime( $date_stamp . ' 8:00AM' ),
							  strtotime( $date_stamp . ' 8:00PM' ),
							  [
									  'in_type_id'    => 10,
									  'out_type_id'   => 10,
									  'branch_id'     => 0,
									  'department_id' => 0,
									  'job_id'        => 0,
									  'job_item_id'   => 0,
									  'punch_tag_id'  => []
							  ],
							  true
		);

		$udt_arr = $this->getUserDateTotalArray( $date_epoch, $date_epoch );
		//print_r($udt_arr);
		//Total Time
		$this->assertEquals( 5, $udt_arr[$date_epoch][0]['object_type_id'] );                               //5=System Total
		$this->assertEquals( $udt_arr[$date_epoch][0]['pay_code_id'], TTUUID::getZeroID() );
		$this->assertEquals( $udt_arr[$date_epoch][0]['total_time'], ( 12 * 3600 ) );
		//Weekly Overtime 2 >47
		$this->assertEquals( 30, $udt_arr[$date_epoch][1]['object_type_id'] );                              //Overtime
		$this->assertEquals( $udt_arr[$date_epoch][1]['pay_code_id'], $policy_ids['pay_code'][5] );
		$this->assertEquals( $udt_arr[$date_epoch][1]['total_time'], ( 4 * 3600 ) );
		//Weekly Overtime 3 >39
		$this->assertEquals( 30, $udt_arr[$date_epoch][2]['object_type_id'] );                              //Overtime
		$this->assertEquals( $udt_arr[$date_epoch][2]['pay_code_id'], $policy_ids['pay_code'][4] );
		$this->assertEquals( $udt_arr[$date_epoch][2]['total_time'], ( 6 * 3600 ) );
		//Overtime1
		//$this->assertEquals( $udt_arr[$date_epoch][5]['object_type_id'], 30 ); //Overtime
		//$this->assertEquals( $udt_arr[$date_epoch][5]['pay_code_id'], $policy_ids['pay_code'][0] );
		//$this->assertEquals( $udt_arr[$date_epoch][5]['total_time'], (1*3600) );
		//Overtime2
		//$this->assertEquals( $udt_arr[$date_epoch][4]['object_type_id'], 30 ); //Overtime
		//$this->assertEquals( $udt_arr[$date_epoch][4]['pay_code_id'], $policy_ids['pay_code'][1] );
		//$this->assertEquals( $udt_arr[$date_epoch][4]['total_time'], (1*3600) );
		//Overtime3
		$this->assertEquals( 30, $udt_arr[$date_epoch][3]['object_type_id'] );                              //Overtime
		$this->assertEquals( $udt_arr[$date_epoch][3]['pay_code_id'], $policy_ids['pay_code'][2] );
		$this->assertEquals( $udt_arr[$date_epoch][3]['total_time'], ( 2 * 3600 ) );
		//Make sure no other hours
		$this->assertCount( 4, $udt_arr[$date_epoch] );

		return true;
	}

	/**
	 * @group OvertimePolicy_testHolidayOverTimePolicyA
	 */
	function testHolidayOverTimePolicyA() {
		global $dd;

		$date_epoch = TTDate::getMiddleDayEpoch( TTDate::getBeginWeekEpoch( time() ) );
		$date_stamp = TTDate::getDate( 'DATE', $date_epoch );

		//Holiday
		$policy_ids['holiday'][] = $this->createHolidayPolicy( $this->company_id, 10 );
		$this->createHoliday( $this->company_id, 10, $date_epoch, $policy_ids['holiday'][0] );

		$policy_ids['pay_formula_policy'][] = $this->createPayFormulaPolicy( $this->company_id, 200 ); //OT1.5
		$policy_ids['pay_formula_policy'][] = $this->createPayFormulaPolicy( $this->company_id, 210 ); //OT2.0
		$policy_ids['pay_formula_policy'][] = $this->createPayFormulaPolicy( $this->company_id, 220 ); //OT2.5
		//$policy_ids['pay_formula_policy'][]  = $this->createPayFormulaPolicy( $this->company_id, 510 ); //OT4.0

		//Daily
		$policy_ids['pay_code'][] = $this->createPayCode( $this->company_id, 100, $policy_ids['pay_formula_policy'][0] );
		$policy_ids['pay_code'][] = $this->createPayCode( $this->company_id, 110, $policy_ids['pay_formula_policy'][1] );
		$policy_ids['pay_code'][] = $this->createPayCode( $this->company_id, 120, $policy_ids['pay_formula_policy'][2] );

		//Holiday
		$policy_ids['pay_code'][] = $this->createPayCode( $this->company_id, 500, $policy_ids['pay_formula_policy'][0] );

		//$policy_ids['overtime'][] = $this->createOverTimePolicy( $this->company_id, 100, $this->policy_ids['contributing_shift_policy'][12], $policy_ids['pay_code'][0] );
		//$policy_ids['overtime'][] = $this->createOverTimePolicy( $this->company_id, 110, $this->policy_ids['contributing_shift_policy'][12], $policy_ids['pay_code'][1] );
		//$policy_ids['overtime'][] = $this->createOverTimePolicy( $this->company_id, 120, $this->policy_ids['contributing_shift_policy'][12], $policy_ids['pay_code'][2] );

		$policy_ids['overtime'][] = $this->createOverTimePolicy( $this->company_id, 510, $this->policy_ids['contributing_shift_policy'][12], $policy_ids['pay_code'][3] );

		//Create Policy Group
		$dd->createPolicyGroup( $this->company_id,
								null, //Meal
								null, //Exception
								$policy_ids['holiday'],
								$policy_ids['overtime'], //OT
								null, //Premium
								null, //Round
								[ $this->user_id ], //Users
								null, //Break
								null, //Accrual
								null, //Expense
								null, //Absence
								[ $this->policy_ids['regular'][12] ] //Regular
		);

		//
		//Day of Week: 1
		//
		$dd->createPunchPair( $this->user_id,
							  strtotime( $date_stamp . ' 8:00AM' ),
							  strtotime( $date_stamp . ' 8:00PM' ),
							  [
									  'in_type_id'    => 10,
									  'out_type_id'   => 10,
									  'branch_id'     => 0,
									  'department_id' => 0,
									  'job_id'        => 0,
									  'job_item_id'   => 0,
									  'punch_tag_id'  => []
							  ],
							  true
		);

		$udt_arr = $this->getUserDateTotalArray( $date_epoch, $date_epoch );
		//print_r($udt_arr);

		//Total Time
		$this->assertEquals( 5, $udt_arr[$date_epoch][0]['object_type_id'] );                          //5=System Total
		$this->assertEquals( $udt_arr[$date_epoch][0]['pay_code_id'], TTUUID::getZeroID() );
		$this->assertEquals( $udt_arr[$date_epoch][0]['total_time'], ( 12 * 3600 ) );
		$this->assertEquals( $udt_arr[$date_epoch][0]['start_time_stamp'], strtotime( $date_stamp . ' 8:00AM' ) );
		$this->assertEquals( $udt_arr[$date_epoch][0]['end_time_stamp'], strtotime( $date_stamp . ' 8:00PM' ) );

		//Holiday OT
		$this->assertEquals( 30, $udt_arr[$date_epoch][1]['object_type_id'] );                         //Overtime
		$this->assertEquals( $udt_arr[$date_epoch][1]['pay_code_id'], $policy_ids['pay_code'][3] );
		$this->assertEquals( $udt_arr[$date_epoch][1]['total_time'], ( 12 * 3600 ) );
		$this->assertEquals( $udt_arr[$date_epoch][1]['start_time_stamp'], strtotime( $date_stamp . ' 8:00AM' ) );
		$this->assertEquals( $udt_arr[$date_epoch][1]['end_time_stamp'], strtotime( $date_stamp . ' 8:00PM' ) );

		//Make sure no other hours
		$this->assertCount( 2, $udt_arr[$date_epoch] );

		return true;
	}

	/**
	 * @group OvertimePolicy_testHolidayOverTimePolicyB
	 */
	function testHolidayOverTimePolicyB() {
		global $dd;

		$date_epoch = TTDate::getMiddleDayEpoch( TTDate::getBeginWeekEpoch( time() ) );
		$date_stamp = TTDate::getDate( 'DATE', $date_epoch );

		//Holiday
		$policy_ids['holiday'][] = $this->createHolidayPolicy( $this->company_id, 10 );
		$this->createHoliday( $this->company_id, 10, $date_epoch, $policy_ids['holiday'][0] );

		$policy_ids['pay_formula_policy'][] = $this->createPayFormulaPolicy( $this->company_id, 200 ); //OT1.5
		$policy_ids['pay_formula_policy'][] = $this->createPayFormulaPolicy( $this->company_id, 210 ); //OT2.0
		$policy_ids['pay_formula_policy'][] = $this->createPayFormulaPolicy( $this->company_id, 220 ); //OT2.5
		//$policy_ids['pay_formula_policy'][]  = $this->createPayFormulaPolicy( $this->company_id, 510 ); //OT4.0

		//Daily
		$policy_ids['pay_code'][] = $this->createPayCode( $this->company_id, 100, $policy_ids['pay_formula_policy'][0] );
		$policy_ids['pay_code'][] = $this->createPayCode( $this->company_id, 110, $policy_ids['pay_formula_policy'][1] );
		$policy_ids['pay_code'][] = $this->createPayCode( $this->company_id, 120, $policy_ids['pay_formula_policy'][2] );

		//Holiday
		$policy_ids['pay_code'][] = $this->createPayCode( $this->company_id, 500, $policy_ids['pay_formula_policy'][0] );

		//$policy_ids['overtime'][] = $this->createOverTimePolicy( $this->company_id, 100, $this->policy_ids['contributing_shift_policy'][12], $policy_ids['pay_code'][0] );
		//$policy_ids['overtime'][] = $this->createOverTimePolicy( $this->company_id, 110, $this->policy_ids['contributing_shift_policy'][12], $policy_ids['pay_code'][1] );
		//$policy_ids['overtime'][] = $this->createOverTimePolicy( $this->company_id, 120, $this->policy_ids['contributing_shift_policy'][12], $policy_ids['pay_code'][2] );

		$policy_ids['overtime'][] = $this->createOverTimePolicy( $this->company_id, 510, $this->policy_ids['contributing_shift_policy'][12], $policy_ids['pay_code'][3] );

		//Create Policy Group
		$dd->createPolicyGroup( $this->company_id,
								null, //Meal
								null, //Exception
								$policy_ids['holiday'],
								$policy_ids['overtime'], //OT
								null, //Premium
								null, //Round
								[ $this->user_id ], //Users
								null, //Break
								null, //Accrual
								null, //Expense
								null, //Absence
								[ $this->policy_ids['regular'][12] ] //Regular
		);

		//
		//Day of Week: 1
		//
		$dd->createPunchPair( $this->user_id,
							  strtotime( $date_stamp . ' 8:00AM' ),
							  strtotime( $date_stamp . ' 12:15PM' ),
							  [
									  'in_type_id'    => 10,
									  'out_type_id'   => 20,
									  'branch_id'     => 0,
									  'department_id' => 0,
									  'job_id'        => 0,
									  'job_item_id'   => 0,
									  'punch_tag_id'  => []
							  ],
							  true
		);
		$dd->createPunchPair( $this->user_id,
							  strtotime( $date_stamp . ' 12:45PM' ),
							  strtotime( $date_stamp . ' 8:30PM' ),
							  [
									  'in_type_id'    => 20,
									  'out_type_id'   => 10,
									  'branch_id'     => 0,
									  'department_id' => 0,
									  'job_id'        => 0,
									  'job_item_id'   => 0,
									  'punch_tag_id'  => []
							  ],
							  true
		);

		$udt_arr = $this->getUserDateTotalArray( $date_epoch, $date_epoch );
		//print_r($udt_arr);

		//Total Time
		$this->assertEquals( 5, $udt_arr[$date_epoch][0]['object_type_id'] );                          //5=System Total
		$this->assertEquals( $udt_arr[$date_epoch][0]['pay_code_id'], TTUUID::getZeroID() );
		$this->assertEquals( $udt_arr[$date_epoch][0]['total_time'], ( 12 * 3600 ) );
		$this->assertEquals( $udt_arr[$date_epoch][0]['start_time_stamp'], strtotime( $date_stamp . ' 8:00AM' ) );
		$this->assertEquals( $udt_arr[$date_epoch][0]['end_time_stamp'], strtotime( $date_stamp . ' 8:30PM' ) );

		//Holiday OT
		$this->assertEquals( 30, $udt_arr[$date_epoch][1]['object_type_id'] );                         //Overtime
		$this->assertEquals( $udt_arr[$date_epoch][1]['pay_code_id'], $policy_ids['pay_code'][3] );
		$this->assertEquals( $udt_arr[$date_epoch][1]['total_time'], ( 4.25 * 3600 ) );
		$this->assertEquals( $udt_arr[$date_epoch][1]['start_time_stamp'], strtotime( $date_stamp . ' 8:00AM' ) );
		$this->assertEquals( $udt_arr[$date_epoch][1]['end_time_stamp'], strtotime( $date_stamp . ' 12:15PM' ) );

		$this->assertEquals( 30, $udt_arr[$date_epoch][2]['object_type_id'] ); //Overtime
		$this->assertEquals( $udt_arr[$date_epoch][2]['pay_code_id'], $policy_ids['pay_code'][3] );
		$this->assertEquals( $udt_arr[$date_epoch][2]['total_time'], ( 7.75 * 3600 ) );
		$this->assertEquals( $udt_arr[$date_epoch][2]['start_time_stamp'], strtotime( $date_stamp . ' 12:45PM' ) );
		$this->assertEquals( $udt_arr[$date_epoch][2]['end_time_stamp'], strtotime( $date_stamp . ' 8:30PM' ) );

		//Make sure no other hours
		$this->assertCount( 3, $udt_arr[$date_epoch] );

		return true;
	}

	/**
	 * @group OvertimePolicy_testHolidayOverTimePolicyC
	 */
	function testHolidayOverTimePolicyC() {
		global $dd;

		$date_epoch = TTDate::getMiddleDayEpoch( TTDate::getBeginWeekEpoch( time() ) );
		$date_stamp = TTDate::getDate( 'DATE', $date_epoch );

		//Holiday
		$policy_ids['holiday'][] = $this->createHolidayPolicy( $this->company_id, 10 );
		$this->createHoliday( $this->company_id, 10, $date_epoch, $policy_ids['holiday'][0] );

		$policy_ids['pay_formula_policy'][] = $this->createPayFormulaPolicy( $this->company_id, 200 ); //OT1.5
		$policy_ids['pay_formula_policy'][] = $this->createPayFormulaPolicy( $this->company_id, 210 ); //OT2.0
		$policy_ids['pay_formula_policy'][] = $this->createPayFormulaPolicy( $this->company_id, 220 ); //OT2.5
		//$policy_ids['pay_formula_policy'][]  = $this->createPayFormulaPolicy( $this->company_id, 510 ); //OT4.0

		//Daily
		$policy_ids['pay_code'][] = $this->createPayCode( $this->company_id, 100, $policy_ids['pay_formula_policy'][0] );
		$policy_ids['pay_code'][] = $this->createPayCode( $this->company_id, 110, $policy_ids['pay_formula_policy'][1] );
		$policy_ids['pay_code'][] = $this->createPayCode( $this->company_id, 120, $policy_ids['pay_formula_policy'][2] );

		//Holiday
		$policy_ids['pay_code'][] = $this->createPayCode( $this->company_id, 500, $policy_ids['pay_formula_policy'][0] );

		//$policy_ids['overtime'][] = $this->createOverTimePolicy( $this->company_id, 100, $this->policy_ids['contributing_shift_policy'][12], $policy_ids['pay_code'][0] );
		//$policy_ids['overtime'][] = $this->createOverTimePolicy( $this->company_id, 110, $this->policy_ids['contributing_shift_policy'][12], $policy_ids['pay_code'][1] );
		//$policy_ids['overtime'][] = $this->createOverTimePolicy( $this->company_id, 120, $this->policy_ids['contributing_shift_policy'][12], $policy_ids['pay_code'][2] );

		$policy_ids['overtime'][] = $this->createOverTimePolicy( $this->company_id, 510, $this->policy_ids['contributing_shift_policy'][12], $policy_ids['pay_code'][3] );

		//Create Policy Group
		$dd->createPolicyGroup( $this->company_id,
								null, //Meal
								null, //Exception
								$policy_ids['holiday'],
								$policy_ids['overtime'], //OT
								null, //Premium
								null, //Round
								[ $this->user_id ], //Users
								null, //Break
								null, //Accrual
								null, //Expense
								null, //Absence
								[ $this->policy_ids['regular'][12] ] //Regular
		);

		//
		//Day of Week: 1
		//
		$dd->createPunchPair( $this->user_id,
							  strtotime( $date_stamp . ' 8:00AM' ),
							  strtotime( $date_stamp . ' 12:15PM' ),
							  [
									  'in_type_id'    => 10,
									  'out_type_id'   => 20,
									  'branch_id'     => 0,
									  'department_id' => 0,
									  'job_id'        => 0,
									  'job_item_id'   => 0,
									  'punch_tag_id'  => []
							  ],
							  true
		);
		$dd->createPunchPair( $this->user_id,
							  strtotime( $date_stamp . ' 12:45PM' ),
							  strtotime( $date_stamp . ' 4:30PM' ),
							  [
									  'in_type_id'    => 10,
									  'out_type_id'   => 10,
									  'branch_id'     => 0,
									  'department_id' => 0,
									  'job_id'        => 0,
									  'job_item_id'   => 0,
									  'punch_tag_id'  => []
							  ],
							  true
		);
		$dd->createPunchPair( $this->user_id,
							  strtotime( $date_stamp . ' 5:00PM' ),
							  strtotime( $date_stamp . ' 9:00PM' ),
							  [
									  'in_type_id'    => 10,
									  'out_type_id'   => 10,
									  'branch_id'     => 0,
									  'department_id' => 0,
									  'job_id'        => 0,
									  'job_item_id'   => 0,
									  'punch_tag_id'  => []
							  ],
							  true
		);

		$udt_arr = $this->getUserDateTotalArray( $date_epoch, $date_epoch );
		//print_r($udt_arr);

		//Total Time
		$this->assertEquals( 5, $udt_arr[$date_epoch][0]['object_type_id'] );                          //5=System Total
		$this->assertEquals( $udt_arr[$date_epoch][0]['pay_code_id'], TTUUID::getZeroID() );
		$this->assertEquals( $udt_arr[$date_epoch][0]['total_time'], ( 12 * 3600 ) );
		$this->assertEquals( $udt_arr[$date_epoch][0]['start_time_stamp'], strtotime( $date_stamp . ' 8:00AM' ) );
		$this->assertEquals( $udt_arr[$date_epoch][0]['end_time_stamp'], strtotime( $date_stamp . ' 9:00PM' ) );

		//Holiday OT
		$this->assertEquals( 30, $udt_arr[$date_epoch][1]['object_type_id'] );                         //Overtime
		$this->assertEquals( $udt_arr[$date_epoch][1]['pay_code_id'], $policy_ids['pay_code'][3] );
		$this->assertEquals( $udt_arr[$date_epoch][1]['total_time'], ( 3.75 * 3600 ) );
		$this->assertEquals( $udt_arr[$date_epoch][1]['start_time_stamp'], strtotime( $date_stamp . ' 12:45PM' ) );
		$this->assertEquals( $udt_arr[$date_epoch][1]['end_time_stamp'], strtotime( $date_stamp . ' 4:30PM' ) );

		$this->assertEquals( 30, $udt_arr[$date_epoch][2]['object_type_id'] ); //Overtime
		$this->assertEquals( $udt_arr[$date_epoch][2]['pay_code_id'], $policy_ids['pay_code'][3] );
		$this->assertEquals( $udt_arr[$date_epoch][2]['total_time'], ( 4 * 3600 ) );
		$this->assertEquals( $udt_arr[$date_epoch][2]['start_time_stamp'], strtotime( $date_stamp . ' 5:00PM' ) );
		$this->assertEquals( $udt_arr[$date_epoch][2]['end_time_stamp'], strtotime( $date_stamp . ' 9:00PM' ) );

		$this->assertEquals( 30, $udt_arr[$date_epoch][3]['object_type_id'] ); //Overtime
		$this->assertEquals( $udt_arr[$date_epoch][3]['pay_code_id'], $policy_ids['pay_code'][3] );
		$this->assertEquals( $udt_arr[$date_epoch][3]['total_time'], ( 4.25 * 3600 ) );
		$this->assertEquals( $udt_arr[$date_epoch][3]['start_time_stamp'], strtotime( $date_stamp . ' 8:00AM' ) );
		$this->assertEquals( $udt_arr[$date_epoch][3]['end_time_stamp'], strtotime( $date_stamp . ' 12:15PM' ) );

		//Make sure no other hours
		$this->assertCount( 4, $udt_arr[$date_epoch] );

		return true;
	}

	/**
	 * @group OvertimePolicy_testHolidayAndDailyOverTimePolicyA
	 */
	function testHolidayAndDailyOverTimePolicyA() {
		global $dd;

		$date_epoch = TTDate::getMiddleDayEpoch( TTDate::getBeginWeekEpoch( time() ) );
		$date_stamp = TTDate::getDate( 'DATE', $date_epoch );

		//Holiday
		$policy_ids['holiday'][] = $this->createHolidayPolicy( $this->company_id, 10 );
		$this->createHoliday( $this->company_id, 10, $date_epoch, $policy_ids['holiday'][0] );

		$policy_ids['pay_formula_policy'][] = $this->createPayFormulaPolicy( $this->company_id, 200 ); //OT1.5
		$policy_ids['pay_formula_policy'][] = $this->createPayFormulaPolicy( $this->company_id, 210 ); //OT2.0
		$policy_ids['pay_formula_policy'][] = $this->createPayFormulaPolicy( $this->company_id, 220 ); //OT2.5
		//$policy_ids['pay_formula_policy'][]  = $this->createPayFormulaPolicy( $this->company_id, 510 ); //OT4.0

		//Daily
		$policy_ids['pay_code'][] = $this->createPayCode( $this->company_id, 100, $policy_ids['pay_formula_policy'][0] );
		$policy_ids['pay_code'][] = $this->createPayCode( $this->company_id, 110, $policy_ids['pay_formula_policy'][1] );
		$policy_ids['pay_code'][] = $this->createPayCode( $this->company_id, 120, $policy_ids['pay_formula_policy'][2] );

		//Holiday
		$policy_ids['pay_code'][] = $this->createPayCode( $this->company_id, 500, $policy_ids['pay_formula_policy'][0] );

		$policy_ids['overtime'][] = $this->createOverTimePolicy( $this->company_id, 100, $this->policy_ids['contributing_shift_policy'][12], $policy_ids['pay_code'][0] );
		$policy_ids['overtime'][] = $this->createOverTimePolicy( $this->company_id, 110, $this->policy_ids['contributing_shift_policy'][12], $policy_ids['pay_code'][1] );
		$policy_ids['overtime'][] = $this->createOverTimePolicy( $this->company_id, 120, $this->policy_ids['contributing_shift_policy'][12], $policy_ids['pay_code'][2] );

		$policy_ids['overtime'][] = $this->createOverTimePolicy( $this->company_id, 510, $this->policy_ids['contributing_shift_policy'][12], $policy_ids['pay_code'][3] );

		//Create Policy Group
		$dd->createPolicyGroup( $this->company_id,
								null, //Meal
								null, //Exception
								$policy_ids['holiday'],
								$policy_ids['overtime'], //OT
								null, //Premium
								null, //Round
								[ $this->user_id ], //Users
								null, //Break
								null, //Accrual
								null, //Expense
								null, //Absence
								[ $this->policy_ids['regular'][12] ] //Regular
		);

		//
		//Day of Week: 1
		//
		$dd->createPunchPair( $this->user_id,
							  strtotime( $date_stamp . ' 8:00AM' ),
							  strtotime( $date_stamp . ' 8:00PM' ),
							  [
									  'in_type_id'    => 10,
									  'out_type_id'   => 10,
									  'branch_id'     => 0,
									  'department_id' => 0,
									  'job_id'        => 0,
									  'job_item_id'   => 0,
									  'punch_tag_id'  => []
							  ],
							  true
		);

		$udt_arr = $this->getUserDateTotalArray( $date_epoch, $date_epoch );
		//print_r($udt_arr);

		//Total Time
		$this->assertEquals( 5, $udt_arr[$date_epoch][0]['object_type_id'] );                          //5=System Total
		$this->assertEquals( $udt_arr[$date_epoch][0]['pay_code_id'], TTUUID::getZeroID() );
		$this->assertEquals( $udt_arr[$date_epoch][0]['total_time'], ( 12 * 3600 ) );

		//Holiday OT: This is daily OT at 1.5x, so other OT at same or higher rates should still kick in after this.
		$this->assertEquals( 30, $udt_arr[$date_epoch][1]['object_type_id'] );                         //Overtime
		$this->assertEquals( $udt_arr[$date_epoch][1]['pay_code_id'], $policy_ids['pay_code'][3] );
		$this->assertEquals( $udt_arr[$date_epoch][1]['total_time'], ( 8 * 3600 ) );
		//Overtime 1 >8 (1.5x)
		$this->assertEquals( 30, $udt_arr[$date_epoch][4]['object_type_id'] );                         //Overtime
		$this->assertEquals( $udt_arr[$date_epoch][4]['pay_code_id'], $policy_ids['pay_code'][0] );
		$this->assertEquals( $udt_arr[$date_epoch][4]['total_time'], ( 1 * 3600 ) );
		//Overtime 2 >9 (@2.0x)
		$this->assertEquals( 30, $udt_arr[$date_epoch][3]['object_type_id'] );                         //Overtime
		$this->assertEquals( $udt_arr[$date_epoch][3]['pay_code_id'], $policy_ids['pay_code'][1] );
		$this->assertEquals( $udt_arr[$date_epoch][3]['total_time'], ( 1 * 3600 ) );
		//Overtime 3 >10 (@2.5x)
		$this->assertEquals( 30, $udt_arr[$date_epoch][2]['object_type_id'] );                         //Overtime
		$this->assertEquals( $udt_arr[$date_epoch][2]['pay_code_id'], $policy_ids['pay_code'][2] );
		$this->assertEquals( $udt_arr[$date_epoch][2]['total_time'], ( 2 * 3600 ) );
		//Make sure no other hours
		$this->assertCount( 5, $udt_arr[$date_epoch] );

		return true;
	}

	/**
	 * @group OvertimePolicy_testHolidayAndDailyOverTimePolicyB
	 */
	function testHolidayAndDailyOverTimePolicyB() {
		global $dd;

		$date_epoch = TTDate::getMiddleDayEpoch( TTDate::getBeginWeekEpoch( time() ) );
		$date_stamp = TTDate::getDate( 'DATE', $date_epoch );

		//Holiday
		$policy_ids['holiday'][] = $this->createHolidayPolicy( $this->company_id, 10 );
		$this->createHoliday( $this->company_id, 10, $date_epoch, $policy_ids['holiday'][0] );

		$policy_ids['pay_formula_policy'][] = $this->createPayFormulaPolicy( $this->company_id, 200 ); //OT1.5
		$policy_ids['pay_formula_policy'][] = $this->createPayFormulaPolicy( $this->company_id, 210 ); //OT2.0
		$policy_ids['pay_formula_policy'][] = $this->createPayFormulaPolicy( $this->company_id, 220 ); //OT2.5
		//$policy_ids['pay_formula_policy'][]  = $this->createPayFormulaPolicy( $this->company_id, 510 ); //OT4.0

		//Daily
		$policy_ids['pay_code'][] = $this->createPayCode( $this->company_id, 100, $policy_ids['pay_formula_policy'][0] );
		$policy_ids['pay_code'][] = $this->createPayCode( $this->company_id, 110, $policy_ids['pay_formula_policy'][1] );
		$policy_ids['pay_code'][] = $this->createPayCode( $this->company_id, 120, $policy_ids['pay_formula_policy'][2] );

		//Holiday
		$policy_ids['pay_code'][] = $this->createPayCode( $this->company_id, 500, $policy_ids['pay_formula_policy'][0] );

		$policy_ids['overtime'][] = $this->createOverTimePolicy( $this->company_id, 100, $this->policy_ids['contributing_shift_policy'][12], $policy_ids['pay_code'][0] );
		$policy_ids['overtime'][] = $this->createOverTimePolicy( $this->company_id, 110, $this->policy_ids['contributing_shift_policy'][12], $policy_ids['pay_code'][0] );
		$policy_ids['overtime'][] = $this->createOverTimePolicy( $this->company_id, 120, $this->policy_ids['contributing_shift_policy'][12], $policy_ids['pay_code'][0] );

		$policy_ids['overtime'][] = $this->createOverTimePolicy( $this->company_id, 510, $this->policy_ids['contributing_shift_policy'][12], $policy_ids['pay_code'][3] );

		//Create Policy Group
		$dd->createPolicyGroup( $this->company_id,
								null, //Meal
								null, //Exception
								$policy_ids['holiday'],
								$policy_ids['overtime'], //OT
								null, //Premium
								null, //Round
								[ $this->user_id ], //Users
								null, //Break
								null, //Accrual
								null, //Expense
								null, //Absence
								[ $this->policy_ids['regular'][12] ] //Regular
		);

		//
		//Day of Week: 1
		//
		$dd->createPunchPair( $this->user_id,
							  strtotime( $date_stamp . ' 8:00AM' ),
							  strtotime( $date_stamp . ' 8:00PM' ),
							  [
									  'in_type_id'    => 10,
									  'out_type_id'   => 10,
									  'branch_id'     => 0,
									  'department_id' => 0,
									  'job_id'        => 0,
									  'job_item_id'   => 0,
									  'punch_tag_id'  => []
							  ],
							  true
		);

		$udt_arr = $this->getUserDateTotalArray( $date_epoch, $date_epoch );
		//print_r($udt_arr);

		//Total Time
		$this->assertEquals( 5, $udt_arr[$date_epoch][0]['object_type_id'] );                          //5=System Total
		$this->assertEquals( $udt_arr[$date_epoch][0]['pay_code_id'], TTUUID::getZeroID() );
		$this->assertEquals( $udt_arr[$date_epoch][0]['total_time'], ( 12 * 3600 ) );

		//Holiday OT
		$this->assertEquals( 30, $udt_arr[$date_epoch][1]['object_type_id'] );                         //Overtime
		$this->assertEquals( $udt_arr[$date_epoch][1]['pay_code_id'], $policy_ids['pay_code'][3] );
		$this->assertEquals( $udt_arr[$date_epoch][1]['total_time'], ( 8 * 3600 ) );

		//Overtime 1 >8 (1.5x) [All Daily OT have same pay code]
		$this->assertEquals( 30, $udt_arr[$date_epoch][2]['object_type_id'] );                         //Overtime
		$this->assertEquals( $udt_arr[$date_epoch][2]['pay_code_id'], $policy_ids['pay_code'][0] );
		$this->assertEquals( $udt_arr[$date_epoch][2]['total_time'], ( 2 * 3600 ) );

		//Overtime 1 >8 (1.5x) [All Daily OT have same pay code] -- This was compacted out with compactUserDateTotalDataBasedOnTimeStamps()
		//$this->assertEquals( 30, $udt_arr[$date_epoch][3]['object_type_id'] );                         //Overtime
		//$this->assertEquals( $udt_arr[$date_epoch][3]['pay_code_id'], $policy_ids['pay_code'][0] );
		//$this->assertEquals( $udt_arr[$date_epoch][3]['total_time'], ( 1 * 3600 ) );

		//Overtime 1 >8 (1.5x) [All Daily OT have same pay code]
		$this->assertEquals( 30, $udt_arr[$date_epoch][3]['object_type_id'] );                         //Overtime
		$this->assertEquals( $udt_arr[$date_epoch][3]['pay_code_id'], $policy_ids['pay_code'][0] );
		$this->assertEquals( $udt_arr[$date_epoch][3]['total_time'], ( 2 * 3600 ) );

		//Make sure no other hours
		$this->assertCount( 4, $udt_arr[$date_epoch] );

		return true;
	}


	/**
	 * @group OvertimePolicy_testQuantityWithOverTimePolicy
	 */
	function testQuantityWithOverTimePolicy() {
		global $dd;

		$policy_ids['pay_formula_policy'][] = $this->createPayFormulaPolicy( $this->company_id, 200 );      //OT1.5
		$policy_ids['pay_formula_policy'][] = $this->createPayFormulaPolicy( $this->company_id, 210 );      //OT2.0
		$policy_ids['pay_formula_policy'][] = $this->createPayFormulaPolicy( $this->company_id, 220 );      //OT2.5

		//Daily
		$policy_ids['pay_code'][] = $this->createPayCode( $this->company_id, 100, $policy_ids['pay_formula_policy'][0] );
		$policy_ids['pay_code'][] = $this->createPayCode( $this->company_id, 110, $policy_ids['pay_formula_policy'][1] );
		$policy_ids['pay_code'][] = $this->createPayCode( $this->company_id, 120, $policy_ids['pay_formula_policy'][2] );

		//Weekly
		$policy_ids['pay_code'][] = $this->createPayCode( $this->company_id, 230, $policy_ids['pay_formula_policy'][0] );
		$policy_ids['pay_code'][] = $this->createPayCode( $this->company_id, 240, $policy_ids['pay_formula_policy'][1] );
		$policy_ids['pay_code'][] = $this->createPayCode( $this->company_id, 250, $policy_ids['pay_formula_policy'][2] );

		$policy_ids['overtime'][] = $this->createOverTimePolicy( $this->company_id, 100, $this->policy_ids['contributing_shift_policy'][12], $policy_ids['pay_code'][0] );
		$policy_ids['overtime'][] = $this->createOverTimePolicy( $this->company_id, 110, $this->policy_ids['contributing_shift_policy'][12], $policy_ids['pay_code'][1] );
		$policy_ids['overtime'][] = $this->createOverTimePolicy( $this->company_id, 120, $this->policy_ids['contributing_shift_policy'][12], $policy_ids['pay_code'][2] );

		$policy_ids['overtime'][] = $this->createOverTimePolicy( $this->company_id, 230, $this->policy_ids['contributing_shift_policy'][12], $policy_ids['pay_code'][3] );
		$policy_ids['overtime'][] = $this->createOverTimePolicy( $this->company_id, 240, $this->policy_ids['contributing_shift_policy'][12], $policy_ids['pay_code'][4] );
		$policy_ids['overtime'][] = $this->createOverTimePolicy( $this->company_id, 250, $this->policy_ids['contributing_shift_policy'][12], $policy_ids['pay_code'][5] );

		//Create Policy Group
		$dd->createPolicyGroup( $this->company_id,
								null, //Meal
								null, //Exception
								null, //Holiday
								$policy_ids['overtime'], //OT
								null, //Premium
								null, //Round
								[ $this->user_id ], //Users
								null, //Break
								null, //Accrual
								null, //Expense
								null, //Absence
								[ $this->policy_ids['regular'][12] ] //Regular
		);


		$date_epoch = TTDate::getMiddleDayEpoch( TTDate::getBeginWeekEpoch( time() ) );
		$date_stamp = TTDate::getDate( 'DATE', $date_epoch );

		//
		//Day of Week: 1
		//
		$dd->createPunchPair( $this->user_id,
							  strtotime( $date_stamp . ' 8:00AM' ),
							  strtotime( $date_stamp . ' 8:00PM' ),
							  [
									  'in_type_id'    => 10,
									  'out_type_id'   => 10,
									  'branch_id'     => 0,
									  'department_id' => 0,
									  'job_id'        => 0,
									  'job_item_id'   => 0,
									  'quantity'      => 13,
									  'bad_quantity'  => 3,
							  ],
							  true
		);

		$udt_arr = $this->getUserDateTotalArray( $date_epoch, $date_epoch );
		//print_r($udt_arr);
		//Total Time
		$this->assertEquals( 5, $udt_arr[$date_epoch][0]['object_type_id'] );                               //5=System Total
		$this->assertEquals( $udt_arr[$date_epoch][0]['pay_code_id'], TTUUID::getZeroID() );
		$this->assertEquals( $udt_arr[$date_epoch][0]['total_time'], ( 12 * 3600 ) );
		$this->assertEquals( 0, $udt_arr[$date_epoch][0]['quantity'] );
		$this->assertEquals( 0, $udt_arr[$date_epoch][0]['bad_quantity'] );
		//Regular Time
		$this->assertEquals( 20, $udt_arr[$date_epoch][1]['object_type_id'] );                              //Regular Time
		$this->assertEquals( $udt_arr[$date_epoch][1]['pay_code_id'], $this->policy_ids['pay_code'][100] ); //Regular Time
		$this->assertEquals( $udt_arr[$date_epoch][1]['total_time'], ( 8 * 3600 ) );
		$this->assertEquals( 8.67, $udt_arr[$date_epoch][1]['quantity'] );
		$this->assertEquals( 2, $udt_arr[$date_epoch][1]['bad_quantity'] );
		//Overtime1
		$this->assertEquals( 30, $udt_arr[$date_epoch][4]['object_type_id'] );                              //Overtime
		$this->assertEquals( $udt_arr[$date_epoch][4]['pay_code_id'], $policy_ids['pay_code'][0] );
		$this->assertEquals( $udt_arr[$date_epoch][4]['total_time'], ( 1 * 3600 ) );
		$this->assertEquals( 1.08, $udt_arr[$date_epoch][4]['quantity'] );
		$this->assertEquals( 0.25, $udt_arr[$date_epoch][4]['bad_quantity'] );
		//Overtime2
		$this->assertEquals( 30, $udt_arr[$date_epoch][3]['object_type_id'] );                              //Overtime
		$this->assertEquals( $udt_arr[$date_epoch][3]['pay_code_id'], $policy_ids['pay_code'][1] );
		$this->assertEquals( $udt_arr[$date_epoch][3]['total_time'], ( 1 * 3600 ) );
		$this->assertEquals( 1.08, $udt_arr[$date_epoch][3]['quantity'] );
		$this->assertEquals( 0.25, $udt_arr[$date_epoch][3]['bad_quantity'] );
		//Overtime3
		$this->assertEquals( 30, $udt_arr[$date_epoch][2]['object_type_id'] );                              //Overtime
		$this->assertEquals( $udt_arr[$date_epoch][2]['pay_code_id'], $policy_ids['pay_code'][2] );
		$this->assertEquals( $udt_arr[$date_epoch][2]['total_time'], ( 2 * 3600 ) );
		$this->assertEquals( 2.17, $udt_arr[$date_epoch][2]['quantity'] );
		$this->assertEquals( 0.5, $udt_arr[$date_epoch][2]['bad_quantity'] );

		$quantity_total = ( $udt_arr[$date_epoch][0]['quantity'] + $udt_arr[$date_epoch][1]['quantity'] + $udt_arr[$date_epoch][2]['quantity'] + $udt_arr[$date_epoch][3]['quantity'] + $udt_arr[$date_epoch][4]['quantity'] );
		$this->assertEquals( 13, $quantity_total );

		$bad_quantity_total = ( $udt_arr[$date_epoch][0]['bad_quantity'] + $udt_arr[$date_epoch][1]['bad_quantity'] + $udt_arr[$date_epoch][2]['bad_quantity'] + $udt_arr[$date_epoch][3]['bad_quantity'] + $udt_arr[$date_epoch][4]['bad_quantity'] );
		$this->assertEquals( 3, $bad_quantity_total );

		//Make sure no other hours
		$this->assertCount( 5, $udt_arr[$date_epoch] );

		//
		//Day of Week: 2
		//
		$date_epoch = TTDate::incrementDate( TTDate::getMiddleDayEpoch( TTDate::getBeginWeekEpoch( time() ) ), 1, 'day' );
		$date_stamp = TTDate::getDate( 'DATE', $date_epoch );

		$dd->createPunchPair( $this->user_id,
							  strtotime( $date_stamp . ' 8:00AM' ),
							  strtotime( $date_stamp . ' 8:05PM' ),
							  [
									  'in_type_id'    => 10,
									  'out_type_id'   => 10,
									  'branch_id'     => 0,
									  'department_id' => 0,
									  'job_id'        => 0,
									  'job_item_id'   => 0,
									  'punch_tag_id'  => [],
									  'quantity'      => 13,
									  'bad_quantity'  => 3,
							  ],
							  true
		);

		$udt_arr = $this->getUserDateTotalArray( $date_epoch, $date_epoch );
		//print_r($udt_arr);
		//Total Time
		$this->assertEquals( 5, $udt_arr[$date_epoch][0]['object_type_id'] );                               //5=System Total
		$this->assertEquals( $udt_arr[$date_epoch][0]['pay_code_id'], TTUUID::getZeroID() );
		$this->assertEquals( 43500, $udt_arr[$date_epoch][0]['total_time'] );
		$this->assertEquals( 0, $udt_arr[$date_epoch][0]['quantity'] );
		$this->assertEquals( 0, $udt_arr[$date_epoch][0]['bad_quantity'] );
		//Regular Time
		$this->assertEquals( 20, $udt_arr[$date_epoch][1]['object_type_id'] );                              //Regular Time
		$this->assertEquals( $udt_arr[$date_epoch][1]['pay_code_id'], $this->policy_ids['pay_code'][100] ); //Regular Time
		$this->assertEquals( $udt_arr[$date_epoch][1]['total_time'], ( 8 * 3600 ) );
		$this->assertEquals( 8.61, $udt_arr[$date_epoch][1]['quantity'] );
		$this->assertEquals( 1.99, $udt_arr[$date_epoch][1]['bad_quantity'] );
		//Overtime1
		$this->assertEquals( 30, $udt_arr[$date_epoch][4]['object_type_id'] );                              //Overtime
		$this->assertEquals( $udt_arr[$date_epoch][4]['pay_code_id'], $policy_ids['pay_code'][0] );
		$this->assertEquals( $udt_arr[$date_epoch][4]['total_time'], ( 1 * 3600 ) );
		$this->assertEquals( 1.08, $udt_arr[$date_epoch][4]['quantity'] );
		$this->assertEquals( 0.25, $udt_arr[$date_epoch][4]['bad_quantity'] );
		//Overtime2
		$this->assertEquals( 30, $udt_arr[$date_epoch][3]['object_type_id'] );                              //Overtime
		$this->assertEquals( $udt_arr[$date_epoch][3]['pay_code_id'], $policy_ids['pay_code'][1] );
		$this->assertEquals( $udt_arr[$date_epoch][3]['total_time'], ( 1 * 3600 ) );
		$this->assertEquals( 1.07, $udt_arr[$date_epoch][3]['quantity'] );
		$this->assertEquals( 0.25, $udt_arr[$date_epoch][3]['bad_quantity'] );
		//Overtime3
		$this->assertEquals( 30, $udt_arr[$date_epoch][2]['object_type_id'] );                              //Overtime
		$this->assertEquals( $udt_arr[$date_epoch][2]['pay_code_id'], $policy_ids['pay_code'][2] );
		$this->assertEquals( 7500, $udt_arr[$date_epoch][2]['total_time'] );
		$this->assertEquals( 2.24, $udt_arr[$date_epoch][2]['quantity'] );
		$this->assertEquals( 0.51, $udt_arr[$date_epoch][2]['bad_quantity'] );

		$quantity_total = ( $udt_arr[$date_epoch][0]['quantity'] + $udt_arr[$date_epoch][1]['quantity'] + $udt_arr[$date_epoch][2]['quantity'] + $udt_arr[$date_epoch][3]['quantity'] + $udt_arr[$date_epoch][4]['quantity'] );
		$this->assertEquals( 13, $quantity_total );

		$bad_quantity_total = ( $udt_arr[$date_epoch][0]['bad_quantity'] + $udt_arr[$date_epoch][1]['bad_quantity'] + $udt_arr[$date_epoch][2]['bad_quantity'] + $udt_arr[$date_epoch][3]['bad_quantity'] + $udt_arr[$date_epoch][4]['bad_quantity'] );
		$this->assertEquals( 3, $bad_quantity_total );

		//Make sure no other hours
		$this->assertCount( 5, $udt_arr[$date_epoch] );

		return true;
	}

	/**
	 * @group OvertimePolicy_testAutoDeductMealAndNoOverTimePolicyA
	 */
	function testAutoDeductMealAndNoOverTimePolicyA() {
		global $dd;

		$policy_ids['pay_formula_policy'][] = $this->createPayFormulaPolicy( $this->company_id, 200 ); //OT1.5
		$policy_ids['pay_formula_policy'][] = $this->createPayFormulaPolicy( $this->company_id, 210 ); //OT2.0
		$policy_ids['pay_formula_policy'][] = $this->createPayFormulaPolicy( $this->company_id, 220 ); //OT2.5

		$policy_ids['pay_code'][] = $this->createPayCode( $this->company_id, 100, $policy_ids['pay_formula_policy'][0] );
		$policy_ids['pay_code'][] = $this->createPayCode( $this->company_id, 110, $policy_ids['pay_formula_policy'][1] );
		$policy_ids['pay_code'][] = $this->createPayCode( $this->company_id, 120, $policy_ids['pay_formula_policy'][2] );
		$policy_ids['pay_code'][] = $this->createPayCode( $this->company_id, 190, $policy_ids['pay_formula_policy'][0] );

		$policy_ids['overtime'][] = $this->createOverTimePolicy( $this->company_id, 100, $this->policy_ids['contributing_shift_policy'][12], $policy_ids['pay_code'][0] );
		$policy_ids['overtime'][] = $this->createOverTimePolicy( $this->company_id, 110, $this->policy_ids['contributing_shift_policy'][12], $policy_ids['pay_code'][1] );
		$policy_ids['overtime'][] = $this->createOverTimePolicy( $this->company_id, 120, $this->policy_ids['contributing_shift_policy'][12], $policy_ids['pay_code'][2] );

		$policy_ids['meal'][] = $this->createMealPolicy( $this->company_id, 120 ); //AutoDeduct 1hr

		//Create Policy Group
		$dd->createPolicyGroup( $this->company_id,
								$policy_ids['meal'], //Meal
								null, //Exception
								null, //Holiday
								$policy_ids['overtime'], //OT
								null, //Premium
								null, //Round
								[ $this->user_id ], //Users
								null, //Break
								null, //Accrual
								null, //Expense
								null, //Absence
								[ $this->policy_ids['regular'][10] ] //Regular
		);

		$date_epoch = TTDate::getMiddleDayEpoch( TTDate::getBeginWeekEpoch( time() ) );
		$date_stamp = TTDate::getDate( 'DATE', $date_epoch );

		$dd->createPunchPair( $this->user_id,
							  strtotime( $date_stamp . ' 8:00AM' ),
							  strtotime( $date_stamp . ' 3:00PM' ),
							  [
									  'in_type_id'    => 10,
									  'out_type_id'   => 10,
									  'branch_id'     => 0,
									  'department_id' => 0,
									  'job_id'        => 0,
									  'job_item_id'   => 0,
									  'punch_tag_id'  => []
							  ],
							  true
		);

		$udt_arr = $this->getUserDateTotalArray( $date_epoch, $date_epoch );
		//print_r($udt_arr);

		//Total Time
		$this->assertEquals( 5, $udt_arr[$date_epoch][0]['object_type_id'] );      //5=System Total
		$this->assertEquals( $udt_arr[$date_epoch][0]['pay_code_id'], TTUUID::getZeroID() );
		$this->assertEquals( $udt_arr[$date_epoch][0]['total_time'], ( 7 * 3600 ) );                        //Unless meal/break time is deducted from Regular Time, the total should be the same as worked time.
		//Regular Time
		$this->assertEquals( 20, $udt_arr[$date_epoch][1]['object_type_id'] );                              //Regular Time
		$this->assertEquals( $udt_arr[$date_epoch][1]['pay_code_id'], $this->policy_ids['pay_code'][100] ); //Regular Time
		$this->assertEquals( $udt_arr[$date_epoch][1]['total_time'], ( 7 * 3600 ) );
		//Regular Time (AutoDeduct Lunch)
		$this->assertEquals( 100, $udt_arr[$date_epoch][2]['object_type_id'] );                             //Regular Time
		$this->assertEquals( $udt_arr[$date_epoch][2]['pay_code_id'], $this->policy_ids['pay_code'][190] ); //Lunch Time
		$this->assertEquals( $udt_arr[$date_epoch][2]['total_time'], ( -1 * 3600 ) );

		//Make sure no other hours
		$this->assertCount( 3, $udt_arr[$date_epoch] );

		return true;
	}

	/**
	 * @group OvertimePolicy_testAutoDeductMealAndNoOverTimePolicyB
	 */
	function testAutoDeductMealAndNoOverTimePolicyB() {
		global $dd;

		$policy_ids['pay_formula_policy'][] = $this->createPayFormulaPolicy( $this->company_id, 200 ); //OT1.5
		$policy_ids['pay_formula_policy'][] = $this->createPayFormulaPolicy( $this->company_id, 210 ); //OT2.0
		$policy_ids['pay_formula_policy'][] = $this->createPayFormulaPolicy( $this->company_id, 220 ); //OT2.5

		$policy_ids['pay_code'][] = $this->createPayCode( $this->company_id, 100, $policy_ids['pay_formula_policy'][0] );
		$policy_ids['pay_code'][] = $this->createPayCode( $this->company_id, 110, $policy_ids['pay_formula_policy'][1] );
		$policy_ids['pay_code'][] = $this->createPayCode( $this->company_id, 120, $policy_ids['pay_formula_policy'][2] );
		$policy_ids['pay_code'][] = $this->createPayCode( $this->company_id, 190, $policy_ids['pay_formula_policy'][0] );

		$policy_ids['overtime'][] = $this->createOverTimePolicy( $this->company_id, 100, $this->policy_ids['contributing_shift_policy'][12], $policy_ids['pay_code'][0] );
		$policy_ids['overtime'][] = $this->createOverTimePolicy( $this->company_id, 110, $this->policy_ids['contributing_shift_policy'][12], $policy_ids['pay_code'][1] );
		$policy_ids['overtime'][] = $this->createOverTimePolicy( $this->company_id, 120, $this->policy_ids['contributing_shift_policy'][12], $policy_ids['pay_code'][2] );

		$policy_ids['meal'][] = $this->createMealPolicy( $this->company_id, 120 ); //AutoDeduct 1hr

		//Create Policy Group
		$dd->createPolicyGroup( $this->company_id,
								$policy_ids['meal'], //Meal
								null, //Exception
								null, //Holiday
								$policy_ids['overtime'], //OT
								null, //Premium
								null, //Round
								[ $this->user_id ], //Users
								null, //Break
								null, //Accrual
								null, //Expense
								null, //Absence
								[ $this->policy_ids['regular'][10] ] //Regular
		);

		$date_epoch = TTDate::getMiddleDayEpoch( TTDate::getBeginWeekEpoch( time() ) );
		$date_stamp = TTDate::getDate( 'DATE', $date_epoch );

		$dd->createPunchPair( $this->user_id,
							  strtotime( $date_stamp . ' 8:00AM' ),
							  strtotime( $date_stamp . ' 5:00PM' ),
							  [
									  'in_type_id'    => 10,
									  'out_type_id'   => 10,
									  'branch_id'     => 0,
									  'department_id' => 0,
									  'job_id'        => 0,
									  'job_item_id'   => 0,
									  'punch_tag_id'  => []
							  ],
							  true
		);

		$udt_arr = $this->getUserDateTotalArray( $date_epoch, $date_epoch );
		//print_r($udt_arr);

		//Total Time
		$this->assertEquals( 5, $udt_arr[$date_epoch][0]['object_type_id'] );      //5=System Total
		$this->assertEquals( $udt_arr[$date_epoch][0]['pay_code_id'], TTUUID::getZeroID() );
		$this->assertEquals( $udt_arr[$date_epoch][0]['total_time'], ( 9 * 3600 ) );                        //Unless meal/break time is deducted from Regular Time, the total should be the same as worked time.
		//Regular Time
		$this->assertEquals( 20, $udt_arr[$date_epoch][1]['object_type_id'] );                              //Regular Time
		$this->assertEquals( $udt_arr[$date_epoch][1]['pay_code_id'], $this->policy_ids['pay_code'][100] ); //Regular Time
		$this->assertEquals( $udt_arr[$date_epoch][1]['total_time'], ( 9 * 3600 ) );
		//Regular Time (AutoDeduct Lunch)
		$this->assertEquals( 100, $udt_arr[$date_epoch][2]['object_type_id'] );                             //Regular Time
		$this->assertEquals( $udt_arr[$date_epoch][2]['pay_code_id'], $this->policy_ids['pay_code'][190] ); //Lunch Time
		$this->assertEquals( $udt_arr[$date_epoch][2]['total_time'], ( -1 * 3600 ) );

		//Make sure no other hours
		$this->assertCount( 3, $udt_arr[$date_epoch] );

		return true;
	}

	/**
	 * @group OvertimePolicy_testAutoDeductMealAndNoOverTimePolicyC
	 */
	function testAutoDeductMealAndNoOverTimePolicyC() {
		global $dd;

		$policy_ids['pay_formula_policy'][] = $this->createPayFormulaPolicy( $this->company_id, 200 ); //OT1.5
		$policy_ids['pay_formula_policy'][] = $this->createPayFormulaPolicy( $this->company_id, 210 ); //OT2.0
		$policy_ids['pay_formula_policy'][] = $this->createPayFormulaPolicy( $this->company_id, 220 ); //OT2.5

		$policy_ids['pay_code'][] = $this->createPayCode( $this->company_id, 100, $policy_ids['pay_formula_policy'][0] );
		$policy_ids['pay_code'][] = $this->createPayCode( $this->company_id, 110, $policy_ids['pay_formula_policy'][1] );
		$policy_ids['pay_code'][] = $this->createPayCode( $this->company_id, 120, $policy_ids['pay_formula_policy'][2] );
		$policy_ids['pay_code'][] = $this->createPayCode( $this->company_id, 190, $policy_ids['pay_formula_policy'][0] );

		//Don't include meal/break in overtime. Include it in Regular time instead.
		$policy_ids['overtime'][] = $this->createOverTimePolicy( $this->company_id, 100, $this->policy_ids['contributing_shift_policy'][10], $policy_ids['pay_code'][0] );
		$policy_ids['overtime'][] = $this->createOverTimePolicy( $this->company_id, 110, $this->policy_ids['contributing_shift_policy'][10], $policy_ids['pay_code'][1] );
		$policy_ids['overtime'][] = $this->createOverTimePolicy( $this->company_id, 120, $this->policy_ids['contributing_shift_policy'][10], $policy_ids['pay_code'][2] );

		$policy_ids['meal'][] = $this->createMealPolicy( $this->company_id, 120 );                          //AutoDeduct 1hr

		//Create Policy Group
		$dd->createPolicyGroup( $this->company_id,
								$policy_ids['meal'], //Meal
								null, //Exception
								null, //Holiday
								$policy_ids['overtime'], //OT
								null, //Premium
								null, //Round
								[ $this->user_id ], //Users
								null, //Break
								null, //Accrual
								null, //Expense
								null, //Absence
								[ $this->policy_ids['regular'][12] ] //Regular incl. meal/break
		);

		$date_epoch = TTDate::getMiddleDayEpoch( TTDate::getBeginWeekEpoch( time() ) );
		$date_stamp = TTDate::getDate( 'DATE', $date_epoch );

		$dd->createPunchPair( $this->user_id,
							  strtotime( $date_stamp . ' 8:00AM' ),
							  strtotime( $date_stamp . ' 3:00PM' ),
							  [
									  'in_type_id'    => 10,
									  'out_type_id'   => 10,
									  'branch_id'     => 0,
									  'department_id' => 0,
									  'job_id'        => 0,
									  'job_item_id'   => 0,
									  'punch_tag_id'  => []
							  ],
							  true
		);

		$udt_arr = $this->getUserDateTotalArray( $date_epoch, $date_epoch );
		//print_r($udt_arr);

		//Total Time
		$this->assertEquals( 5, $udt_arr[$date_epoch][0]['object_type_id'] );                               //5=System Total
		$this->assertEquals( $udt_arr[$date_epoch][0]['pay_code_id'], TTUUID::getZeroID() );
		$this->assertEquals( $udt_arr[$date_epoch][0]['total_time'], ( 6 * 3600 ) );
		//Regular Time
		$this->assertEquals( 20, $udt_arr[$date_epoch][1]['object_type_id'] );                              //Regular Time
		$this->assertEquals( $udt_arr[$date_epoch][1]['pay_code_id'], $this->policy_ids['pay_code'][100] ); //Regular Time
		$this->assertEquals( $udt_arr[$date_epoch][1]['total_time'], ( 6 * 3600 ) );
		//Regular Time (AutoDeduct Lunch)
		$this->assertEquals( 100, $udt_arr[$date_epoch][2]['object_type_id'] );                             //Lunch
		$this->assertEquals( $udt_arr[$date_epoch][2]['pay_code_id'], $this->policy_ids['pay_code'][190] ); //Lunch Time
		$this->assertEquals( $udt_arr[$date_epoch][2]['total_time'], ( -1 * 3600 ) );

		//Make sure no other hours
		$this->assertCount( 3, $udt_arr[$date_epoch] );

		return true;
	}

	/**
	 * @group OvertimePolicy_testAutoDeductMealAndNoOverTimePolicyD
	 */
	function testAutoDeductMealAndNoOverTimePolicyD() {
		global $dd;

		$policy_ids['pay_formula_policy'][] = $this->createPayFormulaPolicy( $this->company_id, 200 ); //OT1.5
		$policy_ids['pay_formula_policy'][] = $this->createPayFormulaPolicy( $this->company_id, 210 ); //OT2.0
		$policy_ids['pay_formula_policy'][] = $this->createPayFormulaPolicy( $this->company_id, 220 ); //OT2.5

		$policy_ids['pay_code'][] = $this->createPayCode( $this->company_id, 100, $policy_ids['pay_formula_policy'][0] );
		$policy_ids['pay_code'][] = $this->createPayCode( $this->company_id, 110, $policy_ids['pay_formula_policy'][1] );
		$policy_ids['pay_code'][] = $this->createPayCode( $this->company_id, 120, $policy_ids['pay_formula_policy'][2] );
		$policy_ids['pay_code'][] = $this->createPayCode( $this->company_id, 190, $policy_ids['pay_formula_policy'][0] );

		//Don't include meal/break in overtime. Include it in Regular time instead.
		$policy_ids['overtime'][] = $this->createOverTimePolicy( $this->company_id, 100, $this->policy_ids['contributing_shift_policy'][10], $policy_ids['pay_code'][0] );
		$policy_ids['overtime'][] = $this->createOverTimePolicy( $this->company_id, 110, $this->policy_ids['contributing_shift_policy'][10], $policy_ids['pay_code'][1] );
		$policy_ids['overtime'][] = $this->createOverTimePolicy( $this->company_id, 120, $this->policy_ids['contributing_shift_policy'][10], $policy_ids['pay_code'][2] );

		$policy_ids['meal'][] = $this->createMealPolicy( $this->company_id, 120 );                          //AutoDeduct 1hr

		//Create Policy Group
		$dd->createPolicyGroup( $this->company_id,
								$policy_ids['meal'], //Meal
								null, //Exception
								null, //Holiday
								$policy_ids['overtime'], //OT
								null, //Premium
								null, //Round
								[ $this->user_id ], //Users
								null, //Break
								null, //Accrual
								null, //Expense
								null, //Absence
								[ $this->policy_ids['regular'][12] ] //Regular incl. meal/break
		);

		$date_epoch = TTDate::getMiddleDayEpoch( TTDate::getBeginWeekEpoch( time() ) );
		$date_stamp = TTDate::getDate( 'DATE', $date_epoch );

		$dd->createPunchPair( $this->user_id,
							  strtotime( $date_stamp . ' 8:00AM' ),
							  strtotime( $date_stamp . ' 5:00PM' ),
							  [
									  'in_type_id'    => 10,
									  'out_type_id'   => 10,
									  'branch_id'     => 0,
									  'department_id' => 0,
									  'job_id'        => 0,
									  'job_item_id'   => 0,
									  'punch_tag_id'  => []
							  ],
							  true
		);

		$udt_arr = $this->getUserDateTotalArray( $date_epoch, $date_epoch );
		//print_r($udt_arr);

		//Total Time
		$this->assertEquals( 5, $udt_arr[$date_epoch][0]['object_type_id'] );                               //5=System Total
		$this->assertEquals( $udt_arr[$date_epoch][0]['pay_code_id'], TTUUID::getZeroID() );
		$this->assertEquals( $udt_arr[$date_epoch][0]['total_time'], ( 8 * 3600 ) );
		//Regular Time
		$this->assertEquals( 20, $udt_arr[$date_epoch][1]['object_type_id'] );                              //Regular Time
		$this->assertEquals( $udt_arr[$date_epoch][1]['pay_code_id'], $this->policy_ids['pay_code'][100] ); //Regular Time
		$this->assertEquals( $udt_arr[$date_epoch][1]['total_time'], ( 8 * 3600 ) );
		//Regular Time (AutoDeduct Lunch)
		$this->assertEquals( 100, $udt_arr[$date_epoch][2]['object_type_id'] );                             //Regular Time
		$this->assertEquals( $udt_arr[$date_epoch][2]['pay_code_id'], $this->policy_ids['pay_code'][190] ); //Regular Time
		$this->assertEquals( $udt_arr[$date_epoch][2]['total_time'], ( -1 * 3600 ) );

		//Make sure no other hours
		$this->assertCount( 3, $udt_arr[$date_epoch] );

		return true;
	}

	/**
	 * @group OvertimePolicy_testAutoDeductMealAndOverTimePolicyA
	 */
	function testAutoDeductMealAndOverTimePolicyA() {
		global $dd;

		$policy_ids['pay_formula_policy'][] = $this->createPayFormulaPolicy( $this->company_id, 200 ); //OT1.5
		$policy_ids['pay_formula_policy'][] = $this->createPayFormulaPolicy( $this->company_id, 210 ); //OT2.0
		$policy_ids['pay_formula_policy'][] = $this->createPayFormulaPolicy( $this->company_id, 220 ); //OT2.5

		$policy_ids['pay_code'][] = $this->createPayCode( $this->company_id, 100, $policy_ids['pay_formula_policy'][0] );
		$policy_ids['pay_code'][] = $this->createPayCode( $this->company_id, 110, $policy_ids['pay_formula_policy'][1] );
		$policy_ids['pay_code'][] = $this->createPayCode( $this->company_id, 120, $policy_ids['pay_formula_policy'][2] );
		$policy_ids['pay_code'][] = $this->createPayCode( $this->company_id, 190, $policy_ids['pay_formula_policy'][0] );

		$policy_ids['overtime'][] = $this->createOverTimePolicy( $this->company_id, 100, $this->policy_ids['contributing_shift_policy'][12], $policy_ids['pay_code'][0] );
		$policy_ids['overtime'][] = $this->createOverTimePolicy( $this->company_id, 110, $this->policy_ids['contributing_shift_policy'][12], $policy_ids['pay_code'][1] );
		$policy_ids['overtime'][] = $this->createOverTimePolicy( $this->company_id, 120, $this->policy_ids['contributing_shift_policy'][12], $policy_ids['pay_code'][2] );

		$policy_ids['meal'][] = $this->createMealPolicy( $this->company_id, 120 ); //AutoDeduct 1hr

		//Create Policy Group
		$dd->createPolicyGroup( $this->company_id,
								$policy_ids['meal'], //Meal
								null, //Exception
								null, //Holiday
								$policy_ids['overtime'], //OT
								null, //Premium
								null, //Round
								[ $this->user_id ], //Users
								null, //Break
								null, //Accrual
								null, //Expense
								null, //Absence
								[ $this->policy_ids['regular'][10] ] //Regular
		);

		$date_epoch = TTDate::getMiddleDayEpoch( TTDate::getBeginWeekEpoch( time() ) );
		$date_stamp = TTDate::getDate( 'DATE', $date_epoch );

		$dd->createPunchPair( $this->user_id,
							  strtotime( $date_stamp . ' 8:00AM' ),
							  strtotime( $date_stamp . ' 5:30PM' ),
							  [
									  'in_type_id'    => 10,
									  'out_type_id'   => 10,
									  'branch_id'     => 0,
									  'department_id' => 0,
									  'job_id'        => 0,
									  'job_item_id'   => 0,
									  'punch_tag_id'  => []
							  ],
							  true
		);

		$udt_arr = $this->getUserDateTotalArray( $date_epoch, $date_epoch );
		//print_r($udt_arr);

		//Total Time
		$this->assertEquals( 5, $udt_arr[$date_epoch][0]['object_type_id'] );      //5=System Total
		$this->assertEquals( $udt_arr[$date_epoch][0]['pay_code_id'], TTUUID::getZeroID() );
		$this->assertEquals( $udt_arr[$date_epoch][0]['total_time'], ( 9.5 * 3600 ) );                      //Unless meal/break time is deducted from Regular Time, the total should be the same as worked time.
		//Regular Time
		$this->assertEquals( 20, $udt_arr[$date_epoch][1]['object_type_id'] );                              //Regular Time
		$this->assertEquals( $udt_arr[$date_epoch][1]['pay_code_id'], $this->policy_ids['pay_code'][100] ); //Regular Time
		$this->assertEquals( $udt_arr[$date_epoch][1]['total_time'], ( 9 * 3600 ) );

		//OverTime
		$this->assertEquals( 30, $udt_arr[$date_epoch][2]['object_type_id'] );                              //OverTime
		$this->assertEquals( $udt_arr[$date_epoch][2]['pay_code_id'], $policy_ids['pay_code'][0] );         //OverTime
		$this->assertEquals( $udt_arr[$date_epoch][2]['total_time'], ( 0.5 * 3600 ) );

		//Regular Time (AutoDeduct Lunch)
		$this->assertEquals( 100, $udt_arr[$date_epoch][3]['object_type_id'] );                             //Regular Time
		$this->assertEquals( $udt_arr[$date_epoch][3]['pay_code_id'], $this->policy_ids['pay_code'][190] ); //Regular Time
		$this->assertEquals( $udt_arr[$date_epoch][3]['total_time'], ( -1 * 3600 ) );

		//Make sure no other hours
		$this->assertCount( 4, $udt_arr[$date_epoch] );

		return true;
	}

	/**
	 * @group OvertimePolicy_testAutoDeductMealAndOverTimePolicyB
	 */
	function testAutoDeductMealAndOverTimePolicyB() {
		global $dd;

		$policy_ids['pay_formula_policy'][] = $this->createPayFormulaPolicy( $this->company_id, 200 ); //OT1.5
		$policy_ids['pay_formula_policy'][] = $this->createPayFormulaPolicy( $this->company_id, 210 ); //OT2.0
		$policy_ids['pay_formula_policy'][] = $this->createPayFormulaPolicy( $this->company_id, 220 ); //OT2.5

		$policy_ids['pay_code'][] = $this->createPayCode( $this->company_id, 100, $policy_ids['pay_formula_policy'][0] );
		$policy_ids['pay_code'][] = $this->createPayCode( $this->company_id, 110, $policy_ids['pay_formula_policy'][1] );
		$policy_ids['pay_code'][] = $this->createPayCode( $this->company_id, 120, $policy_ids['pay_formula_policy'][2] );
		$policy_ids['pay_code'][] = $this->createPayCode( $this->company_id, 190, $policy_ids['pay_formula_policy'][0] );

		$policy_ids['overtime'][] = $this->createOverTimePolicy( $this->company_id, 100, $this->policy_ids['contributing_shift_policy'][12], $policy_ids['pay_code'][0] );
		$policy_ids['overtime'][] = $this->createOverTimePolicy( $this->company_id, 110, $this->policy_ids['contributing_shift_policy'][12], $policy_ids['pay_code'][1] );
		$policy_ids['overtime'][] = $this->createOverTimePolicy( $this->company_id, 120, $this->policy_ids['contributing_shift_policy'][12], $policy_ids['pay_code'][2] );

		$policy_ids['meal'][] = $this->createMealPolicy( $this->company_id, 120 ); //AutoDeduct 1hr

		//Create Policy Group
		$dd->createPolicyGroup( $this->company_id,
								$policy_ids['meal'], //Meal
								null, //Exception
								null, //Holiday
								$policy_ids['overtime'], //OT
								null, //Premium
								null, //Round
								[ $this->user_id ], //Users
								null, //Break
								null, //Accrual
								null, //Expense
								null, //Absence
								[ $this->policy_ids['regular'][10] ] //Regular
		);

		$date_epoch = TTDate::getMiddleDayEpoch( TTDate::getBeginWeekEpoch( time() ) );
		$date_stamp = TTDate::getDate( 'DATE', $date_epoch );

		$dd->createPunchPair( $this->user_id,
							  strtotime( $date_stamp . ' 8:00AM' ),
							  strtotime( $date_stamp . ' 6:30PM' ),
							  [
									  'in_type_id'    => 10,
									  'out_type_id'   => 10,
									  'branch_id'     => 0,
									  'department_id' => 0,
									  'job_id'        => 0,
									  'job_item_id'   => 0,
									  'punch_tag_id'  => []
							  ],
							  true
		);

		$udt_arr = $this->getUserDateTotalArray( $date_epoch, $date_epoch );
		//print_r($udt_arr);

		//Total Time
		$this->assertEquals( 5, $udt_arr[$date_epoch][0]['object_type_id'] );      //5=System Total
		$this->assertEquals( $udt_arr[$date_epoch][0]['pay_code_id'], TTUUID::getZeroID() );
		$this->assertEquals( $udt_arr[$date_epoch][0]['total_time'], ( 10.5 * 3600 ) );                     //Unless meal/break time is deducted from Regular Time, the total should be the same as worked time.
		//Regular Time
		$this->assertEquals( 20, $udt_arr[$date_epoch][1]['object_type_id'] );                              //Regular Time
		$this->assertEquals( $udt_arr[$date_epoch][1]['pay_code_id'], $this->policy_ids['pay_code'][100] ); //Regular Time
		$this->assertEquals( $udt_arr[$date_epoch][1]['total_time'], ( 9 * 3600 ) );
		//OverTime
		$this->assertEquals( 30, $udt_arr[$date_epoch][2]['object_type_id'] );                              //OverTime
		$this->assertEquals( $udt_arr[$date_epoch][2]['pay_code_id'], $policy_ids['pay_code'][1] );         //OverTime
		$this->assertEquals( $udt_arr[$date_epoch][2]['total_time'], ( 0.5 * 3600 ) );
		//OverTime
		$this->assertEquals( 30, $udt_arr[$date_epoch][3]['object_type_id'] );                              //OverTime
		$this->assertEquals( $udt_arr[$date_epoch][3]['pay_code_id'], $policy_ids['pay_code'][0] );         //OverTime
		$this->assertEquals( $udt_arr[$date_epoch][3]['total_time'], ( 1 * 3600 ) );
		//Regular Time (AutoDeduct Lunch)
		$this->assertEquals( 100, $udt_arr[$date_epoch][4]['object_type_id'] );                             //Regular Time
		$this->assertEquals( $udt_arr[$date_epoch][4]['pay_code_id'], $this->policy_ids['pay_code'][190] ); //Regular Time
		$this->assertEquals( $udt_arr[$date_epoch][4]['total_time'], ( -1 * 3600 ) );

		//Make sure no other hours
		$this->assertCount( 5, $udt_arr[$date_epoch] );

		return true;
	}

	/**
	 * @group OvertimePolicy_testAutoDeductMealAndOverTimePolicyC
	 */
	function testAutoDeductMealAndOverTimePolicyC() {
		global $dd;

		$policy_ids['pay_formula_policy'][] = $this->createPayFormulaPolicy( $this->company_id, 200 ); //OT1.5
		$policy_ids['pay_formula_policy'][] = $this->createPayFormulaPolicy( $this->company_id, 210 ); //OT2.0
		$policy_ids['pay_formula_policy'][] = $this->createPayFormulaPolicy( $this->company_id, 220 ); //OT2.5

		$policy_ids['pay_code'][] = $this->createPayCode( $this->company_id, 100, $policy_ids['pay_formula_policy'][0] );
		$policy_ids['pay_code'][] = $this->createPayCode( $this->company_id, 110, $policy_ids['pay_formula_policy'][1] );
		$policy_ids['pay_code'][] = $this->createPayCode( $this->company_id, 120, $policy_ids['pay_formula_policy'][2] );
		$policy_ids['pay_code'][] = $this->createPayCode( $this->company_id, 190, $policy_ids['pay_formula_policy'][0] );

		//Don't include meal/break in overtime. Include it in Regular time instead.
		$policy_ids['overtime'][] = $this->createOverTimePolicy( $this->company_id, 100, $this->policy_ids['contributing_shift_policy'][10], $policy_ids['pay_code'][0] );
		$policy_ids['overtime'][] = $this->createOverTimePolicy( $this->company_id, 110, $this->policy_ids['contributing_shift_policy'][10], $policy_ids['pay_code'][1] );
		$policy_ids['overtime'][] = $this->createOverTimePolicy( $this->company_id, 120, $this->policy_ids['contributing_shift_policy'][10], $policy_ids['pay_code'][2] );

		$policy_ids['meal'][] = $this->createMealPolicy( $this->company_id, 120 );                          //AutoDeduct 1hr

		//Create Policy Group
		$dd->createPolicyGroup( $this->company_id,
								$policy_ids['meal'], //Meal
								null, //Exception
								null, //Holiday
								$policy_ids['overtime'], //OT
								null, //Premium
								null, //Round
								[ $this->user_id ], //Users
								null, //Break
								null, //Accrual
								null, //Expense
								null, //Absence
								[ $this->policy_ids['regular'][12] ] //Regular incl. meal/break
		);

		$date_epoch = TTDate::getMiddleDayEpoch( TTDate::getBeginWeekEpoch( time() ) );
		$date_stamp = TTDate::getDate( 'DATE', $date_epoch );

		$dd->createPunchPair( $this->user_id,
							  strtotime( $date_stamp . ' 8:00AM' ),
							  strtotime( $date_stamp . ' 5:30PM' ),
							  [
									  'in_type_id'    => 10,
									  'out_type_id'   => 10,
									  'branch_id'     => 0,
									  'department_id' => 0,
									  'job_id'        => 0,
									  'job_item_id'   => 0,
									  'punch_tag_id'  => []
							  ],
							  true
		);

		$udt_arr = $this->getUserDateTotalArray( $date_epoch, $date_epoch );
		//print_r($udt_arr);

		//Total Time
		$this->assertEquals( 5, $udt_arr[$date_epoch][0]['object_type_id'] );                               //5=System Total
		$this->assertEquals( $udt_arr[$date_epoch][0]['pay_code_id'], TTUUID::getZeroID() );
		$this->assertEquals( $udt_arr[$date_epoch][0]['total_time'], ( 8.5 * 3600 ) );
		//Regular Time
		$this->assertEquals( 20, $udt_arr[$date_epoch][1]['object_type_id'] );                              //Regular Time
		$this->assertEquals( $udt_arr[$date_epoch][1]['pay_code_id'], $this->policy_ids['pay_code'][100] ); //Regular Time
		$this->assertEquals( $udt_arr[$date_epoch][1]['total_time'], ( 8 * 3600 ) );

		//OverTime
		$this->assertEquals( 30, $udt_arr[$date_epoch][2]['object_type_id'] );                              //OverTime
		$this->assertEquals( $udt_arr[$date_epoch][2]['pay_code_id'], $policy_ids['pay_code'][0] );         //OverTime
		$this->assertEquals( $udt_arr[$date_epoch][2]['total_time'], ( 0.5 * 3600 ) );

		//Regular Time (AutoDeduct Lunch)
		$this->assertEquals( 100, $udt_arr[$date_epoch][3]['object_type_id'] );                             //Regular Time
		$this->assertEquals( $udt_arr[$date_epoch][3]['pay_code_id'], $this->policy_ids['pay_code'][190] ); //Regular Time
		$this->assertEquals( $udt_arr[$date_epoch][3]['total_time'], ( -1 * 3600 ) );

		//Make sure no other hours
		$this->assertCount( 4, $udt_arr[$date_epoch] );

		return true;
	}

	/**
	 * @group OvertimePolicy_testAutoDeductMealAndOverTimePolicyD
	 */
	function testAutoDeductMealAndOverTimePolicyD() {
		global $dd;

		$policy_ids['pay_formula_policy'][] = $this->createPayFormulaPolicy( $this->company_id, 200 ); //OT1.5
		$policy_ids['pay_formula_policy'][] = $this->createPayFormulaPolicy( $this->company_id, 210 ); //OT2.0
		$policy_ids['pay_formula_policy'][] = $this->createPayFormulaPolicy( $this->company_id, 220 ); //OT2.5

		$policy_ids['pay_code'][] = $this->createPayCode( $this->company_id, 100, $policy_ids['pay_formula_policy'][0] );
		$policy_ids['pay_code'][] = $this->createPayCode( $this->company_id, 110, $policy_ids['pay_formula_policy'][1] );
		$policy_ids['pay_code'][] = $this->createPayCode( $this->company_id, 120, $policy_ids['pay_formula_policy'][2] );
		$policy_ids['pay_code'][] = $this->createPayCode( $this->company_id, 190, $policy_ids['pay_formula_policy'][0] );

		//Don't include meal/break in overtime. Include it in Regular time instead.
		$policy_ids['overtime'][] = $this->createOverTimePolicy( $this->company_id, 100, $this->policy_ids['contributing_shift_policy'][10], $policy_ids['pay_code'][0] );
		$policy_ids['overtime'][] = $this->createOverTimePolicy( $this->company_id, 110, $this->policy_ids['contributing_shift_policy'][10], $policy_ids['pay_code'][1] );
		$policy_ids['overtime'][] = $this->createOverTimePolicy( $this->company_id, 120, $this->policy_ids['contributing_shift_policy'][10], $policy_ids['pay_code'][2] );

		$policy_ids['meal'][] = $this->createMealPolicy( $this->company_id, 120 );                          //AutoDeduct 1hr

		//Create Policy Group
		$dd->createPolicyGroup( $this->company_id,
								$policy_ids['meal'], //Meal
								null, //Exception
								null, //Holiday
								$policy_ids['overtime'], //OT
								null, //Premium
								null, //Round
								[ $this->user_id ], //Users
								null, //Break
								null, //Accrual
								null, //Expense
								null, //Absence
								[ $this->policy_ids['regular'][12] ] //Regular incl. meal/break
		);

		$date_epoch = TTDate::getMiddleDayEpoch( TTDate::getBeginWeekEpoch( time() ) );
		$date_stamp = TTDate::getDate( 'DATE', $date_epoch );

		$dd->createPunchPair( $this->user_id,
							  strtotime( $date_stamp . ' 8:00AM' ),
							  strtotime( $date_stamp . ' 6:30PM' ),
							  [
									  'in_type_id'    => 10,
									  'out_type_id'   => 10,
									  'branch_id'     => 0,
									  'department_id' => 0,
									  'job_id'        => 0,
									  'job_item_id'   => 0,
									  'punch_tag_id'  => []
							  ],
							  true
		);

		$udt_arr = $this->getUserDateTotalArray( $date_epoch, $date_epoch );
		//print_r($udt_arr);

		//Total Time
		$this->assertEquals( 5, $udt_arr[$date_epoch][0]['object_type_id'] );                               //5=System Total
		$this->assertEquals( $udt_arr[$date_epoch][0]['pay_code_id'], TTUUID::getZeroID() );
		$this->assertEquals( $udt_arr[$date_epoch][0]['total_time'], ( 9.5 * 3600 ) );
		//Regular Time
		$this->assertEquals( 20, $udt_arr[$date_epoch][1]['object_type_id'] );                              //Regular Time
		$this->assertEquals( $udt_arr[$date_epoch][1]['pay_code_id'], $this->policy_ids['pay_code'][100] ); //Regular Time
		$this->assertEquals( $udt_arr[$date_epoch][1]['total_time'], ( 8 * 3600 ) );
		//OverTime
		$this->assertEquals( 30, $udt_arr[$date_epoch][2]['object_type_id'] );                              //OverTime
		$this->assertEquals( $udt_arr[$date_epoch][2]['pay_code_id'], $policy_ids['pay_code'][1] );         //OverTime
		$this->assertEquals( $udt_arr[$date_epoch][2]['total_time'], ( 0.5 * 3600 ) );
		//OverTime
		$this->assertEquals( 30, $udt_arr[$date_epoch][3]['object_type_id'] );                              //OverTime
		$this->assertEquals( $udt_arr[$date_epoch][3]['pay_code_id'], $policy_ids['pay_code'][0] );         //OverTime
		$this->assertEquals( $udt_arr[$date_epoch][3]['total_time'], ( 1 * 3600 ) );

		//Regular Time (AutoDeduct Lunch)
		$this->assertEquals( 100, $udt_arr[$date_epoch][4]['object_type_id'] );                             //Regular Time
		$this->assertEquals( $udt_arr[$date_epoch][4]['pay_code_id'], $this->policy_ids['pay_code'][190] ); //Regular Time
		$this->assertEquals( $udt_arr[$date_epoch][4]['total_time'], ( -1 * 3600 ) );

		//Make sure no other hours
		$this->assertCount( 5, $udt_arr[$date_epoch] );

		return true;
	}

	/**
	 * @group OvertimePolicy_testAutoDeductMealAndOverTimePolicyE
	 */
	function testAutoDeductMealAndOverTimePolicyE() {
		global $dd;

		$policy_ids['pay_formula_policy'][] = $this->createPayFormulaPolicy( $this->company_id, 200 ); //OT1.5
		$policy_ids['pay_formula_policy'][] = $this->createPayFormulaPolicy( $this->company_id, 210 ); //OT2.0
		$policy_ids['pay_formula_policy'][] = $this->createPayFormulaPolicy( $this->company_id, 220 ); //OT2.5

		$policy_ids['pay_code'][] = $this->createPayCode( $this->company_id, 100, $policy_ids['pay_formula_policy'][0] );
		$policy_ids['pay_code'][] = $this->createPayCode( $this->company_id, 110, $policy_ids['pay_formula_policy'][1] );
		$policy_ids['pay_code'][] = $this->createPayCode( $this->company_id, 120, $policy_ids['pay_formula_policy'][2] );
		$policy_ids['pay_code'][] = $this->createPayCode( $this->company_id, 190, $policy_ids['pay_formula_policy'][0] );

		//Don't include meal/break in overtime. Include it in Regular time instead.
		$policy_ids['overtime'][] = $this->createOverTimePolicy( $this->company_id, 100, $this->policy_ids['contributing_shift_policy'][10], $policy_ids['pay_code'][0] );
		$policy_ids['overtime'][] = $this->createOverTimePolicy( $this->company_id, 110, $this->policy_ids['contributing_shift_policy'][10], $policy_ids['pay_code'][1] );
		$policy_ids['overtime'][] = $this->createOverTimePolicy( $this->company_id, 120, $this->policy_ids['contributing_shift_policy'][10], $policy_ids['pay_code'][2] );

		$policy_ids['meal'][] = $this->createMealPolicy( $this->company_id, 120 );                          //AutoDeduct 1hr

		//Create Policy Group
		$dd->createPolicyGroup( $this->company_id,
								$policy_ids['meal'], //Meal
								null, //Exception
								null, //Holiday
								$policy_ids['overtime'], //OT
								null, //Premium
								null, //Round
								[ $this->user_id ], //Users
								null, //Break
								null, //Accrual
								null, //Expense
								null, //Absence
								[ $this->policy_ids['regular'][12] ] //Regular incl. meal/break
		);

		$date_epoch = TTDate::getMiddleDayEpoch( TTDate::getBeginWeekEpoch( time() ) );
		$date_stamp = TTDate::getDate( 'DATE', $date_epoch );

		$dd->createPunchPair( $this->user_id,
							  strtotime( $date_stamp . ' 8:00AM' ),
							  strtotime( $date_stamp . ' 1:30PM' ),
							  [
									  'in_type_id'    => 10,
									  'out_type_id'   => 10,
									  'branch_id'     => 0,
									  'department_id' => 0,
									  'job_id'        => 0,
									  'job_item_id'   => 0,
									  'punch_tag_id'  => []
							  ],
							  true
		);
		$dd->createPunchPair( $this->user_id,
							  strtotime( $date_stamp . ' 1:30PM' ),
							  strtotime( $date_stamp . ' 6:30PM' ),
							  [
									  'in_type_id'    => 10,
									  'out_type_id'   => 10,
									  'branch_id'     => 0,
									  'department_id' => 0,
									  'job_id'        => 0,
									  'job_item_id'   => 0,
									  'punch_tag_id'  => []
							  ],
							  true
		);

		$udt_arr = $this->getUserDateTotalArray( $date_epoch, $date_epoch );
		//print_r($udt_arr);
		//Total Time
		$this->assertEquals( 5, $udt_arr[$date_epoch][0]['object_type_id'] );                               //5=System Total
		$this->assertEquals( $udt_arr[$date_epoch][0]['pay_code_id'], TTUUID::getZeroID() );
		$this->assertEquals( $udt_arr[$date_epoch][0]['total_time'], ( 9.5 * 3600 ) );
		//Regular Time
		$this->assertEquals( 20, $udt_arr[$date_epoch][1]['object_type_id'] );                              //Regular Time
		$this->assertEquals( $udt_arr[$date_epoch][1]['pay_code_id'], $this->policy_ids['pay_code'][100] ); //Regular Time
		$this->assertEquals( 10885, $udt_arr[$date_epoch][1]['total_time'] );
		//Regular Time
		$this->assertEquals( 20, $udt_arr[$date_epoch][2]['object_type_id'] );                              //Regular Time
		$this->assertEquals( $udt_arr[$date_epoch][2]['pay_code_id'], $this->policy_ids['pay_code'][100] ); //Regular Time
		$this->assertEquals( 17915, $udt_arr[$date_epoch][2]['total_time'] );
		//OverTime
		$this->assertEquals( 30, $udt_arr[$date_epoch][3]['object_type_id'] );                              //OverTime
		$this->assertEquals( $udt_arr[$date_epoch][3]['pay_code_id'], $policy_ids['pay_code'][1] );         //OverTime
		$this->assertEquals( $udt_arr[$date_epoch][3]['total_time'], ( 0.5 * 3600 ) );
		//OverTime
		$this->assertEquals( 30, $udt_arr[$date_epoch][4]['object_type_id'] );                              //OverTime
		$this->assertEquals( $udt_arr[$date_epoch][4]['pay_code_id'], $policy_ids['pay_code'][0] );         //OverTime
		$this->assertEquals( $udt_arr[$date_epoch][4]['total_time'], ( 1 * 3600 ) );
		//Regular Time (AutoDeduct Lunch)
		$this->assertEquals( 100, $udt_arr[$date_epoch][5]['object_type_id'] );                             //Regular Time
		$this->assertEquals( $udt_arr[$date_epoch][5]['pay_code_id'], $this->policy_ids['pay_code'][190] ); //Regular Time
		$this->assertEquals( -1885, $udt_arr[$date_epoch][5]['total_time'] );
		//Regular Time (AutoDeduct Lunch)
		$this->assertEquals( 100, $udt_arr[$date_epoch][6]['object_type_id'] );                             //Regular Time
		$this->assertEquals( $udt_arr[$date_epoch][6]['pay_code_id'], $this->policy_ids['pay_code'][190] ); //Regular Time
		$this->assertEquals( -1715, $udt_arr[$date_epoch][6]['total_time'] );

		//Make sure no other hours
		$this->assertCount( 7, $udt_arr[$date_epoch] );

		return true;
	}

	/**
	 * @group testUserDateTotalOverrideWithAutoDeductMealAndOverTimePolicyA
	 */
	function testUserDateTotalOverrideWithAutoDeductMealAndOverTimePolicyA() {
		global $dd;

		$policy_ids['pay_formula_policy'][] = $this->createPayFormulaPolicy( $this->company_id, 200 ); //OT1.5
		$policy_ids['pay_formula_policy'][] = $this->createPayFormulaPolicy( $this->company_id, 210 ); //OT2.0
		$policy_ids['pay_formula_policy'][] = $this->createPayFormulaPolicy( $this->company_id, 220 ); //OT2.5

		$policy_ids['pay_code'][] = $this->createPayCode( $this->company_id, 100, $policy_ids['pay_formula_policy'][0] );
		$policy_ids['pay_code'][] = $this->createPayCode( $this->company_id, 110, $policy_ids['pay_formula_policy'][1] );
		$policy_ids['pay_code'][] = $this->createPayCode( $this->company_id, 120, $policy_ids['pay_formula_policy'][2] );
		$policy_ids['pay_code'][] = $this->createPayCode( $this->company_id, 190, $policy_ids['pay_formula_policy'][0] );

		//Don't include meal/break in overtime. Include it in Regular time instead.
		$policy_ids['overtime'][] = $this->createOverTimePolicy( $this->company_id, 100, $this->policy_ids['contributing_shift_policy'][10], $policy_ids['pay_code'][0] );
		$policy_ids['overtime'][] = $this->createOverTimePolicy( $this->company_id, 110, $this->policy_ids['contributing_shift_policy'][10], $policy_ids['pay_code'][1] );
		$policy_ids['overtime'][] = $this->createOverTimePolicy( $this->company_id, 120, $this->policy_ids['contributing_shift_policy'][10], $policy_ids['pay_code'][2] );

		$policy_ids['meal'][] = $this->createMealPolicy( $this->company_id, 120 );                          //AutoDeduct 1hr

		//Create Policy Group
		$dd->createPolicyGroup( $this->company_id,
								$policy_ids['meal'], //Meal
								null, //Exception
								null, //Holiday
								$policy_ids['overtime'], //OT
								null, //Premium
								null, //Round
								[ $this->user_id ], //Users
								null, //Break
								null, //Accrual
								null, //Expense
								null, //Absence
								[ $this->policy_ids['regular'][12] ] //Regular incl. meal/break
		);

		$date_epoch = TTDate::getMiddleDayEpoch( TTDate::getBeginWeekEpoch( time() ) );
		$date_stamp = TTDate::getDate( 'DATE', $date_epoch );

		$dd->createPunchPair( $this->user_id,
							  strtotime( $date_stamp . ' 8:00AM' ),
							  strtotime( $date_stamp . ' 1:30PM' ),
							  [
									  'in_type_id'    => 10,
									  'out_type_id'   => 10,
									  'branch_id'     => 0,
									  'department_id' => 0,
									  'job_id'        => 0,
									  'job_item_id'   => 0,
									  'punch_tag_id'  => []
							  ],
							  true
		);
		$dd->createPunchPair( $this->user_id,
							  strtotime( $date_stamp . ' 1:30PM' ),
							  strtotime( $date_stamp . ' 6:30PM' ),
							  [
									  'in_type_id'    => 10,
									  'out_type_id'   => 10,
									  'branch_id'     => 0,
									  'department_id' => 0,
									  'job_id'        => 0,
									  'job_item_id'   => 0,
									  'punch_tag_id'  => []
							  ],
							  true
		);

		$udt_arr = $this->getUserDateTotalArray( $date_epoch, $date_epoch );
		//print_r($udt_arr);
		//Total Time
		$this->assertEquals( 5, $udt_arr[$date_epoch][0]['object_type_id'] );                               //5=System Total
		$this->assertEquals( $udt_arr[$date_epoch][0]['pay_code_id'], TTUUID::getZeroID() );
		$this->assertEquals( $udt_arr[$date_epoch][0]['total_time'], ( 9.5 * 3600 ) );
		//Regular Time
		$this->assertEquals( 20, $udt_arr[$date_epoch][1]['object_type_id'] );                              //Regular Time
		$this->assertEquals( $udt_arr[$date_epoch][1]['pay_code_id'], $this->policy_ids['pay_code'][100] ); //Regular Time
		$this->assertEquals( 10885, $udt_arr[$date_epoch][1]['total_time'] );
		//Regular Time
		$this->assertEquals( 20, $udt_arr[$date_epoch][2]['object_type_id'] );                              //Regular Time
		$this->assertEquals( $udt_arr[$date_epoch][2]['pay_code_id'], $this->policy_ids['pay_code'][100] ); //Regular Time
		$this->assertEquals( 17915, $udt_arr[$date_epoch][2]['total_time'] );
		//OverTime
		$this->assertEquals( 30, $udt_arr[$date_epoch][3]['object_type_id'] );                              //OverTime
		$this->assertEquals( $udt_arr[$date_epoch][3]['pay_code_id'], $policy_ids['pay_code'][1] );         //OverTime
		$this->assertEquals( $udt_arr[$date_epoch][3]['total_time'], ( 0.5 * 3600 ) );
		//OverTime
		$this->assertEquals( 30, $udt_arr[$date_epoch][4]['object_type_id'] );                              //OverTime
		$this->assertEquals( $udt_arr[$date_epoch][4]['pay_code_id'], $policy_ids['pay_code'][0] );         //OverTime
		$this->assertEquals( $udt_arr[$date_epoch][4]['total_time'], ( 1 * 3600 ) );
		//Regular Time (AutoDeduct Lunch)
		$this->assertEquals( 100, $udt_arr[$date_epoch][5]['object_type_id'] );                             //Regular Time
		$this->assertEquals( $udt_arr[$date_epoch][5]['pay_code_id'], $this->policy_ids['pay_code'][190] ); //Regular Time
		$this->assertEquals( -1885, $udt_arr[$date_epoch][5]['total_time'] );
		//Regular Time (AutoDeduct Lunch)
		$this->assertEquals( 100, $udt_arr[$date_epoch][6]['object_type_id'] );                             //Regular Time
		$this->assertEquals( $udt_arr[$date_epoch][6]['pay_code_id'], $this->policy_ids['pay_code'][190] ); //Regular Time
		$this->assertEquals( -1715, $udt_arr[$date_epoch][6]['total_time'] );

		//Make sure no other hours
		$this->assertCount( 7, $udt_arr[$date_epoch] );

		//
		//Override the UserDateTotal record for the lunch and change it to TotalTime=0
		//
		$udtlf = new UserDateTotalListFactory();
		$udtlf->getById( $udt_arr[$date_epoch][6]['id'] );
		$this->assertEquals( 1, $udtlf->getRecordCount() );
		if ( $udtlf->getRecordCount() == 1 ) {
			$udt_obj = $udtlf->getCurrent();
			$udt_obj->setOverride( true );
			$udt_obj->setTotalTime( 0 );
			$udt_obj->setStartTimeStamp( '' );
			$udt_obj->setEndTimeStamp( '' );
			$this->assertEquals( true, $udt_obj->isValid() );
			if ( $udt_obj->isValid() ) {
				$udt_obj->Save();
			}
		}

		$udt_arr = $this->getUserDateTotalArray( $date_epoch, $date_epoch );
		//print_r($udt_arr);
		//Total Time
		$this->assertEquals( 5, $udt_arr[$date_epoch][0]['object_type_id'] );                               //5=System Total
		$this->assertEquals( $udt_arr[$date_epoch][0]['pay_code_id'], TTUUID::getZeroID() );
		$this->assertEquals( $udt_arr[$date_epoch][0]['total_time'], ( 9.5 * 3600 ) );
		$this->assertEquals( false, $udt_arr[$date_epoch][0]['tmp_override'] );
		//Regular Time
		$this->assertEquals( 20, $udt_arr[$date_epoch][1]['object_type_id'] );                              //Regular Time
		$this->assertEquals( $udt_arr[$date_epoch][1]['pay_code_id'], $this->policy_ids['pay_code'][100] ); //Regular Time
		$this->assertEquals( 10885, $udt_arr[$date_epoch][1]['total_time'] );
		$this->assertEquals( false, $udt_arr[$date_epoch][1]['tmp_override'] );
		//Regular Time
		$this->assertEquals( 20, $udt_arr[$date_epoch][2]['object_type_id'] );                              //Regular Time
		$this->assertEquals( $udt_arr[$date_epoch][2]['pay_code_id'], $this->policy_ids['pay_code'][100] ); //Regular Time
		$this->assertEquals( 17915, $udt_arr[$date_epoch][2]['total_time'] );
		$this->assertEquals( false, $udt_arr[$date_epoch][2]['tmp_override'] );
		//OverTime
		$this->assertEquals( 30, $udt_arr[$date_epoch][3]['object_type_id'] );                              //OverTime
		$this->assertEquals( $udt_arr[$date_epoch][3]['pay_code_id'], $policy_ids['pay_code'][1] );         //OverTime
		$this->assertEquals( $udt_arr[$date_epoch][3]['total_time'], ( 0.5 * 3600 ) );
		$this->assertEquals( false, $udt_arr[$date_epoch][3]['tmp_override'] );
		//OverTime
		$this->assertEquals( 30, $udt_arr[$date_epoch][4]['object_type_id'] );                              //OverTime
		$this->assertEquals( $udt_arr[$date_epoch][4]['pay_code_id'], $policy_ids['pay_code'][0] );         //OverTime
		$this->assertEquals( $udt_arr[$date_epoch][4]['total_time'], ( 1 * 3600 ) );
		$this->assertEquals( false, $udt_arr[$date_epoch][4]['tmp_override'] );
		//Regular Time (AutoDeduct Lunch)
		$this->assertEquals( 100, $udt_arr[$date_epoch][5]['object_type_id'] );                             //Regular Time
		$this->assertEquals( $udt_arr[$date_epoch][5]['pay_code_id'], $this->policy_ids['pay_code'][190] ); //Regular Time
		$this->assertEquals( -1885, $udt_arr[$date_epoch][5]['total_time'] );
		$this->assertEquals( false, $udt_arr[$date_epoch][5]['tmp_override'] );
		//Regular Time (AutoDeduct Lunch)
		$this->assertEquals( 100, $udt_arr[$date_epoch][6]['object_type_id'] );                             //Regular Time
		$this->assertEquals( $udt_arr[$date_epoch][6]['pay_code_id'], $this->policy_ids['pay_code'][190] ); //Regular Time
		$this->assertEquals( 0, $udt_arr[$date_epoch][6]['total_time'] );
		$this->assertEquals( true, $udt_arr[$date_epoch][6]['tmp_override'] );

		//Make sure no other hours
		$this->assertCount( 7, $udt_arr[$date_epoch] );


		$udtlf = new UserDateTotalListFactory();
		$udtlf->getById( $udt_arr[$date_epoch][5]['id'] );
		$this->assertEquals( 1, $udtlf->getRecordCount() );
		if ( $udtlf->getRecordCount() == 1 ) {
			$udt_obj = $udtlf->getCurrent();
			$udt_obj->setOverride( true );
			$udt_obj->setTotalTime( 0 );
			$udt_obj->setStartTimeStamp( '' );
			$udt_obj->setEndTimeStamp( '' );
			$this->assertEquals( true, $udt_obj->isValid() );
			if ( $udt_obj->isValid() ) {
				$udt_obj->Save();
			}
		}

		$udt_arr = $this->getUserDateTotalArray( $date_epoch, $date_epoch );
		//print_r($udt_arr);
		//Total Time
		$this->assertEquals( 5, $udt_arr[$date_epoch][0]['object_type_id'] );                               //5=System Total
		$this->assertEquals( $udt_arr[$date_epoch][0]['pay_code_id'], TTUUID::getZeroID() );
		$this->assertEquals( $udt_arr[$date_epoch][0]['total_time'], ( 9.5 * 3600 ) );
		$this->assertEquals( false, $udt_arr[$date_epoch][0]['tmp_override'] );
		//Regular Time
		$this->assertEquals( 20, $udt_arr[$date_epoch][1]['object_type_id'] );                              //Regular Time
		$this->assertEquals( $udt_arr[$date_epoch][1]['pay_code_id'], $this->policy_ids['pay_code'][100] ); //Regular Time
		$this->assertEquals( 10885, $udt_arr[$date_epoch][1]['total_time'] );
		$this->assertEquals( false, $udt_arr[$date_epoch][1]['tmp_override'] );
		//Regular Time
		$this->assertEquals( 20, $udt_arr[$date_epoch][2]['object_type_id'] );                              //Regular Time
		$this->assertEquals( $udt_arr[$date_epoch][2]['pay_code_id'], $this->policy_ids['pay_code'][100] ); //Regular Time
		$this->assertEquals( 17915, $udt_arr[$date_epoch][2]['total_time'] );
		$this->assertEquals( false, $udt_arr[$date_epoch][2]['tmp_override'] );
		//OverTime
		$this->assertEquals( 30, $udt_arr[$date_epoch][3]['object_type_id'] );                              //OverTime
		$this->assertEquals( $udt_arr[$date_epoch][3]['pay_code_id'], $policy_ids['pay_code'][1] );         //OverTime
		$this->assertEquals( $udt_arr[$date_epoch][3]['total_time'], ( 0.5 * 3600 ) );
		$this->assertEquals( false, $udt_arr[$date_epoch][3]['tmp_override'] );
		//OverTime
		$this->assertEquals( 30, $udt_arr[$date_epoch][4]['object_type_id'] );                              //OverTime
		$this->assertEquals( $udt_arr[$date_epoch][4]['pay_code_id'], $policy_ids['pay_code'][0] );         //OverTime
		$this->assertEquals( $udt_arr[$date_epoch][4]['total_time'], ( 1 * 3600 ) );
		$this->assertEquals( false, $udt_arr[$date_epoch][4]['tmp_override'] );
		//Regular Time (AutoDeduct Lunch)
		$this->assertEquals( 100, $udt_arr[$date_epoch][5]['object_type_id'] );                             //Regular Time
		$this->assertEquals( $udt_arr[$date_epoch][5]['pay_code_id'], $this->policy_ids['pay_code'][190] ); //Regular Time
		$this->assertEquals( 0, $udt_arr[$date_epoch][5]['total_time'] );
		$this->assertEquals( true, $udt_arr[$date_epoch][5]['tmp_override'] );
		//Regular Time (AutoDeduct Lunch)
		$this->assertEquals( 100, $udt_arr[$date_epoch][6]['object_type_id'] );                             //Regular Time
		$this->assertEquals( $udt_arr[$date_epoch][6]['pay_code_id'], $this->policy_ids['pay_code'][190] ); //Regular Time
		$this->assertEquals( 0, $udt_arr[$date_epoch][6]['total_time'] );
		$this->assertEquals( true, $udt_arr[$date_epoch][6]['tmp_override'] );

		//Make sure no other hours
		$this->assertCount( 7, $udt_arr[$date_epoch] );


		$udtlf = new UserDateTotalListFactory();
		$udtlf->getById( $udt_arr[$date_epoch][4]['id'] );
		$this->assertEquals( 1, $udtlf->getRecordCount() );
		if ( $udtlf->getRecordCount() == 1 ) {
			$udt_obj = $udtlf->getCurrent();
			$udt_obj->setOverride( true );
			$udt_obj->setTotalTime( 0 );
			$udt_obj->setStartTimeStamp( '' );
			$udt_obj->setEndTimeStamp( '' );
			$this->assertEquals( true, $udt_obj->isValid() );
			if ( $udt_obj->isValid() ) {
				$udt_obj->Save();
			}
		}

		$udt_arr = $this->getUserDateTotalArray( $date_epoch, $date_epoch );
		//print_r($udt_arr);
		//Total Time
		$this->assertEquals( 5, $udt_arr[$date_epoch][0]['object_type_id'] );                               //5=System Total
		$this->assertEquals( $udt_arr[$date_epoch][0]['pay_code_id'], TTUUID::getZeroID() );
		$this->assertEquals( $udt_arr[$date_epoch][0]['total_time'], ( 9.5 * 3600 ) );
		$this->assertEquals( false, $udt_arr[$date_epoch][0]['tmp_override'] );
		//Regular Time
		$this->assertEquals( 20, $udt_arr[$date_epoch][1]['object_type_id'] );                              //Regular Time
		$this->assertEquals( $udt_arr[$date_epoch][1]['pay_code_id'], $this->policy_ids['pay_code'][100] ); //Regular Time
		$this->assertEquals( 10885, $udt_arr[$date_epoch][1]['total_time'] );
		$this->assertEquals( false, $udt_arr[$date_epoch][1]['tmp_override'] );
		//Regular Time
		$this->assertEquals( 20, $udt_arr[$date_epoch][2]['object_type_id'] );                              //Regular Time
		$this->assertEquals( $udt_arr[$date_epoch][2]['pay_code_id'], $this->policy_ids['pay_code'][100] ); //Regular Time
		$this->assertEquals( 17915, $udt_arr[$date_epoch][2]['total_time'] );
		$this->assertEquals( false, $udt_arr[$date_epoch][2]['tmp_override'] );
		//OverTime
		$this->assertEquals( 30, $udt_arr[$date_epoch][3]['object_type_id'] );                              //OverTime
		$this->assertEquals( $udt_arr[$date_epoch][3]['pay_code_id'], $policy_ids['pay_code'][1] );         //OverTime
		$this->assertEquals( $udt_arr[$date_epoch][3]['total_time'], ( 0.5 * 3600 ) );
		$this->assertEquals( false, $udt_arr[$date_epoch][3]['tmp_override'] );
		//OverTime
		$this->assertEquals( 30, $udt_arr[$date_epoch][4]['object_type_id'] );                              //OverTime
		$this->assertEquals( $udt_arr[$date_epoch][4]['pay_code_id'], $policy_ids['pay_code'][0] );         //OverTime
		$this->assertEquals( 0, $udt_arr[$date_epoch][4]['total_time'] );
		$this->assertEquals( true, $udt_arr[$date_epoch][4]['tmp_override'] );
		//Regular Time (AutoDeduct Lunch)
		$this->assertEquals( 100, $udt_arr[$date_epoch][5]['object_type_id'] );                             //Regular Time
		$this->assertEquals( $udt_arr[$date_epoch][5]['pay_code_id'], $this->policy_ids['pay_code'][190] ); //Regular Time
		$this->assertEquals( 0, $udt_arr[$date_epoch][5]['total_time'] );
		$this->assertEquals( true, $udt_arr[$date_epoch][5]['tmp_override'] );
		//Regular Time (AutoDeduct Lunch)
		$this->assertEquals( 100, $udt_arr[$date_epoch][6]['object_type_id'] );                             //Regular Time
		$this->assertEquals( $udt_arr[$date_epoch][6]['pay_code_id'], $this->policy_ids['pay_code'][190] ); //Regular Time
		$this->assertEquals( 0, $udt_arr[$date_epoch][6]['total_time'] );
		$this->assertEquals( true, $udt_arr[$date_epoch][6]['tmp_override'] );

		//Make sure no other hours
		$this->assertCount( 7, $udt_arr[$date_epoch] );


		$udtlf = new UserDateTotalListFactory();
		$udtlf->getById( $udt_arr[$date_epoch][3]['id'] );
		$this->assertEquals( 1, $udtlf->getRecordCount() );
		if ( $udtlf->getRecordCount() == 1 ) {
			$udt_obj = $udtlf->getCurrent();
			$udt_obj->setOverride( true );
			$udt_obj->setTotalTime( 0 );
			$udt_obj->setStartTimeStamp( '' );
			$udt_obj->setEndTimeStamp( '' );
			$this->assertEquals( true, $udt_obj->isValid() );
			if ( $udt_obj->isValid() ) {
				$udt_obj->Save();
			}
		}

		$udt_arr = $this->getUserDateTotalArray( $date_epoch, $date_epoch );
		//print_r($udt_arr);
		//Total Time
		$this->assertEquals( 5, $udt_arr[$date_epoch][0]['object_type_id'] );                               //5=System Total
		$this->assertEquals( $udt_arr[$date_epoch][0]['pay_code_id'], TTUUID::getZeroID() );
		$this->assertEquals( $udt_arr[$date_epoch][0]['total_time'], ( 9.5 * 3600 ) );
		$this->assertEquals( false, $udt_arr[$date_epoch][0]['tmp_override'] );
		//Regular Time
		$this->assertEquals( 20, $udt_arr[$date_epoch][1]['object_type_id'] );                              //Regular Time
		$this->assertEquals( $udt_arr[$date_epoch][1]['pay_code_id'], $this->policy_ids['pay_code'][100] ); //Regular Time
		$this->assertEquals( 10885, $udt_arr[$date_epoch][1]['total_time'] );
		$this->assertEquals( false, $udt_arr[$date_epoch][1]['tmp_override'] );
		//Regular Time
		$this->assertEquals( 20, $udt_arr[$date_epoch][2]['object_type_id'] );                              //Regular Time
		$this->assertEquals( $udt_arr[$date_epoch][2]['pay_code_id'], $this->policy_ids['pay_code'][100] ); //Regular Time
		$this->assertEquals( 17915, $udt_arr[$date_epoch][2]['total_time'] );
		$this->assertEquals( false, $udt_arr[$date_epoch][2]['tmp_override'] );
		//OverTime
		$this->assertEquals( 30, $udt_arr[$date_epoch][3]['object_type_id'] );                              //OverTime
		$this->assertEquals( $udt_arr[$date_epoch][3]['pay_code_id'], $policy_ids['pay_code'][1] );         //OverTime
		$this->assertEquals( 0, $udt_arr[$date_epoch][3]['total_time'] );
		$this->assertEquals( true, $udt_arr[$date_epoch][3]['tmp_override'] );
		//OverTime
		$this->assertEquals( 30, $udt_arr[$date_epoch][4]['object_type_id'] );                              //OverTime
		$this->assertEquals( $udt_arr[$date_epoch][4]['pay_code_id'], $policy_ids['pay_code'][0] );         //OverTime
		$this->assertEquals( 0, $udt_arr[$date_epoch][4]['total_time'] );
		$this->assertEquals( true, $udt_arr[$date_epoch][4]['tmp_override'] );
		//Regular Time (AutoDeduct Lunch)
		$this->assertEquals( 100, $udt_arr[$date_epoch][5]['object_type_id'] );                             //Regular Time
		$this->assertEquals( $udt_arr[$date_epoch][5]['pay_code_id'], $this->policy_ids['pay_code'][190] ); //Regular Time
		$this->assertEquals( 0, $udt_arr[$date_epoch][5]['total_time'] );
		$this->assertEquals( true, $udt_arr[$date_epoch][5]['tmp_override'] );
		//Regular Time (AutoDeduct Lunch)
		$this->assertEquals( 100, $udt_arr[$date_epoch][6]['object_type_id'] );                             //Regular Time
		$this->assertEquals( $udt_arr[$date_epoch][6]['pay_code_id'], $this->policy_ids['pay_code'][190] ); //Regular Time
		$this->assertEquals( 0, $udt_arr[$date_epoch][6]['total_time'] );
		$this->assertEquals( true, $udt_arr[$date_epoch][6]['tmp_override'] );

		//Make sure no other hours
		$this->assertCount( 7, $udt_arr[$date_epoch] );


		$udtlf = new UserDateTotalListFactory();
		$udtlf->getById( $udt_arr[$date_epoch][2]['id'] );
		$this->assertEquals( 1, $udtlf->getRecordCount() );
		if ( $udtlf->getRecordCount() == 1 ) {
			$udt_obj = $udtlf->getCurrent();
			$udt_obj->setOverride( true );
			$udt_obj->setTotalTime( 0 );
			$udt_obj->setStartTimeStamp( '' );
			$udt_obj->setEndTimeStamp( '' );
			$this->assertEquals( true, $udt_obj->isValid() );
			if ( $udt_obj->isValid() ) {
				$udt_obj->Save();
			}
		}

		$udt_arr = $this->getUserDateTotalArray( $date_epoch, $date_epoch );
		//print_r($udt_arr);
		//Total Time
		$this->assertEquals( 5, $udt_arr[$date_epoch][0]['object_type_id'] );                               //5=System Total
		$this->assertEquals( $udt_arr[$date_epoch][0]['pay_code_id'], TTUUID::getZeroID() );
		$this->assertEquals( $udt_arr[$date_epoch][0]['total_time'], ( 9.5 * 3600 ) );
		$this->assertEquals( false, $udt_arr[$date_epoch][0]['tmp_override'] );
		//Regular Time (Returned record order got changed, so swapped with above)
		$this->assertEquals( 20, $udt_arr[$date_epoch][2]['object_type_id'] );                              //Regular Time
		$this->assertEquals( $udt_arr[$date_epoch][2]['pay_code_id'], $this->policy_ids['pay_code'][100] ); //Regular Time
		$this->assertEquals( 10885, $udt_arr[$date_epoch][2]['total_time'] );
		$this->assertEquals( false, $udt_arr[$date_epoch][2]['tmp_override'] );
		//Regular Time (Returned record order got changed, so swapped with above)
		$this->assertEquals( 20, $udt_arr[$date_epoch][1]['object_type_id'] );                              //Regular Time
		$this->assertEquals( $udt_arr[$date_epoch][1]['pay_code_id'], $this->policy_ids['pay_code'][100] ); //Regular Time
		$this->assertEquals( 0, $udt_arr[$date_epoch][1]['total_time'] );
		$this->assertEquals( true, $udt_arr[$date_epoch][1]['tmp_override'] );
		//OverTime
		$this->assertEquals( 30, $udt_arr[$date_epoch][3]['object_type_id'] );                              //OverTime
		$this->assertEquals( $udt_arr[$date_epoch][3]['pay_code_id'], $policy_ids['pay_code'][1] );         //OverTime
		$this->assertEquals( 0, $udt_arr[$date_epoch][3]['total_time'] );
		$this->assertEquals( true, $udt_arr[$date_epoch][3]['tmp_override'] );
		//OverTime
		$this->assertEquals( 30, $udt_arr[$date_epoch][4]['object_type_id'] );                              //OverTime
		$this->assertEquals( $udt_arr[$date_epoch][4]['pay_code_id'], $policy_ids['pay_code'][0] );         //OverTime
		$this->assertEquals( 0, $udt_arr[$date_epoch][4]['total_time'] );
		$this->assertEquals( true, $udt_arr[$date_epoch][4]['tmp_override'] );
		//Regular Time (AutoDeduct Lunch)
		$this->assertEquals( 100, $udt_arr[$date_epoch][5]['object_type_id'] );                             //Regular Time
		$this->assertEquals( $udt_arr[$date_epoch][5]['pay_code_id'], $this->policy_ids['pay_code'][190] ); //Regular Time
		$this->assertEquals( 0, $udt_arr[$date_epoch][5]['total_time'] );
		$this->assertEquals( true, $udt_arr[$date_epoch][5]['tmp_override'] );
		//Regular Time (AutoDeduct Lunch)
		$this->assertEquals( 100, $udt_arr[$date_epoch][6]['object_type_id'] );                             //Regular Time
		$this->assertEquals( $udt_arr[$date_epoch][6]['pay_code_id'], $this->policy_ids['pay_code'][190] ); //Regular Time
		$this->assertEquals( 0, $udt_arr[$date_epoch][6]['total_time'] );
		$this->assertEquals( true, $udt_arr[$date_epoch][6]['tmp_override'] );

		//Make sure no other hours
		$this->assertCount( 7, $udt_arr[$date_epoch] );


		$udtlf = new UserDateTotalListFactory();
		$udtlf->getById( $udt_arr[$date_epoch][2]['id'] );                                                  //(Returned record order got changed, so using record '2' instead of '1'.
		$this->assertEquals( 1, $udtlf->getRecordCount() );
		if ( $udtlf->getRecordCount() == 1 ) {
			$udt_obj = $udtlf->getCurrent();
			$udt_obj->setOverride( true );
			$udt_obj->setTotalTime( 0 );
			$udt_obj->setStartTimeStamp( '' );
			$udt_obj->setEndTimeStamp( '' );
			$this->assertEquals( true, $udt_obj->isValid() );
			if ( $udt_obj->isValid() ) {
				$udt_obj->Save();
			}
		}

		$udt_arr = $this->getUserDateTotalArray( $date_epoch, $date_epoch );
		//print_r($udt_arr);
		//Total Time
		$this->assertEquals( 5, $udt_arr[$date_epoch][0]['object_type_id'] );                               //5=System Total
		$this->assertEquals( $udt_arr[$date_epoch][0]['pay_code_id'], TTUUID::getZeroID() );
		$this->assertEquals( $udt_arr[$date_epoch][0]['total_time'], ( 9.5 * 3600 ) );
		$this->assertEquals( false, $udt_arr[$date_epoch][0]['tmp_override'] );
		//Regular Time
		$this->assertEquals( 20, $udt_arr[$date_epoch][1]['object_type_id'] );                              //Regular Time
		$this->assertEquals( $udt_arr[$date_epoch][1]['pay_code_id'], $this->policy_ids['pay_code'][100] ); //Regular Time
		$this->assertEquals( 0, $udt_arr[$date_epoch][1]['total_time'] );
		$this->assertEquals( true, $udt_arr[$date_epoch][1]['tmp_override'] );
		//Regular Time
		$this->assertEquals( 20, $udt_arr[$date_epoch][2]['object_type_id'] );                              //Regular Time
		$this->assertEquals( $udt_arr[$date_epoch][2]['pay_code_id'], $this->policy_ids['pay_code'][100] ); //Regular Time
		$this->assertEquals( 0, $udt_arr[$date_epoch][2]['total_time'] );
		$this->assertEquals( true, $udt_arr[$date_epoch][2]['tmp_override'] );
		//OverTime
		$this->assertEquals( 30, $udt_arr[$date_epoch][3]['object_type_id'] );                              //OverTime
		$this->assertEquals( $udt_arr[$date_epoch][3]['pay_code_id'], $policy_ids['pay_code'][1] );         //OverTime
		$this->assertEquals( 0, $udt_arr[$date_epoch][3]['total_time'] );
		$this->assertEquals( true, $udt_arr[$date_epoch][3]['tmp_override'] );
		//OverTime
		$this->assertEquals( 30, $udt_arr[$date_epoch][4]['object_type_id'] );                              //OverTime
		$this->assertEquals( $udt_arr[$date_epoch][4]['pay_code_id'], $policy_ids['pay_code'][0] );         //OverTime
		$this->assertEquals( 0, $udt_arr[$date_epoch][4]['total_time'] );
		$this->assertEquals( true, $udt_arr[$date_epoch][4]['tmp_override'] );
		//Regular Time (AutoDeduct Lunch)
		$this->assertEquals( 100, $udt_arr[$date_epoch][5]['object_type_id'] );                             //Regular Time
		$this->assertEquals( $udt_arr[$date_epoch][5]['pay_code_id'], $this->policy_ids['pay_code'][190] ); //Regular Time
		$this->assertEquals( 0, $udt_arr[$date_epoch][5]['total_time'] );
		$this->assertEquals( true, $udt_arr[$date_epoch][5]['tmp_override'] );
		//Regular Time (AutoDeduct Lunch)
		$this->assertEquals( 100, $udt_arr[$date_epoch][6]['object_type_id'] );                             //Regular Time
		$this->assertEquals( $udt_arr[$date_epoch][6]['pay_code_id'], $this->policy_ids['pay_code'][190] ); //Regular Time
		$this->assertEquals( 0, $udt_arr[$date_epoch][6]['total_time'] );
		$this->assertEquals( true, $udt_arr[$date_epoch][6]['tmp_override'] );

		//Make sure no other hours
		$this->assertCount( 7, $udt_arr[$date_epoch] );

		return true;
	}

	/**
	 * @group OvertimePolicy_testAutoAddMealAndNoOverTimePolicyA
	 */
	function testAutoAddMealAndNoOverTimePolicyA() {
		global $dd;

		$policy_ids['pay_formula_policy'][] = $this->createPayFormulaPolicy( $this->company_id, 200 ); //OT1.5
		$policy_ids['pay_formula_policy'][] = $this->createPayFormulaPolicy( $this->company_id, 210 ); //OT2.0
		$policy_ids['pay_formula_policy'][] = $this->createPayFormulaPolicy( $this->company_id, 220 ); //OT2.5

		$policy_ids['pay_code'][] = $this->createPayCode( $this->company_id, 100, $policy_ids['pay_formula_policy'][0] );
		$policy_ids['pay_code'][] = $this->createPayCode( $this->company_id, 110, $policy_ids['pay_formula_policy'][1] );
		$policy_ids['pay_code'][] = $this->createPayCode( $this->company_id, 120, $policy_ids['pay_formula_policy'][2] );
		$policy_ids['pay_code'][] = $this->createPayCode( $this->company_id, 190, $policy_ids['pay_formula_policy'][0] );

		$policy_ids['overtime'][] = $this->createOverTimePolicy( $this->company_id, 100, $this->policy_ids['contributing_shift_policy'][12], $policy_ids['pay_code'][0] );
		$policy_ids['overtime'][] = $this->createOverTimePolicy( $this->company_id, 110, $this->policy_ids['contributing_shift_policy'][12], $policy_ids['pay_code'][1] );
		$policy_ids['overtime'][] = $this->createOverTimePolicy( $this->company_id, 120, $this->policy_ids['contributing_shift_policy'][12], $policy_ids['pay_code'][2] );

		$policy_ids['meal'][] = $this->createMealPolicy( $this->company_id, 110 ); //AutoAdd 1hr

		//Create Policy Group
		$dd->createPolicyGroup( $this->company_id,
								$policy_ids['meal'], //Meal
								null, //Exception
								null, //Holiday
								$policy_ids['overtime'], //OT
								null, //Premium
								null, //Round
								[ $this->user_id ], //Users
								null, //Break
								null, //Accrual
								null, //Expense
								null, //Absence
								[ $this->policy_ids['regular'][10] ] //Regular
		);

		$date_epoch = TTDate::getMiddleDayEpoch( TTDate::getBeginWeekEpoch( time() ) );
		$date_stamp = TTDate::getDate( 'DATE', $date_epoch );

		$dd->createPunchPair( $this->user_id,
							  strtotime( $date_stamp . ' 9:00AM' ),
							  strtotime( $date_stamp . ' 12:00PM' ),
							  [
									  'in_type_id'    => 10,
									  'out_type_id'   => 20,
									  'branch_id'     => 0,
									  'department_id' => 0,
									  'job_id'        => 0,
									  'job_item_id'   => 0,
									  'punch_tag_id'  => []
							  ],
							  true
		);
		$dd->createPunchPair( $this->user_id,
							  strtotime( $date_stamp . ' 1:00PM' ),
							  strtotime( $date_stamp . ' 4:00PM' ),
							  [
									  'in_type_id'    => 20,
									  'out_type_id'   => 10,
									  'branch_id'     => 0,
									  'department_id' => 0,
									  'job_id'        => 0,
									  'job_item_id'   => 0,
									  'punch_tag_id'  => []
							  ],
							  true
		);

		$udt_arr = $this->getUserDateTotalArray( $date_epoch, $date_epoch );
		//print_r($udt_arr);

		//Total Time
		$this->assertEquals( 5, $udt_arr[$date_epoch][0]['object_type_id'] );      //5=System Total
		$this->assertEquals( $udt_arr[$date_epoch][0]['pay_code_id'], TTUUID::getZeroID() );
		$this->assertEquals( $udt_arr[$date_epoch][0]['total_time'], ( 6 * 3600 ) );                        //Unless meal/break time is added to Regular Time, the total should be the same as worked time.
		//Regular Time
		$this->assertEquals( 20, $udt_arr[$date_epoch][1]['object_type_id'] );                              //Regular Time
		$this->assertEquals( $udt_arr[$date_epoch][1]['pay_code_id'], $this->policy_ids['pay_code'][100] ); //Regular Time
		$this->assertEquals( $udt_arr[$date_epoch][1]['total_time'], ( 3 * 3600 ) );
		//Regular Time
		$this->assertEquals( 20, $udt_arr[$date_epoch][2]['object_type_id'] );                              //Regular Time
		$this->assertEquals( $udt_arr[$date_epoch][2]['pay_code_id'], $this->policy_ids['pay_code'][100] ); //Regular Time
		$this->assertEquals( $udt_arr[$date_epoch][2]['total_time'], ( 3 * 3600 ) );
		//Regular Time (AutoAdd Lunch)
		$this->assertEquals( 100, $udt_arr[$date_epoch][3]['object_type_id'] );                             //Regular Time
		$this->assertEquals( $udt_arr[$date_epoch][3]['pay_code_id'], $this->policy_ids['pay_code'][190] ); //Lunch Time
		$this->assertEquals( $udt_arr[$date_epoch][3]['total_time'], ( 1 * 3600 ) );
		////Regular Time (AutoAdd Lunch) -- This was compacted out with compactUserDateTotalDataBasedOnTimeStamps()
		//$this->assertEquals( 100, $udt_arr[$date_epoch][4]['object_type_id'] );                             //Regular Time
		//$this->assertEquals( $udt_arr[$date_epoch][4]['pay_code_id'], $this->policy_ids['pay_code'][190] ); //Lunch Time
		//$this->assertEquals( $udt_arr[$date_epoch][4]['total_time'], ( 0.5 * 3600 ) );

		//Make sure no other hours
		$this->assertCount( 4, $udt_arr[$date_epoch] );

		return true;
	}

	/**
	 * @group OvertimePolicy_testAutoAddMealAndOverTimePolicyA
	 */
	function testAutoAddMealAndOverTimePolicyA() {
		global $dd;

		$policy_ids['pay_formula_policy'][] = $this->createPayFormulaPolicy( $this->company_id, 200 );      //OT1.5
		$policy_ids['pay_formula_policy'][] = $this->createPayFormulaPolicy( $this->company_id, 210 );      //OT2.0
		$policy_ids['pay_formula_policy'][] = $this->createPayFormulaPolicy( $this->company_id, 220 );      //OT2.5

		$policy_ids['pay_code'][] = $this->createPayCode( $this->company_id, 100, $policy_ids['pay_formula_policy'][0] );
		$policy_ids['pay_code'][] = $this->createPayCode( $this->company_id, 110, $policy_ids['pay_formula_policy'][1] );
		$policy_ids['pay_code'][] = $this->createPayCode( $this->company_id, 120, $policy_ids['pay_formula_policy'][2] );
		$policy_ids['pay_code'][] = $this->createPayCode( $this->company_id, 190, $policy_ids['pay_formula_policy'][0] );

		//Don't include meal/break in overtime. Include it in Regular time instead.
		$policy_ids['overtime'][] = $this->createOverTimePolicy( $this->company_id, 100, $this->policy_ids['contributing_shift_policy'][10], $policy_ids['pay_code'][0] );
		$policy_ids['overtime'][] = $this->createOverTimePolicy( $this->company_id, 110, $this->policy_ids['contributing_shift_policy'][10], $policy_ids['pay_code'][1] );
		$policy_ids['overtime'][] = $this->createOverTimePolicy( $this->company_id, 120, $this->policy_ids['contributing_shift_policy'][10], $policy_ids['pay_code'][2] );

		//$policy_ids['meal'][] = $this->createMealPolicy( $this->company_id, 120 ); //AutoDeduct 1hr
		$policy_ids['meal'][] = $this->createMealPolicy( $this->company_id, 110 );                          //AutoAdd 1hr


		//Create Policy Group
		$dd->createPolicyGroup( $this->company_id,
								$policy_ids['meal'], //Meal
								null, //Exception
								null, //Holiday
								$policy_ids['overtime'], //OT
								null, //Premium
								null, //Round
								[ $this->user_id ], //Users
								null, //Break
								null, //Accrual
								null, //Expense
								null, //Absence
								[ $this->policy_ids['regular'][12] ] //Regular incl. meal/break
		);

		$date_epoch = TTDate::getMiddleDayEpoch( TTDate::getBeginWeekEpoch( time() ) );
		$date_stamp = TTDate::getDate( 'DATE', $date_epoch );

		$dd->createPunchPair( $this->user_id,
							  strtotime( $date_stamp . ' 8:00AM' ),
							  strtotime( $date_stamp . ' 2:00PM' ),
							  [
									  'in_type_id'    => 10,
									  'out_type_id'   => 20,
									  'branch_id'     => 0,
									  'department_id' => 0,
									  'job_id'        => 0,
									  'job_item_id'   => 0,
									  'punch_tag_id'  => []
							  ],
							  true
		);
		$dd->createPunchPair( $this->user_id,
							  strtotime( $date_stamp . ' 3:00PM' ),
							  strtotime( $date_stamp . ' 8:00PM' ),
							  [
									  'in_type_id'    => 20,
									  'out_type_id'   => 10,
									  'branch_id'     => 0,
									  'department_id' => 0,
									  'job_id'        => 0,
									  'job_item_id'   => 0,
									  'punch_tag_id'  => []
							  ],
							  true
		);

		$udt_arr = $this->getUserDateTotalArray( $date_epoch, $date_epoch );
		//print_r($udt_arr);

		//Total Time
		$this->assertEquals( 5, $udt_arr[$date_epoch][0]['object_type_id'] );                               //5=System Total
		$this->assertEquals( $udt_arr[$date_epoch][0]['pay_code_id'], TTUUID::getZeroID() );
		$this->assertEquals( $udt_arr[$date_epoch][0]['total_time'], ( 12 * 3600 ) );
		//Regular Time -- This was compacted out with compactUserDateTotalDataBasedOnTimeStamps()
		//$this->assertEquals( 20, $udt_arr[$date_epoch][1]['object_type_id'] );                              //Regular Time
		//$this->assertEquals( $udt_arr[$date_epoch][1]['pay_code_id'], $this->policy_ids['pay_code'][100] ); //Regular Time
		//$this->assertEquals( 1637, $udt_arr[$date_epoch][1]['total_time'] );
		////Regular Time -- This was compacted out with compactUserDateTotalDataBasedOnTimeStamps()
		//$this->assertEquals( 20, $udt_arr[$date_epoch][1]['object_type_id'] );                              //Regular Time
		//$this->assertEquals( $udt_arr[$date_epoch][1]['pay_code_id'], $this->policy_ids['pay_code'][100] ); //Regular Time
		//$this->assertEquals( 1963, $udt_arr[$date_epoch][1]['total_time'] );
		////Regular Time -- This was compacted out with compactUserDateTotalDataBasedOnTimeStamps()
		//$this->assertEquals( 20, $udt_arr[$date_epoch][2]['object_type_id'] );                              //Regular Time
		//$this->assertEquals( $udt_arr[$date_epoch][2]['pay_code_id'], $this->policy_ids['pay_code'][100] ); //Regular Time
		//$this->assertEquals( 3600, $udt_arr[$date_epoch][2]['total_time'] );
		////Regular Time -- This was compacted out with compactUserDateTotalDataBasedOnTimeStamps()
		//$this->assertEquals( 20, $udt_arr[$date_epoch][3]['object_type_id'] );                              //Regular Time
		//$this->assertEquals( $udt_arr[$date_epoch][3]['pay_code_id'], $this->policy_ids['pay_code'][100] ); //Regular Time
		//$this->assertEquals( $udt_arr[$date_epoch][3]['total_time'], ( ( 6 * 3600 ) + 1637 ) );
		//Regular Time
		$this->assertEquals( 20, $udt_arr[$date_epoch][1]['object_type_id'] );                              //Regular Time
		$this->assertEquals( $udt_arr[$date_epoch][1]['pay_code_id'], $this->policy_ids['pay_code'][100] ); //Regular Time
		$this->assertEquals( $udt_arr[$date_epoch][1]['total_time'], ( ( 8 * 3600 ) ) );


		//OverTime
		$this->assertEquals( 30, $udt_arr[$date_epoch][2]['object_type_id'] );                              //OverTime
		$this->assertEquals( $udt_arr[$date_epoch][2]['pay_code_id'], $policy_ids['pay_code'][2] );         //OverTime
		$this->assertEquals( $udt_arr[$date_epoch][2]['total_time'], ( 2 * 3600 ) );
		//OverTime
		$this->assertEquals( 30, $udt_arr[$date_epoch][3]['object_type_id'] );                              //OverTime
		$this->assertEquals( $udt_arr[$date_epoch][3]['pay_code_id'], $policy_ids['pay_code'][1] );         //OverTime
		$this->assertEquals( $udt_arr[$date_epoch][3]['total_time'], ( 1 * 3600 ) );
		//OverTime
		$this->assertEquals( 30, $udt_arr[$date_epoch][4]['object_type_id'] );                              //OverTime
		$this->assertEquals( $udt_arr[$date_epoch][4]['pay_code_id'], $policy_ids['pay_code'][0] );         //OverTime
		$this->assertEquals( $udt_arr[$date_epoch][4]['total_time'], ( 1 * 3600 ) );


		////Regular Time (AutoDeduct Lunch)
		//$this->assertEquals( 100, $udt_arr[$date_epoch][7]['object_type_id'] );                             //Regular Time
		//$this->assertEquals( $udt_arr[$date_epoch][7]['pay_code_id'], $this->policy_ids['pay_code'][190] ); //Regular Time
		//$this->assertEquals( 1637, $udt_arr[$date_epoch][7]['total_time'] );
		////Regular Time (AutoDeduct Lunch)
		//$this->assertEquals( 100, $udt_arr[$date_epoch][8]['object_type_id'] );                             //Regular Time
		//$this->assertEquals( $udt_arr[$date_epoch][8]['pay_code_id'], $this->policy_ids['pay_code'][190] ); //Regular Time
		//$this->assertEquals( 1963, $udt_arr[$date_epoch][8]['total_time'] );
		//Regular Time (AutoDeduct Lunch)
		$this->assertEquals( 100, $udt_arr[$date_epoch][5]['object_type_id'] );                             //Regular Time
		$this->assertEquals( $udt_arr[$date_epoch][5]['pay_code_id'], $this->policy_ids['pay_code'][190] ); //Regular Time
		$this->assertEquals( 3600, $udt_arr[$date_epoch][5]['total_time'] );

		//Make sure no other hours
		$this->assertCount( 6, $udt_arr[$date_epoch] );

		return true;
	}

	/**
	 * @group OvertimePolicy_testAutoAddMealAndOverTimePolicyB
	 */
	function testAutoAddMealAndOverTimePolicyB() {
		global $dd;

		$policy_ids['pay_formula_policy'][] = $this->createPayFormulaPolicy( $this->company_id, 200 ); //OT1.5
		$policy_ids['pay_formula_policy'][] = $this->createPayFormulaPolicy( $this->company_id, 210 ); //OT2.0
		$policy_ids['pay_formula_policy'][] = $this->createPayFormulaPolicy( $this->company_id, 220 ); //OT2.5

		$policy_ids['pay_code'][] = $this->createPayCode( $this->company_id, 100, $policy_ids['pay_formula_policy'][0] );
		$policy_ids['pay_code'][] = $this->createPayCode( $this->company_id, 110, $policy_ids['pay_formula_policy'][1] );
		$policy_ids['pay_code'][] = $this->createPayCode( $this->company_id, 120, $policy_ids['pay_formula_policy'][2] );
		$policy_ids['pay_code'][] = $this->createPayCode( $this->company_id, 190, $policy_ids['pay_formula_policy'][0] );

		//*Don't* include meal/break in regular time, keep it separate for this test.
		$policy_ids['overtime'][] = $this->createOverTimePolicy( $this->company_id, 90, $this->policy_ids['contributing_shift_policy'][12], $policy_ids['pay_code'][0] ); //Include Meal/Break.

		$policy_ids['meal'][] = $this->createMealPolicy( $this->company_id, 100 ); //Normal 1hr

		$policy_ids['break'][] = $this->createBreakPolicy( $this->company_id, 150 );                        //AutoAdd 15mins


		//Create Policy Group
		$dd->createPolicyGroup( $this->company_id,
								$policy_ids['meal'], //Meal
								null, //Exception
								null, //Holiday
								$policy_ids['overtime'], //OT
								null, //Premium
								null, //Round
								[ $this->user_id ], //Users
								$policy_ids['break'], //Break
								null, //Accrual
								null, //Expense
								null, //Absence
								[ $this->policy_ids['regular'][10] ] //Regular *not* incl. meal/break
		);

		$date_epoch = TTDate::getMiddleDayEpoch( TTDate::getBeginWeekEpoch( time() ) );
		$date_stamp = TTDate::getDate( 'DATE', $date_epoch );

		$dd->createPunchPair( $this->user_id,
							  strtotime( $date_stamp . ' 7:00AM' ),
							  strtotime( $date_stamp . ' 10:00AM' ),
							  [
									  'in_type_id'    => 10,
									  'out_type_id'   => 30,
									  'branch_id'     => 0,
									  'department_id' => 0,
									  'job_id'        => 0,
									  'job_item_id'   => 0,
									  'punch_tag_id'  => []
							  ],
							  true
		);
		$dd->createPunchPair( $this->user_id,
							  strtotime( $date_stamp . ' 10:15AM' ),
							  strtotime( $date_stamp . ' 12:00PM' ),
							  [
									  'in_type_id'    => 30,
									  'out_type_id'   => 20,
									  'branch_id'     => 0,
									  'department_id' => 0,
									  'job_id'        => 0,
									  'job_item_id'   => 0,
									  'punch_tag_id'  => []
							  ],
							  true
		);

		$dd->createPunchPair( $this->user_id,
							  strtotime( $date_stamp . ' 12:30PM' ),
							  strtotime( $date_stamp . ' 3:00PM' ),
							  [
									  'in_type_id'    => 20,
									  'out_type_id'   => 10,
									  'branch_id'     => 0,
									  'department_id' => 0,
									  'job_id'        => 0,
									  'job_item_id'   => 0,
									  'punch_tag_id'  => []
							  ],
							  true
		);

		$dd->createPunchPair( $this->user_id,
							  strtotime( $date_stamp . ' 3:00PM' ),
							  strtotime( $date_stamp . ' 4:30PM' ),
							  [
									  'in_type_id'    => 10,
									  'out_type_id'   => 10,
									  'branch_id'     => 0,
									  'department_id' => 0,
									  'job_id'        => 0,
									  'job_item_id'   => 0,
									  'punch_tag_id'  => []
							  ],
							  true
		);

		$udt_arr = $this->getUserDateTotalArray( $date_epoch, $date_epoch );
		//print_r($udt_arr);

		//Total Time
		$this->assertEquals( 5, $udt_arr[$date_epoch][0]['object_type_id'] );                               //5=System Total
		$this->assertEquals( $udt_arr[$date_epoch][0]['pay_code_id'], TTUUID::getZeroID() );
		$this->assertEquals( $udt_arr[$date_epoch][0]['total_time'], ( 8.75 * 3600 ) );
		//Regular Time
		$this->assertEquals( 20, $udt_arr[$date_epoch][1]['object_type_id'] );                              //Regular Time
		$this->assertEquals( $udt_arr[$date_epoch][1]['pay_code_id'], $this->policy_ids['pay_code'][100] ); //Regular Time
		$this->assertEquals( $udt_arr[$date_epoch][1]['total_time'], ( 1.75 * 3600 ) );
		//Regular Time
		$this->assertEquals( 20, $udt_arr[$date_epoch][2]['object_type_id'] );                              //Regular Time
		$this->assertEquals( $udt_arr[$date_epoch][2]['pay_code_id'], $this->policy_ids['pay_code'][100] ); //Regular Time
		$this->assertEquals( $udt_arr[$date_epoch][2]['total_time'], ( 2.0 * 3600 ) );
		//Regular Time
		$this->assertEquals( 20, $udt_arr[$date_epoch][3]['object_type_id'] );                              //Regular Time
		$this->assertEquals( $udt_arr[$date_epoch][3]['pay_code_id'], $this->policy_ids['pay_code'][100] ); //Regular Time
		$this->assertEquals( $udt_arr[$date_epoch][3]['total_time'], ( 3 * 3600 ) );

		////OverTime -- This was compacted out with compactUserDateTotalDataBasedOnTimeStamps()
		//$this->assertEquals( 30, $udt_arr[$date_epoch][4]['object_type_id'] );                              //OverTime
		//$this->assertEquals( $udt_arr[$date_epoch][4]['pay_code_id'], $policy_ids['pay_code'][0] );         //OverTime
		//$this->assertEquals( $udt_arr[$date_epoch][4]['total_time'], ( 0.5 * 3600 ) );
		////OverTime -- This was compacted out with compactUserDateTotalDataBasedOnTimeStamps()
		//$this->assertEquals( 30, $udt_arr[$date_epoch][5]['object_type_id'] );                              //OverTime
		//$this->assertEquals( $udt_arr[$date_epoch][5]['pay_code_id'], $policy_ids['pay_code'][0] );         //OverTime
		//$this->assertEquals( $udt_arr[$date_epoch][5]['total_time'], ( 1.5 * 3600 ) );
		//OverTime
		$this->assertEquals( 30, $udt_arr[$date_epoch][4]['object_type_id'] );                              //OverTime
		$this->assertEquals( $udt_arr[$date_epoch][4]['pay_code_id'], $policy_ids['pay_code'][0] );         //OverTime
		$this->assertEquals( $udt_arr[$date_epoch][4]['total_time'], ( 2 * 3600 ) );


		//Regular Time (AutoAdd Break) -- This was compacted out with compactUserDateTotalDataBasedOnTimeStamps()
		//$this->assertEquals( 110, $udt_arr[$date_epoch][6]['object_type_id'] );                             //Regular Time
		//$this->assertEquals( $udt_arr[$date_epoch][6]['pay_code_id'], $this->policy_ids['pay_code'][192] ); //Break Time
		//$this->assertEquals( 155, $udt_arr[$date_epoch][6]['total_time'] );
		//Regular Time (AutoAdd Break) -- This was compacted out with compactUserDateTotalDataBasedOnTimeStamps()
		//$this->assertEquals( 110, $udt_arr[$date_epoch][7]['object_type_id'] );                             //Regular Time
		//$this->assertEquals( $udt_arr[$date_epoch][7]['pay_code_id'], $this->policy_ids['pay_code'][192] ); //Break Time
		//$this->assertEquals( 180, $udt_arr[$date_epoch][7]['total_time'] );
		//Regular Time (AutoAdd Break) -- This was compacted out with compactUserDateTotalDataBasedOnTimeStamps()
		//$this->assertEquals( 110, $udt_arr[$date_epoch][7]['object_type_id'] );                             //Regular Time
		//$this->assertEquals( $udt_arr[$date_epoch][7]['pay_code_id'], $this->policy_ids['pay_code'][192] ); //Break Time
		//$this->assertEquals( 308, $udt_arr[$date_epoch][7]['total_time'] );
		////Regular Time (AutoAdd Break) -- This was compacted out with compactUserDateTotalDataBasedOnTimeStamps()
		//$this->assertEquals( 110, $udt_arr[$date_epoch][8]['object_type_id'] );                             //Regular Time
		//$this->assertEquals( $udt_arr[$date_epoch][8]['pay_code_id'], $this->policy_ids['pay_code'][192] ); //Break Time
		//$this->assertEquals( 437, $udt_arr[$date_epoch][8]['total_time'] );
		//Regular Time (AutoAdd Break)
		$this->assertEquals( 110, $udt_arr[$date_epoch][5]['object_type_id'] );                             //Regular Time
		$this->assertEquals( $udt_arr[$date_epoch][5]['pay_code_id'], $this->policy_ids['pay_code'][192] ); //Break Time
		$this->assertEquals( 900, $udt_arr[$date_epoch][5]['total_time'] );

		//Make sure no other hours
		$this->assertCount( 6, $udt_arr[$date_epoch] );

		return true;
	}

	/**
	 * @group OvertimePolicy_testAutoDeductMealAndBreakAndOverTimePolicyA
	 */
	function testAutoDeductMealAndBreakAndOverTimePolicyA() {
		global $dd;

		$policy_ids['pay_formula_policy'][] = $this->createPayFormulaPolicy( $this->company_id, 200 ); //OT1.5
		$policy_ids['pay_formula_policy'][] = $this->createPayFormulaPolicy( $this->company_id, 210 ); //OT2.0
		$policy_ids['pay_formula_policy'][] = $this->createPayFormulaPolicy( $this->company_id, 220 ); //OT2.5

		$policy_ids['pay_code'][] = $this->createPayCode( $this->company_id, 100, $policy_ids['pay_formula_policy'][0] );
		$policy_ids['pay_code'][] = $this->createPayCode( $this->company_id, 110, $policy_ids['pay_formula_policy'][1] );
		$policy_ids['pay_code'][] = $this->createPayCode( $this->company_id, 120, $policy_ids['pay_formula_policy'][2] );
		$policy_ids['pay_code'][] = $this->createPayCode( $this->company_id, 190, $policy_ids['pay_formula_policy'][0] );

		//Don't include meal/break in overtime. Include it in Regular time instead.
		$policy_ids['overtime'][] = $this->createOverTimePolicy( $this->company_id, 100, $this->policy_ids['contributing_shift_policy'][10], $policy_ids['pay_code'][0] );
		//$policy_ids['overtime'][] = $this->createOverTimePolicy( $this->company_id, 110, $this->policy_ids['contributing_shift_policy'][10], $policy_ids['pay_code'][1] );
		//$policy_ids['overtime'][] = $this->createOverTimePolicy( $this->company_id, 120, $this->policy_ids['contributing_shift_policy'][10], $policy_ids['pay_code'][2] );

		$policy_ids['meal'][] = $this->createMealPolicy( $this->company_id, 120 );                          //AutoDeduct 1hr
		$policy_ids['break'][] = $this->createBreakPolicy( $this->company_id, 130 );                        //AutoDeduct 30min

		//Create Policy Group
		$dd->createPolicyGroup( $this->company_id,
								$policy_ids['meal'], //Meal
								null, //Exception
								null, //Holiday
								$policy_ids['overtime'], //OT
								null, //Premium
								null, //Round
								[ $this->user_id ], //Users
								$policy_ids['break'], //Break
								null, //Accrual
								null, //Expense
								null, //Absence
								[ $this->policy_ids['regular'][12] ] //Regular incl. meal/break
		);

		$date_epoch = TTDate::getMiddleDayEpoch( TTDate::getBeginWeekEpoch( time() ) );
		$date_stamp = TTDate::getDate( 'DATE', $date_epoch );

		$dd->createPunchPair( $this->user_id,
							  strtotime( $date_stamp . ' 8:00AM' ),
							  strtotime( $date_stamp . ' 5:30PM' ),
							  [
									  'in_type_id'    => 10,
									  'out_type_id'   => 10,
									  'branch_id'     => 0,
									  'department_id' => 0,
									  'job_id'        => 0,
									  'job_item_id'   => 0,
									  'punch_tag_id'  => []
							  ],
							  true
		);

		$udt_arr = $this->getUserDateTotalArray( $date_epoch, $date_epoch );
		//print_r($udt_arr);

		//Total Time
		$this->assertEquals( 5, $udt_arr[$date_epoch][0]['object_type_id'] );                               //5=System Total
		$this->assertEquals( $udt_arr[$date_epoch][0]['pay_code_id'], TTUUID::getZeroID() );
		$this->assertEquals( $udt_arr[$date_epoch][0]['total_time'], ( 8 * 3600 ) );
		//Regular Time
		$this->assertEquals( 20, $udt_arr[$date_epoch][1]['object_type_id'] );                              //Regular Time
		$this->assertEquals( $udt_arr[$date_epoch][1]['pay_code_id'], $this->policy_ids['pay_code'][100] ); //Regular Time
		$this->assertEquals( $udt_arr[$date_epoch][1]['total_time'], ( 8 * 3600 ) );

		//Regular Time (AutoDeduct Lunch)
		$this->assertEquals( 100, $udt_arr[$date_epoch][2]['object_type_id'] );                             //Regular Time
		$this->assertEquals( $udt_arr[$date_epoch][2]['pay_code_id'], $this->policy_ids['pay_code'][190] ); //Regular Time
		$this->assertEquals( $udt_arr[$date_epoch][2]['total_time'], ( -1 * 3600 ) );

		//Regular Time (AutoDeduct Break)
		$this->assertEquals( 110, $udt_arr[$date_epoch][3]['object_type_id'] );                             //Regular Time
		$this->assertEquals( $udt_arr[$date_epoch][3]['pay_code_id'], $this->policy_ids['pay_code'][192] ); //Regular Time
		$this->assertEquals( $udt_arr[$date_epoch][3]['total_time'], ( -0.5 * 3600 ) );

		//Make sure no other hours
		$this->assertCount( 4, $udt_arr[$date_epoch] );

		return true;
	}

	/**
	 * @group OvertimePolicy_testAutoDeductMealAndBreakAndOverTimePolicyB
	 */
	function testAutoDeductMealAndBreakAndOverTimePolicyB() {
		global $dd;

		$policy_ids['pay_formula_policy'][] = $this->createPayFormulaPolicy( $this->company_id, 200 ); //OT1.5
		$policy_ids['pay_formula_policy'][] = $this->createPayFormulaPolicy( $this->company_id, 210 ); //OT2.0
		$policy_ids['pay_formula_policy'][] = $this->createPayFormulaPolicy( $this->company_id, 220 ); //OT2.5

		$policy_ids['pay_code'][] = $this->createPayCode( $this->company_id, 100, $policy_ids['pay_formula_policy'][0] );
		$policy_ids['pay_code'][] = $this->createPayCode( $this->company_id, 110, $policy_ids['pay_formula_policy'][1] );
		$policy_ids['pay_code'][] = $this->createPayCode( $this->company_id, 120, $policy_ids['pay_formula_policy'][2] );
		$policy_ids['pay_code'][] = $this->createPayCode( $this->company_id, 190, $policy_ids['pay_formula_policy'][0] );

		//Don't include meal/break in overtime. Include it in Regular time instead.
		$policy_ids['overtime'][] = $this->createOverTimePolicy( $this->company_id, 100, $this->policy_ids['contributing_shift_policy'][10], $policy_ids['pay_code'][0] );
		//$policy_ids['overtime'][] = $this->createOverTimePolicy( $this->company_id, 110, $this->policy_ids['contributing_shift_policy'][10], $policy_ids['pay_code'][1] );
		//$policy_ids['overtime'][] = $this->createOverTimePolicy( $this->company_id, 120, $this->policy_ids['contributing_shift_policy'][10], $policy_ids['pay_code'][2] );

		$policy_ids['meal'][] = $this->createMealPolicy( $this->company_id, 120 );                          //AutoDeduct 1hr
		$policy_ids['break'][] = $this->createBreakPolicy( $this->company_id, 130 );                        //AutoDeduct 30min

		//Create Policy Group
		$dd->createPolicyGroup( $this->company_id,
								$policy_ids['meal'], //Meal
								null, //Exception
								null, //Holiday
								$policy_ids['overtime'], //OT
								null, //Premium
								null, //Round
								[ $this->user_id ], //Users
								$policy_ids['break'], //Break
								null, //Accrual
								null, //Expense
								null, //Absence
								[ $this->policy_ids['regular'][12] ] //Regular incl. meal/break
		);

		$date_epoch = TTDate::getMiddleDayEpoch( TTDate::getBeginWeekEpoch( time() ) );
		$date_stamp = TTDate::getDate( 'DATE', $date_epoch );

		$dd->createPunchPair( $this->user_id,
							  strtotime( $date_stamp . ' 8:00AM' ),
							  strtotime( $date_stamp . ' 6:00PM' ),
							  [
									  'in_type_id'    => 10,
									  'out_type_id'   => 10,
									  'branch_id'     => 0,
									  'department_id' => 0,
									  'job_id'        => 0,
									  'job_item_id'   => 0,
									  'punch_tag_id'  => []
							  ],
							  true
		);

		$udt_arr = $this->getUserDateTotalArray( $date_epoch, $date_epoch );
		//print_r($udt_arr);

		//Total Time
		$this->assertEquals( 5, $udt_arr[$date_epoch][0]['object_type_id'] );                               //5=System Total
		$this->assertEquals( $udt_arr[$date_epoch][0]['pay_code_id'], TTUUID::getZeroID() );
		$this->assertEquals( $udt_arr[$date_epoch][0]['total_time'], ( 8.5 * 3600 ) );
		//Regular Time
		$this->assertEquals( 20, $udt_arr[$date_epoch][1]['object_type_id'] );                              //Regular Time
		$this->assertEquals( $udt_arr[$date_epoch][1]['pay_code_id'], $this->policy_ids['pay_code'][100] ); //Regular Time
		$this->assertEquals( $udt_arr[$date_epoch][1]['total_time'], ( 8 * 3600 ) );

		//OverTime
		$this->assertEquals( 30, $udt_arr[$date_epoch][2]['object_type_id'] );                              //Regular Time
		$this->assertEquals( $udt_arr[$date_epoch][2]['pay_code_id'], $policy_ids['pay_code'][0] );         //Overtime
		$this->assertEquals( $udt_arr[$date_epoch][2]['total_time'], ( 0.5 * 3600 ) );

		//Regular Time (AutoDeduct Lunch)
		$this->assertEquals( 100, $udt_arr[$date_epoch][3]['object_type_id'] );                             //Regular Time
		$this->assertEquals( $udt_arr[$date_epoch][3]['pay_code_id'], $this->policy_ids['pay_code'][190] ); //Regular Time
		$this->assertEquals( $udt_arr[$date_epoch][3]['total_time'], ( -1 * 3600 ) );

		//Regular Time (AutoDeduct Break)
		$this->assertEquals( 110, $udt_arr[$date_epoch][4]['object_type_id'] );                             //Regular Time
		$this->assertEquals( $udt_arr[$date_epoch][4]['pay_code_id'], $this->policy_ids['pay_code'][192] ); //Regular Time
		$this->assertEquals( $udt_arr[$date_epoch][4]['total_time'], ( -0.5 * 3600 ) );

		//Make sure no other hours
		$this->assertCount( 5, $udt_arr[$date_epoch] );

		return true;
	}

	//
	// Test OverTime Policy Differential Criteria.
	//

	/**
	 * @group OvertimePolicy_testNestedDifferentialDailyOverTimePolicyA
	 */
	function testNestedDifferentialDailyOverTimePolicyA() {
		if ( getTTProductEdition() == TT_PRODUCT_COMMUNITY ) {
			return true;
		}

		global $dd;

		$policy_ids['pay_formula_policy'][] = $this->createPayFormulaPolicy( $this->company_id, 200 ); //OT1.5
		$policy_ids['pay_formula_policy'][] = $this->createPayFormulaPolicy( $this->company_id, 210 ); //OT2.0
		$policy_ids['pay_formula_policy'][] = $this->createPayFormulaPolicy( $this->company_id, 220 ); //OT2.5

		//Daily
		$policy_ids['pay_code'][] = $this->createPayCode( $this->company_id, 100, $policy_ids['pay_formula_policy'][0] );
		$policy_ids['pay_code'][] = $this->createPayCode( $this->company_id, 110, $policy_ids['pay_formula_policy'][1] );
		//$policy_ids['pay_code'][]  = $this->createPayCode( $this->company_id, 120, $policy_ids['pay_formula_policy'][2] );

		$policy_ids['overtime'][] = $this->createOverTimePolicy( $this->company_id, 10, $this->policy_ids['contributing_shift_policy'][12], $this->policy_ids['pay_code'][100] ); //Regular Time policy as OT policy.
		$policy_ids['overtime'][] = $this->createOverTimePolicy( $this->company_id, 100, $this->policy_ids['contributing_shift_policy'][12], $policy_ids['pay_code'][0] );
		$policy_ids['overtime'][] = $this->createOverTimePolicy( $this->company_id, 1000, $this->policy_ids['contributing_shift_policy'][12], $policy_ids['pay_code'][1] );
		//$policy_ids['overtime'][] = $this->createOverTimePolicy( $this->company_id, 1001, $this->policy_ids['contributing_shift_policy'][12], $policy_ids['pay_code'][2] );
		//$policy_ids['overtime'][] = $this->createOverTimePolicy( $this->company_id, 230, $this->policy_ids['contributing_shift_policy'][12], $policy_ids['pay_code'][3] );

		//Create Policy Group
		$dd->createPolicyGroup( $this->company_id,
								null, //Meal
								null, //Exception
								null, //Holiday
								$policy_ids['overtime'], //OT
								null, //Premium
								null, //Round
								[ $this->user_id ], //Users
								null, //Break
								null, //Accrual
								null, //Expense
								null, //Absence
								[ $this->policy_ids['regular'][12] ] //Regular
		);


		$date_epoch = TTDate::getMiddleDayEpoch( TTDate::getBeginWeekEpoch( time() ) );
		$date_stamp = TTDate::getDate( 'DATE', $date_epoch );

		//
		//Day of Week: 1
		//
		$dd->createPunchPair( $this->user_id,
							  strtotime( $date_stamp . ' 8:00AM' ),
							  strtotime( $date_stamp . ' 8:00PM' ),
							  [
									  'in_type_id'    => 10,
									  'out_type_id'   => 10,
									  'branch_id'     => 0,
									  'department_id' => 0,
									  'job_id'        => 0,
									  'job_item_id'   => 0,
									  'punch_tag_id'  => []
							  ],
							  true
		);

		$udt_arr = $this->getUserDateTotalArray( $date_epoch, $date_epoch );
		//print_r($udt_arr);

		//Total Time
		$this->assertEquals( 5, $udt_arr[$date_epoch][0]['object_type_id'] );                                                                                                     //5=System Total
		$this->assertEquals( $udt_arr[$date_epoch][0]['pay_code_id'], TTUUID::getZeroID() );
		$this->assertEquals( $udt_arr[$date_epoch][0]['total_time'], ( 12 * 3600 ) );
		//OverTime as Regular Time
		$this->assertEquals( 30, $udt_arr[$date_epoch][1]['object_type_id'] );                                                                                                    //Overtime
		$this->assertEquals( $udt_arr[$date_epoch][1]['pay_code_id'], $policy_ids['pay_code'][0] );                                                                               //Regular Time
		$this->assertEquals( $udt_arr[$date_epoch][1]['total_time'], ( 4 * 3600 ) );
		//Overtime1
		$this->assertEquals( 30, $udt_arr[$date_epoch][2]['object_type_id'] );                                                                                                    //Overtime
		$this->assertEquals( $udt_arr[$date_epoch][2]['pay_code_id'], $this->policy_ids['pay_code'][100] );
		$this->assertEquals( $udt_arr[$date_epoch][2]['total_time'], ( 8 * 3600 ) );

		//Make sure no other hours
		$this->assertCount( 3, $udt_arr[$date_epoch] );

		return true;
	}

	/**
	 * @group OvertimePolicy_testNestedDifferentialDailyOverTimePolicyB
	 */
	function testNestedDifferentialDailyOverTimePolicyB() {
		if ( getTTProductEdition() == TT_PRODUCT_COMMUNITY ) {
			return true;
		}

		global $dd;

		$policy_ids['pay_formula_policy'][] = $this->createPayFormulaPolicy( $this->company_id, 200 ); //OT1.5
		$policy_ids['pay_formula_policy'][] = $this->createPayFormulaPolicy( $this->company_id, 210 ); //OT2.0
		$policy_ids['pay_formula_policy'][] = $this->createPayFormulaPolicy( $this->company_id, 220 ); //OT2.5

		//Daily
		$policy_ids['pay_code'][] = $this->createPayCode( $this->company_id, 100, $policy_ids['pay_formula_policy'][0] );
		$policy_ids['pay_code'][] = $this->createPayCode( $this->company_id, 110, $policy_ids['pay_formula_policy'][1] );
		//$policy_ids['pay_code'][]  = $this->createPayCode( $this->company_id, 120, $policy_ids['pay_formula_policy'][2] );

		$policy_ids['overtime'][] = $this->createOverTimePolicy( $this->company_id, 10, $this->policy_ids['contributing_shift_policy'][12], $this->policy_ids['pay_code'][100] ); //Regular Time policy as OT policy.
		$policy_ids['overtime'][] = $this->createOverTimePolicy( $this->company_id, 100, $this->policy_ids['contributing_shift_policy'][12], $policy_ids['pay_code'][0] );
		$policy_ids['overtime'][] = $this->createOverTimePolicy( $this->company_id, 1000, $this->policy_ids['contributing_shift_policy'][12], $policy_ids['pay_code'][1] );
		//$policy_ids['overtime'][] = $this->createOverTimePolicy( $this->company_id, 1001, $this->policy_ids['contributing_shift_policy'][12], $policy_ids['pay_code'][2] );
		//$policy_ids['overtime'][] = $this->createOverTimePolicy( $this->company_id, 230, $this->policy_ids['contributing_shift_policy'][12], $policy_ids['pay_code'][3] );

		//Create Policy Group
		$dd->createPolicyGroup( $this->company_id,
								null, //Meal
								null, //Exception
								null, //Holiday
								$policy_ids['overtime'], //OT
								null, //Premium
								null, //Round
								[ $this->user_id ], //Users
								null, //Break
								null, //Accrual
								null, //Expense
								null, //Absence
								[ $this->policy_ids['regular'][12] ] //Regular
		);


		$date_epoch = TTDate::getMiddleDayEpoch( TTDate::getBeginWeekEpoch( time() ) );
		$date_stamp = TTDate::getDate( 'DATE', $date_epoch );

		//
		//Day of Week: 1
		//
		$dd->createPunchPair( $this->user_id,
							  strtotime( $date_stamp . ' 8:00AM' ),
							  strtotime( $date_stamp . ' 8:00PM' ),
							  [
									  'in_type_id'    => 10,
									  'out_type_id'   => 10,
									  'branch_id'     => $this->branch_ids[0],
									  'department_id' => 0,
									  'job_id'        => 0,
									  'job_item_id'   => 0,
									  'punch_tag_id'  => []
							  ],
							  true
		);

		$udt_arr = $this->getUserDateTotalArray( $date_epoch, $date_epoch );
		//print_r($udt_arr);

		//Total Time
		$this->assertEquals( 5, $udt_arr[$date_epoch][0]['object_type_id'] );                                                                                                     //5=System Total
		$this->assertEquals( $udt_arr[$date_epoch][0]['pay_code_id'], TTUUID::getZeroID() );
		$this->assertEquals( $udt_arr[$date_epoch][0]['total_time'], ( 12 * 3600 ) );
		//OverTime as Regular Time
		$this->assertEquals( 30, $udt_arr[$date_epoch][1]['object_type_id'] );                                                                                                    //Overtime
		$this->assertEquals( $udt_arr[$date_epoch][1]['pay_code_id'], $policy_ids['pay_code'][1] );                                                                               //OverTime
		$this->assertEquals( $udt_arr[$date_epoch][1]['total_time'], ( 4 * 3600 ) );
		//Overtime1
		$this->assertEquals( 30, $udt_arr[$date_epoch][2]['object_type_id'] );                                                                                                    //Overtime
		$this->assertEquals( $udt_arr[$date_epoch][2]['pay_code_id'], $this->policy_ids['pay_code'][100] );
		$this->assertEquals( $udt_arr[$date_epoch][2]['total_time'], ( 8 * 3600 ) );

		//Make sure no other hours
		$this->assertCount( 3, $udt_arr[$date_epoch] );

		return true;
	}

	/**
	 * @group OvertimePolicy_testNestedDifferentialWeeklyOverTimePolicyA
	 */
	function testNestedDifferentialWeeklyOverTimePolicyA() {
		if ( getTTProductEdition() == TT_PRODUCT_COMMUNITY ) {
			return true;
		}

		global $dd;

		$policy_ids['pay_formula_policy'][] = $this->createPayFormulaPolicy( $this->company_id, 200 ); //OT1.5
		$policy_ids['pay_formula_policy'][] = $this->createPayFormulaPolicy( $this->company_id, 210 ); //OT2.0
		$policy_ids['pay_formula_policy'][] = $this->createPayFormulaPolicy( $this->company_id, 220 ); //OT2.5

		//Daily
		$policy_ids['pay_code'][] = $this->createPayCode( $this->company_id, 100, $policy_ids['pay_formula_policy'][0] );
		$policy_ids['pay_code'][] = $this->createPayCode( $this->company_id, 110, $policy_ids['pay_formula_policy'][1] );
		//$policy_ids['pay_code'][]  = $this->createPayCode( $this->company_id, 120, $policy_ids['pay_formula_policy'][2] );

		$policy_ids['overtime'][] = $this->createOverTimePolicy( $this->company_id, 10, $this->policy_ids['contributing_shift_policy'][12], $this->policy_ids['pay_code'][100] ); //Regular Time policy as OT policy.
		$policy_ids['overtime'][] = $this->createOverTimePolicy( $this->company_id, 240, $this->policy_ids['contributing_shift_policy'][12], $policy_ids['pay_code'][0] );
		$policy_ids['overtime'][] = $this->createOverTimePolicy( $this->company_id, 1241, $this->policy_ids['contributing_shift_policy'][12], $policy_ids['pay_code'][1] );
		//$policy_ids['overtime'][] = $this->createOverTimePolicy( $this->company_id, 1001, $this->policy_ids['contributing_shift_policy'][12], $policy_ids['pay_code'][2] );
		//$policy_ids['overtime'][] = $this->createOverTimePolicy( $this->company_id, 230, $this->policy_ids['contributing_shift_policy'][12], $policy_ids['pay_code'][3] );

		//Create Policy Group
		$dd->createPolicyGroup( $this->company_id,
								null, //Meal
								null, //Exception
								null, //Holiday
								$policy_ids['overtime'], //OT
								null, //Premium
								null, //Round
								[ $this->user_id ], //Users
								null, //Break
								null, //Accrual
								null, //Expense
								null, //Absence
								[ $this->policy_ids['regular'][12] ] //Regular
		);


		$date_epoch = TTDate::getMiddleDayEpoch( TTDate::getBeginWeekEpoch( time() ) );
		$date_stamp = TTDate::getDate( 'DATE', $date_epoch );

		//
		//Day of Week: 1
		//
		$dd->createPunchPair( $this->user_id,
							  strtotime( $date_stamp . ' 8:00AM' ),
							  strtotime( $date_stamp . ' 4:00PM' ),
							  [
									  'in_type_id'    => 10,
									  'out_type_id'   => 10,
									  'branch_id'     => $this->branch_ids[0],
									  'department_id' => 0,
									  'job_id'        => 0,
									  'job_item_id'   => 0,
									  'punch_tag_id'  => []
							  ],
							  true
		);

		$udt_arr = $this->getUserDateTotalArray( $date_epoch, $date_epoch );
		//print_r($udt_arr);

		//Total Time
		$this->assertEquals( 5, $udt_arr[$date_epoch][0]['object_type_id'] );                                                                                                     //5=System Total
		$this->assertEquals( $udt_arr[$date_epoch][0]['pay_code_id'], TTUUID::getZeroID() );
		$this->assertEquals( $udt_arr[$date_epoch][0]['total_time'], ( 8 * 3600 ) );
		//OverTime as Regular Time
		$this->assertEquals( 30, $udt_arr[$date_epoch][1]['object_type_id'] );                                                                                                    //Overtime
		$this->assertEquals( $udt_arr[$date_epoch][1]['pay_code_id'], $this->policy_ids['pay_code'][100] );                                                                       //OverTime
		$this->assertEquals( $udt_arr[$date_epoch][1]['total_time'], ( 8 * 3600 ) );
		//Make sure no other hours
		$this->assertCount( 2, $udt_arr[$date_epoch] );

		//
		//Day of Week: 2
		//
		$date_epoch = TTDate::incrementDate( TTDate::getMiddleDayEpoch( TTDate::getBeginWeekEpoch( time() ) ), 1, 'day' );
		$date_stamp = TTDate::getDate( 'DATE', $date_epoch );

		$dd->createPunchPair( $this->user_id,
							  strtotime( $date_stamp . ' 8:00AM' ),
							  strtotime( $date_stamp . ' 4:00PM' ),
							  [
									  'in_type_id'    => 10,
									  'out_type_id'   => 10,
									  'branch_id'     => $this->branch_ids[0],
									  'department_id' => TTUUID::getZeroID(),
									  'job_id'        => TTUUID::getZeroID(),
									  'job_item_id'   => TTUUID::getZeroID(),
									  'punch_tag_id'  => [],
							  ],
							  true
		);

		$udt_arr = $this->getUserDateTotalArray( $date_epoch, $date_epoch );
		//print_r($udt_arr);

		//Total Time
		$this->assertEquals( 5, $udt_arr[$date_epoch][0]['object_type_id'] );                                                                                                     //5=System Total
		$this->assertEquals( $udt_arr[$date_epoch][0]['pay_code_id'], TTUUID::getZeroID() );
		$this->assertEquals( $udt_arr[$date_epoch][0]['total_time'], ( 8 * 3600 ) );
		//OverTime as Regular Time
		$this->assertEquals( 30, $udt_arr[$date_epoch][1]['object_type_id'] );                                                                                                    //Overtime
		$this->assertEquals( $udt_arr[$date_epoch][1]['pay_code_id'], $this->policy_ids['pay_code'][100] );                                                                       //OverTime
		$this->assertEquals( $udt_arr[$date_epoch][1]['total_time'], ( 8 * 3600 ) );
		//Make sure no other hours
		$this->assertCount( 2, $udt_arr[$date_epoch] );

		//
		//Day of Week: 3
		//
		$date_epoch = TTDate::incrementDate( TTDate::getMiddleDayEpoch( TTDate::getBeginWeekEpoch( time() ) ), 2, 'day' );
		$date_stamp = TTDate::getDate( 'DATE', $date_epoch );

		$dd->createPunchPair( $this->user_id,
							  strtotime( $date_stamp . ' 8:00AM' ),
							  strtotime( $date_stamp . ' 4:00PM' ),
							  [
									  'in_type_id'    => 10,
									  'out_type_id'   => 10,
									  'branch_id'     => $this->branch_ids[0],
									  'department_id' => TTUUID::getZeroID(),
									  'job_id'        => TTUUID::getZeroID(),
									  'job_item_id'   => TTUUID::getZeroID(),
									  'punch_tag_id'  => [],
							  ],
							  true
		);

		$udt_arr = $this->getUserDateTotalArray( $date_epoch, $date_epoch );
		//print_r($udt_arr);

		//Total Time
		$this->assertEquals( 5, $udt_arr[$date_epoch][0]['object_type_id'] );                                                                                                     //5=System Total
		$this->assertEquals( $udt_arr[$date_epoch][0]['pay_code_id'], TTUUID::getZeroID() );
		$this->assertEquals( $udt_arr[$date_epoch][0]['total_time'], ( 8 * 3600 ) );
		//OverTime as Regular Time
		$this->assertEquals( 30, $udt_arr[$date_epoch][1]['object_type_id'] );                                                                                                    //Overtime
		$this->assertEquals( $udt_arr[$date_epoch][1]['pay_code_id'], $this->policy_ids['pay_code'][100] );                                                                       //OverTime
		$this->assertEquals( $udt_arr[$date_epoch][1]['total_time'], ( 8 * 3600 ) );
		//Make sure no other hours
		$this->assertCount( 2, $udt_arr[$date_epoch] );

		//
		//Day of Week: 4
		//
		$date_epoch = TTDate::incrementDate( TTDate::getMiddleDayEpoch( TTDate::getBeginWeekEpoch( time() ) ), 3, 'day' );
		$date_stamp = TTDate::getDate( 'DATE', $date_epoch );

		$dd->createPunchPair( $this->user_id,
							  strtotime( $date_stamp . ' 8:00AM' ),
							  strtotime( $date_stamp . ' 4:00PM' ),
							  [
									  'in_type_id'    => 10,
									  'out_type_id'   => 10,
									  'branch_id'     => $this->branch_ids[0],
									  'department_id' => TTUUID::getZeroID(),
									  'job_id'        => TTUUID::getZeroID(),
									  'job_item_id'   => TTUUID::getZeroID(),
									  'punch_tag_id'  => [],
							  ],
							  true
		);

		$udt_arr = $this->getUserDateTotalArray( $date_epoch, $date_epoch );
		//print_r($udt_arr);

		//Total Time
		$this->assertEquals( 5, $udt_arr[$date_epoch][0]['object_type_id'] );                                                                                                     //5=System Total
		$this->assertEquals( $udt_arr[$date_epoch][0]['pay_code_id'], TTUUID::getZeroID() );
		$this->assertEquals( $udt_arr[$date_epoch][0]['total_time'], ( 8 * 3600 ) );
		//OverTime as Regular Time
		$this->assertEquals( 30, $udt_arr[$date_epoch][1]['object_type_id'] );                                                                                                    //Overtime
		$this->assertEquals( $udt_arr[$date_epoch][1]['pay_code_id'], $this->policy_ids['pay_code'][100] );                                                                       //OverTime
		$this->assertEquals( $udt_arr[$date_epoch][1]['total_time'], ( 8 * 3600 ) );
		//Make sure no other hours
		$this->assertCount( 2, $udt_arr[$date_epoch] );


		//
		//Day of Week: 5
		//
		$date_epoch = TTDate::incrementDate( TTDate::getMiddleDayEpoch( TTDate::getBeginWeekEpoch( time() ) ), 4, 'day' );
		$date_stamp = TTDate::getDate( 'DATE', $date_epoch );

		$dd->createPunchPair( $this->user_id,
							  strtotime( $date_stamp . ' 8:00AM' ),
							  strtotime( $date_stamp . ' 8:30AM' ),
							  [
									  'in_type_id'    => 10,
									  'out_type_id'   => 10,
									  'branch_id'     => $this->branch_ids[0],
									  'department_id' => TTUUID::getZeroID(),
									  'job_id'        => TTUUID::getZeroID(),
									  'job_item_id'   => TTUUID::getZeroID(),
									  'punch_tag_id'  => [],
							  ],
							  true
		);

		$dd->createPunchPair( $this->user_id,
							  strtotime( $date_stamp . ' 8:30AM' ),
							  strtotime( $date_stamp . ' 9:15AM' ),
							  [
									  'in_type_id'    => 10,
									  'out_type_id'   => 10,
									  'branch_id'     => $this->branch_ids[0],
									  'department_id' => TTUUID::getZeroID(),
									  'job_id'        => TTUUID::getZeroID(),
									  'job_item_id'   => TTUUID::getZeroID(),
									  'punch_tag_id'  => [],
							  ],
							  true
		);

		$dd->createPunchPair( $this->user_id,
							  strtotime( $date_stamp . ' 9:15AM' ),
							  strtotime( $date_stamp . ' 12:00PM' ),
							  [
									  'in_type_id'    => 10,
									  'out_type_id'   => 20,
									  'branch_id'     => $this->branch_ids[0],
									  'department_id' => TTUUID::getZeroID(),
									  'job_id'        => TTUUID::getZeroID(),
									  'job_item_id'   => TTUUID::getZeroID(),
									  'punch_tag_id'  => [],
							  ],
							  true
		);

		$dd->createPunchPair( $this->user_id,
							  strtotime( $date_stamp . ' 12:45PM' ),
							  strtotime( $date_stamp . ' 4:45PM' ),
							  [
									  'in_type_id'    => 20,
									  'out_type_id'   => 10,
									  'branch_id'     => $this->branch_ids[0],
									  'department_id' => TTUUID::getZeroID(),
									  'job_id'        => TTUUID::getZeroID(),
									  'job_item_id'   => TTUUID::getZeroID(),
									  'punch_tag_id'  => [],
							  ],
							  true
		);

		$udt_arr = $this->getUserDateTotalArray( $date_epoch, $date_epoch );
		//print_r($udt_arr);

		//Total Time
		$this->assertEquals( 5, $udt_arr[$date_epoch][0]['object_type_id'] );                                                                                                     //5=System Total
		$this->assertEquals( $udt_arr[$date_epoch][0]['pay_code_id'], TTUUID::getZeroID() );
		$this->assertEquals( $udt_arr[$date_epoch][0]['total_time'], ( 8 * 3600 ) );
		//OverTime
		$this->assertEquals( 30, $udt_arr[$date_epoch][1]['object_type_id'] );                                                                                                    //Overtime
		$this->assertEquals( $udt_arr[$date_epoch][1]['pay_code_id'], $policy_ids['pay_code'][1] );                                                                               //OverTime
		$this->assertEquals( $udt_arr[$date_epoch][1]['total_time'], ( 1 * 3600 ) );
		////OverTime as Regular Time
		//$this->assertEquals( 30, $udt_arr[$date_epoch][2]['object_type_id'] );                                                                                                    //Overtime
		//$this->assertEquals( $udt_arr[$date_epoch][2]['pay_code_id'], $this->policy_ids['pay_code'][100] );                                                                       //OverTime
		//$this->assertEquals( $udt_arr[$date_epoch][2]['total_time'], ( 0.5 * 3600 ) );
		////OverTime as Regular Time
		//$this->assertEquals( 30, $udt_arr[$date_epoch][3]['object_type_id'] );                                                                                                    //Overtime
		//$this->assertEquals( $udt_arr[$date_epoch][3]['pay_code_id'], $this->policy_ids['pay_code'][100] );                                                                       //OverTime
		//$this->assertEquals( $udt_arr[$date_epoch][3]['total_time'], ( 0.75 * 3600 ) );
		//OverTime as Regular Time
		$this->assertEquals( 30, $udt_arr[$date_epoch][2]['object_type_id'] );                                                                                                    //Overtime
		$this->assertEquals( $udt_arr[$date_epoch][2]['pay_code_id'], $this->policy_ids['pay_code'][100] );                                                                       //OverTime
		$this->assertEquals( $udt_arr[$date_epoch][2]['total_time'], ( 1.25 * 3600 ) );
		//OverTime as Regular Time
		$this->assertEquals( 30, $udt_arr[$date_epoch][3]['object_type_id'] );                                                                                                    //Overtime
		$this->assertEquals( $udt_arr[$date_epoch][3]['pay_code_id'], $this->policy_ids['pay_code'][100] );                                                                       //OverTime
		$this->assertEquals( $udt_arr[$date_epoch][3]['total_time'], ( 2.75 * 3600 ) );
		//OverTime as Regular Time
		$this->assertEquals( 30, $udt_arr[$date_epoch][4]['object_type_id'] );                                                                                                    //Overtime
		$this->assertEquals( $udt_arr[$date_epoch][4]['pay_code_id'], $this->policy_ids['pay_code'][100] );                                                                       //OverTime
		$this->assertEquals( $udt_arr[$date_epoch][4]['total_time'], ( 3 * 3600 ) );

		//Make sure no other hours
		$this->assertCount( 5, $udt_arr[$date_epoch] );

		return true;
	}

	/**
	 * @group OvertimePolicy_testNestedDifferentialWeeklyOverTimePolicyB
	 */
	function testNestedDifferentialWeeklyOverTimePolicyB() {
		if ( getTTProductEdition() == TT_PRODUCT_COMMUNITY ) {
			return true;
		}

		global $dd;

		$policy_ids['pay_formula_policy'][] = $this->createPayFormulaPolicy( $this->company_id, 200 ); //OT1.5
		$policy_ids['pay_formula_policy'][] = $this->createPayFormulaPolicy( $this->company_id, 210 ); //OT2.0
		$policy_ids['pay_formula_policy'][] = $this->createPayFormulaPolicy( $this->company_id, 220 ); //OT2.5

		//Daily
		$policy_ids['pay_code'][] = $this->createPayCode( $this->company_id, 100, $policy_ids['pay_formula_policy'][0] );
		$policy_ids['pay_code'][] = $this->createPayCode( $this->company_id, 110, $policy_ids['pay_formula_policy'][1] );
		//$policy_ids['pay_code'][]  = $this->createPayCode( $this->company_id, 120, $policy_ids['pay_formula_policy'][2] );

		$policy_ids['overtime'][] = $this->createOverTimePolicy( $this->company_id, 10, $this->policy_ids['contributing_shift_policy'][12], $this->policy_ids['pay_code'][100] ); //Regular Time policy as OT policy.
		$policy_ids['overtime'][] = $this->createOverTimePolicy( $this->company_id, 240, $this->policy_ids['contributing_shift_policy'][12], $policy_ids['pay_code'][0] );
		$policy_ids['overtime'][] = $this->createOverTimePolicy( $this->company_id, 1241, $this->policy_ids['contributing_shift_policy'][12], $policy_ids['pay_code'][1] );
		//$policy_ids['overtime'][] = $this->createOverTimePolicy( $this->company_id, 1001, $this->policy_ids['contributing_shift_policy'][12], $policy_ids['pay_code'][2] );
		//$policy_ids['overtime'][] = $this->createOverTimePolicy( $this->company_id, 230, $this->policy_ids['contributing_shift_policy'][12], $policy_ids['pay_code'][3] );

		//Create Policy Group
		$dd->createPolicyGroup( $this->company_id,
								null, //Meal
								null, //Exception
								null, //Holiday
								$policy_ids['overtime'], //OT
								null, //Premium
								null, //Round
								[ $this->user_id ], //Users
								null, //Break
								null, //Accrual
								null, //Expense
								null, //Absence
								[ $this->policy_ids['regular'][12] ] //Regular
		);


		$date_epoch = TTDate::getMiddleDayEpoch( TTDate::getBeginWeekEpoch( time() ) );
		$date_stamp = TTDate::getDate( 'DATE', $date_epoch );

		//
		//Day of Week: 1
		//
		$dd->createPunchPair( $this->user_id,
							  strtotime( $date_stamp . ' 8:00AM' ),
							  strtotime( $date_stamp . ' 4:00PM' ),
							  [
									  'in_type_id'    => 10,
									  'out_type_id'   => 10,
									  'branch_id'     => $this->branch_ids[0],
									  'department_id' => 0,
									  'job_id'        => 0,
									  'job_item_id'   => 0,
									  'punch_tag_id'  => []
							  ],
							  true
		);

		$udt_arr = $this->getUserDateTotalArray( $date_epoch, $date_epoch );
		//print_r($udt_arr);

		//Total Time
		$this->assertEquals( 5, $udt_arr[$date_epoch][0]['object_type_id'] );                                                                                                     //5=System Total
		$this->assertEquals( $udt_arr[$date_epoch][0]['pay_code_id'], TTUUID::getZeroID() );
		$this->assertEquals( $udt_arr[$date_epoch][0]['total_time'], ( 8 * 3600 ) );
		//OverTime as Regular Time
		$this->assertEquals( 30, $udt_arr[$date_epoch][1]['object_type_id'] );                                                                                                    //Overtime
		$this->assertEquals( $udt_arr[$date_epoch][1]['pay_code_id'], $this->policy_ids['pay_code'][100] );                                                                       //OverTime
		$this->assertEquals( $udt_arr[$date_epoch][1]['total_time'], ( 8 * 3600 ) );
		//Make sure no other hours
		$this->assertCount( 2, $udt_arr[$date_epoch] );

		//
		//Day of Week: 2
		//
		$date_epoch = TTDate::incrementDate( TTDate::getMiddleDayEpoch( TTDate::getBeginWeekEpoch( time() ) ), 1, 'day' );
		$date_stamp = TTDate::getDate( 'DATE', $date_epoch );

		$dd->createPunchPair( $this->user_id,
							  strtotime( $date_stamp . ' 8:00AM' ),
							  strtotime( $date_stamp . ' 4:00PM' ),
							  [
									  'in_type_id'    => 10,
									  'out_type_id'   => 10,
									  'branch_id'     => $this->branch_ids[0],
									  'department_id' => 0,
									  'job_id'        => 0,
									  'job_item_id'   => 0,
									  'punch_tag_id'  => []
							  ],
							  true
		);

		$udt_arr = $this->getUserDateTotalArray( $date_epoch, $date_epoch );
		//print_r($udt_arr);

		//Total Time
		$this->assertEquals( 5, $udt_arr[$date_epoch][0]['object_type_id'] );                                                                                                     //5=System Total
		$this->assertEquals( $udt_arr[$date_epoch][0]['pay_code_id'], TTUUID::getZeroID() );
		$this->assertEquals( $udt_arr[$date_epoch][0]['total_time'], ( 8 * 3600 ) );
		//OverTime as Regular Time
		$this->assertEquals( 30, $udt_arr[$date_epoch][1]['object_type_id'] );                                                                                                    //Overtime
		$this->assertEquals( $udt_arr[$date_epoch][1]['pay_code_id'], $this->policy_ids['pay_code'][100] );                                                                       //OverTime
		$this->assertEquals( $udt_arr[$date_epoch][1]['total_time'], ( 8 * 3600 ) );
		//Make sure no other hours
		$this->assertCount( 2, $udt_arr[$date_epoch] );

		//
		//Day of Week: 3
		//
		$date_epoch = TTDate::incrementDate( TTDate::getMiddleDayEpoch( TTDate::getBeginWeekEpoch( time() ) ), 2, 'day' );
		$date_stamp = TTDate::getDate( 'DATE', $date_epoch );

		$dd->createPunchPair( $this->user_id,
							  strtotime( $date_stamp . ' 8:00AM' ),
							  strtotime( $date_stamp . ' 4:00PM' ),
							  [
									  'in_type_id'    => 10,
									  'out_type_id'   => 10,
									  'branch_id'     => $this->branch_ids[0],
									  'department_id' => 0,
									  'job_id'        => 0,
									  'job_item_id'   => 0,
									  'punch_tag_id'  => []
							  ],
							  true
		);

		$udt_arr = $this->getUserDateTotalArray( $date_epoch, $date_epoch );
		//print_r($udt_arr);

		//Total Time
		$this->assertEquals( 5, $udt_arr[$date_epoch][0]['object_type_id'] );                                                                                                     //5=System Total
		$this->assertEquals( $udt_arr[$date_epoch][0]['pay_code_id'], TTUUID::getZeroID() );
		$this->assertEquals( $udt_arr[$date_epoch][0]['total_time'], ( 8 * 3600 ) );
		//OverTime as Regular Time
		$this->assertEquals( 30, $udt_arr[$date_epoch][1]['object_type_id'] );                                                                                                    //Overtime
		$this->assertEquals( $udt_arr[$date_epoch][1]['pay_code_id'], $this->policy_ids['pay_code'][100] );                                                                       //OverTime
		$this->assertEquals( $udt_arr[$date_epoch][1]['total_time'], ( 8 * 3600 ) );
		//Make sure no other hours
		$this->assertCount( 2, $udt_arr[$date_epoch] );

		//
		//Day of Week: 4
		//
		$date_epoch = TTDate::incrementDate( TTDate::getMiddleDayEpoch( TTDate::getBeginWeekEpoch( time() ) ), 3, 'day' );
		$date_stamp = TTDate::getDate( 'DATE', $date_epoch );

		$dd->createPunchPair( $this->user_id,
							  strtotime( $date_stamp . ' 8:00AM' ),
							  strtotime( $date_stamp . ' 7:00PM' ),
							  [
									  'in_type_id'    => 10,
									  'out_type_id'   => 10,
									  'branch_id'     => $this->branch_ids[0],
									  'department_id' => 0,
									  'job_id'        => 0,
									  'job_item_id'   => 0,
									  'punch_tag_id'  => []
							  ],
							  true
		);

		$udt_arr = $this->getUserDateTotalArray( $date_epoch, $date_epoch );
		//print_r($udt_arr);

		//Total Time
		$this->assertEquals( 5, $udt_arr[$date_epoch][0]['object_type_id'] );                                                                                                     //5=System Total
		$this->assertEquals( $udt_arr[$date_epoch][0]['pay_code_id'], TTUUID::getZeroID() );
		$this->assertEquals( $udt_arr[$date_epoch][0]['total_time'], ( 11 * 3600 ) );
		//OverTime as Regular Time
		$this->assertEquals( 30, $udt_arr[$date_epoch][1]['object_type_id'] );                                                                                                    //Overtime
		$this->assertEquals( $udt_arr[$date_epoch][1]['pay_code_id'], $this->policy_ids['pay_code'][100] );                                                                       //OverTime
		$this->assertEquals( $udt_arr[$date_epoch][1]['total_time'], ( 11 * 3600 ) );
		//Make sure no other hours
		$this->assertCount( 2, $udt_arr[$date_epoch] );


		//
		//Day of Week: 5
		//
		$date_epoch = TTDate::incrementDate( TTDate::getMiddleDayEpoch( TTDate::getBeginWeekEpoch( time() ) ), 4, 'day' );
		$date_stamp = TTDate::getDate( 'DATE', $date_epoch );

		$dd->createPunchPair( $this->user_id,
							  strtotime( $date_stamp . ' 8:00AM' ),
							  strtotime( $date_stamp . ' 8:30AM' ),
							  [
									  'in_type_id'    => 10,
									  'out_type_id'   => 10,
									  'branch_id'     => $this->branch_ids[0],
									  'department_id' => 0,
									  'job_id'        => 0,
									  'job_item_id'   => 0,
									  'punch_tag_id'  => []
							  ],
							  true
		);

		$dd->createPunchPair( $this->user_id,
							  strtotime( $date_stamp . ' 8:30AM' ),
							  strtotime( $date_stamp . ' 10:00AM' ),
							  [
									  'in_type_id'    => 10,
									  'out_type_id'   => 10,
									  'branch_id'     => $this->branch_ids[0],
									  'department_id' => 0,
									  'job_id'        => 0,
									  'job_item_id'   => 0,
									  'punch_tag_id'  => []
							  ],
							  true
		);

		$dd->createPunchPair( $this->user_id,
							  strtotime( $date_stamp . ' 10:00AM' ),
							  strtotime( $date_stamp . ' 12:15PM' ),
							  [
									  'in_type_id'    => 10,
									  'out_type_id'   => 20,
									  'branch_id'     => $this->branch_ids[0],
									  'department_id' => 0,
									  'job_id'        => 0,
									  'job_item_id'   => 0,
									  'punch_tag_id'  => []
							  ],
							  true
		);

		$dd->createPunchPair( $this->user_id,
							  strtotime( $date_stamp . ' 12:45PM' ),
							  strtotime( $date_stamp . ' 4:30PM' ),
							  [
									  'in_type_id'    => 20,
									  'out_type_id'   => 10,
									  'branch_id'     => $this->branch_ids[1], //Branch that is not included in OT differential.
									  'department_id' => 0,
									  'job_id'        => 0,
									  'job_item_id'   => 0,
									  'punch_tag_id'  => []
							  ],
							  true
		);

		$udt_arr = $this->getUserDateTotalArray( $date_epoch, $date_epoch );
		//print_r($udt_arr);

		//Total Time
		$this->assertEquals( 5, $udt_arr[$date_epoch][0]['object_type_id'] );                                                                                                     //5=System Total
		$this->assertEquals( $udt_arr[$date_epoch][0]['pay_code_id'], TTUUID::getZeroID() );
		$this->assertEquals( $udt_arr[$date_epoch][0]['total_time'], ( 8 * 3600 ) );
		//OverTime
		$this->assertEquals( 30, $udt_arr[$date_epoch][1]['object_type_id'] );                                                                                                    //Overtime
		$this->assertEquals( $udt_arr[$date_epoch][1]['pay_code_id'], $policy_ids['pay_code'][1] );                                                                               //OverTime
		$this->assertEquals( $udt_arr[$date_epoch][1]['total_time'], ( 0.25 * 3600 ) );
		//OverTime as Regular Time
		$this->assertEquals( 30, $udt_arr[$date_epoch][2]['object_type_id'] );                                                                                                    //Overtime
		$this->assertEquals( $udt_arr[$date_epoch][2]['pay_code_id'], $policy_ids['pay_code'][0] );                                                                               //OverTime
		$this->assertEquals( $udt_arr[$date_epoch][2]['total_time'], ( 3.75 * 3600 ) );
		////OverTime as Regular Time
		//$this->assertEquals( 30, $udt_arr[$date_epoch][3]['object_type_id'] );                                                                                                    //Overtime
		//$this->assertEquals( $udt_arr[$date_epoch][3]['pay_code_id'], $this->policy_ids['pay_code'][100] );                                                                       //OverTime
		//$this->assertEquals( $udt_arr[$date_epoch][3]['total_time'], ( 0.50 * 3600 ) );
		////OverTime as Regular Time
		//$this->assertEquals( 30, $udt_arr[$date_epoch][4]['object_type_id'] );                                                                                                    //Overtime
		//$this->assertEquals( $udt_arr[$date_epoch][4]['pay_code_id'], $this->policy_ids['pay_code'][100] );                                                                       //OverTime
		//$this->assertEquals( $udt_arr[$date_epoch][4]['total_time'], ( 1.50 * 3600 ) );
		//OverTime as Regular Time
		$this->assertEquals( 30, $udt_arr[$date_epoch][3]['object_type_id'] );                                                                                                    //Overtime
		$this->assertEquals( $udt_arr[$date_epoch][3]['pay_code_id'], $this->policy_ids['pay_code'][100] );                                                                       //OverTime
		$this->assertEquals( $udt_arr[$date_epoch][3]['total_time'], ( 2.00 * 3600 ) );
		//OverTime as Regular Time
		$this->assertEquals( 30, $udt_arr[$date_epoch][4]['object_type_id'] );                                                                                                    //Overtime
		$this->assertEquals( $udt_arr[$date_epoch][4]['pay_code_id'], $this->policy_ids['pay_code'][100] );                                                                       //OverTime
		$this->assertEquals( $udt_arr[$date_epoch][4]['total_time'], ( 2 * 3600 ) );

		//Make sure no other hours
		$this->assertCount( 5, $udt_arr[$date_epoch] );

		return true;
	}

	/**
	 * @group OvertimePolicy_testDifferentialDailyOverTimePolicyA
	 */
	function testDifferentialDailyOverTimePolicyA() {
		if ( getTTProductEdition() == TT_PRODUCT_COMMUNITY ) {
			return true;
		}

		global $dd;

		$policy_ids['pay_formula_policy'][] = $this->createPayFormulaPolicy( $this->company_id, 200 );      //OT1.5
		$policy_ids['pay_formula_policy'][] = $this->createPayFormulaPolicy( $this->company_id, 210 );      //OT2.0
		$policy_ids['pay_formula_policy'][] = $this->createPayFormulaPolicy( $this->company_id, 220 );      //OT2.5

		//Daily
		$policy_ids['pay_code'][] = $this->createPayCode( $this->company_id, 100, $policy_ids['pay_formula_policy'][0] );
		$policy_ids['pay_code'][] = $this->createPayCode( $this->company_id, 110, $policy_ids['pay_formula_policy'][1] );
		//$policy_ids['pay_code'][]  = $this->createPayCode( $this->company_id, 120, $policy_ids['pay_formula_policy'][2] );

		$policy_ids['overtime'][] = $this->createOverTimePolicy( $this->company_id, 90, $this->policy_ids['contributing_shift_policy'][12], $policy_ids['pay_code'][0] );
		$policy_ids['overtime'][] = $this->createOverTimePolicy( $this->company_id, 1000, $this->policy_ids['contributing_shift_policy'][12], $policy_ids['pay_code'][1] );
		//$policy_ids['overtime'][] = $this->createOverTimePolicy( $this->company_id, 1001, $this->policy_ids['contributing_shift_policy'][12], $policy_ids['pay_code'][2] );
		//$policy_ids['overtime'][] = $this->createOverTimePolicy( $this->company_id, 230, $this->policy_ids['contributing_shift_policy'][12], $policy_ids['pay_code'][3] );

		//Create Policy Group
		$dd->createPolicyGroup( $this->company_id,
								null, //Meal
								null, //Exception
								null, //Holiday
								$policy_ids['overtime'], //OT
								null, //Premium
								null, //Round
								[ $this->user_id ], //Users
								null, //Break
								null, //Accrual
								null, //Expense
								null, //Absence
								[ $this->policy_ids['regular'][12] ] //Regular
		);


		$date_epoch = TTDate::getMiddleDayEpoch( TTDate::getBeginWeekEpoch( time() ) );
		$date_stamp = TTDate::getDate( 'DATE', $date_epoch );

		//
		//Day of Week: 1
		//
		$dd->createPunchPair( $this->user_id,
							  strtotime( $date_stamp . ' 8:00AM' ),
							  strtotime( $date_stamp . ' 8:00PM' ),
							  [
									  'in_type_id'    => 10,
									  'out_type_id'   => 10,
									  'branch_id'     => 0,
									  'department_id' => 0,
									  'job_id'        => 0,
									  'job_item_id'   => 0,
									  'punch_tag_id'  => []
							  ],
							  true
		);

		$udt_arr = $this->getUserDateTotalArray( $date_epoch, $date_epoch );
		//print_r($udt_arr);
		//Total Time
		$this->assertEquals( 5, $udt_arr[$date_epoch][0]['object_type_id'] );                               //5=System Total
		$this->assertEquals( $udt_arr[$date_epoch][0]['pay_code_id'], TTUUID::getZeroID() );
		$this->assertEquals( $udt_arr[$date_epoch][0]['total_time'], ( 12 * 3600 ) );
		//Regular Time
		$this->assertEquals( 20, $udt_arr[$date_epoch][1]['object_type_id'] );                              //Regular Time
		$this->assertEquals( $udt_arr[$date_epoch][1]['pay_code_id'], $this->policy_ids['pay_code'][100] ); //Regular Time
		$this->assertEquals( $udt_arr[$date_epoch][1]['total_time'], ( 7 * 3600 ) );
		//Overtime1
		$this->assertEquals( 30, $udt_arr[$date_epoch][2]['object_type_id'] );                              //Overtime
		$this->assertEquals( $udt_arr[$date_epoch][2]['pay_code_id'], $policy_ids['pay_code'][0] );
		$this->assertEquals( $udt_arr[$date_epoch][2]['total_time'], ( 5 * 3600 ) );

		//Make sure no other hours
		$this->assertCount( 3, $udt_arr[$date_epoch] );

		return true;
	}

	/**
	 * @group OvertimePolicy_testDifferentialDailyOverTimePolicyB
	 */
	function testDifferentialDailyOverTimePolicyB() {
		if ( getTTProductEdition() == TT_PRODUCT_COMMUNITY ) {
			return true;
		}

		global $dd;

		$policy_ids['pay_formula_policy'][] = $this->createPayFormulaPolicy( $this->company_id, 200 );      //OT1.5
		$policy_ids['pay_formula_policy'][] = $this->createPayFormulaPolicy( $this->company_id, 210 );      //OT2.0
		$policy_ids['pay_formula_policy'][] = $this->createPayFormulaPolicy( $this->company_id, 220 );      //OT2.5

		//Daily
		$policy_ids['pay_code'][] = $this->createPayCode( $this->company_id, 100, $policy_ids['pay_formula_policy'][0] );
		$policy_ids['pay_code'][] = $this->createPayCode( $this->company_id, 110, $policy_ids['pay_formula_policy'][1] );
		//$policy_ids['pay_code'][]  = $this->createPayCode( $this->company_id, 120, $policy_ids['pay_formula_policy'][2] );

		$policy_ids['overtime'][] = $this->createOverTimePolicy( $this->company_id, 90, $this->policy_ids['contributing_shift_policy'][12], $policy_ids['pay_code'][0] );
		$policy_ids['overtime'][] = $this->createOverTimePolicy( $this->company_id, 1000, $this->policy_ids['contributing_shift_policy'][12], $policy_ids['pay_code'][1] );
		//$policy_ids['overtime'][] = $this->createOverTimePolicy( $this->company_id, 1001, $this->policy_ids['contributing_shift_policy'][12], $policy_ids['pay_code'][2] );
		//$policy_ids['overtime'][] = $this->createOverTimePolicy( $this->company_id, 230, $this->policy_ids['contributing_shift_policy'][12], $policy_ids['pay_code'][3] );

		//Create Policy Group
		$dd->createPolicyGroup( $this->company_id,
								null, //Meal
								null, //Exception
								null, //Holiday
								$policy_ids['overtime'], //OT
								null, //Premium
								null, //Round
								[ $this->user_id ], //Users
								null, //Break
								null, //Accrual
								null, //Expense
								null, //Absence
								[ $this->policy_ids['regular'][12] ] //Regular
		);


		$date_epoch = TTDate::getMiddleDayEpoch( TTDate::getBeginWeekEpoch( time() ) );
		$date_stamp = TTDate::getDate( 'DATE', $date_epoch );

		//
		//Day of Week: 1
		//
		$dd->createPunchPair( $this->user_id,
							  strtotime( $date_stamp . ' 8:00AM' ),
							  strtotime( $date_stamp . ' 8:00PM' ),
							  [
									  'in_type_id'    => 10,
									  'out_type_id'   => 10,
									  'branch_id'     => $this->branch_ids[0],
									  'department_id' => 0,
									  'job_id'        => 0,
									  'job_item_id'   => 0,
									  'punch_tag_id'  => []
							  ],
							  true
		);

		$udt_arr = $this->getUserDateTotalArray( $date_epoch, $date_epoch );
		//print_r($udt_arr);
		//Total Time
		$this->assertEquals( 5, $udt_arr[$date_epoch][0]['object_type_id'] );                               //5=System Total
		$this->assertEquals( $udt_arr[$date_epoch][0]['pay_code_id'], TTUUID::getZeroID() );
		$this->assertEquals( $udt_arr[$date_epoch][0]['total_time'], ( 12 * 3600 ) );
		//Regular Time
		$this->assertEquals( 20, $udt_arr[$date_epoch][1]['object_type_id'] );                              //Regular Time
		$this->assertEquals( $udt_arr[$date_epoch][1]['pay_code_id'], $this->policy_ids['pay_code'][100] ); //Regular Time
		$this->assertEquals( $udt_arr[$date_epoch][1]['total_time'], ( 7 * 3600 ) );
		//Overtime1
		$this->assertEquals( 30, $udt_arr[$date_epoch][2]['object_type_id'] );                              //Overtime
		$this->assertEquals( $udt_arr[$date_epoch][2]['pay_code_id'], $policy_ids['pay_code'][1] );
		$this->assertEquals( $udt_arr[$date_epoch][2]['total_time'], ( 4 * 3600 ) );
		//Overtime1
		$this->assertEquals( 30, $udt_arr[$date_epoch][3]['object_type_id'] );                              //Overtime
		$this->assertEquals( $udt_arr[$date_epoch][3]['pay_code_id'], $policy_ids['pay_code'][0] );
		$this->assertEquals( $udt_arr[$date_epoch][3]['total_time'], ( 1 * 3600 ) );

		//Make sure no other hours
		$this->assertCount( 4, $udt_arr[$date_epoch] );

		return true;
	}

	/**
	 * @group OvertimePolicy_testDifferentialDailyOverTimePolicyC
	 */
	function testDifferentialDailyOverTimePolicyC() {
		if ( getTTProductEdition() == TT_PRODUCT_COMMUNITY ) {
			return true;
		}

		global $dd;

		$policy_ids['pay_formula_policy'][] = $this->createPayFormulaPolicy( $this->company_id, 200 );      //OT1.5
		$policy_ids['pay_formula_policy'][] = $this->createPayFormulaPolicy( $this->company_id, 210 );      //OT2.0
		$policy_ids['pay_formula_policy'][] = $this->createPayFormulaPolicy( $this->company_id, 220 );      //OT2.5

		//Daily
		$policy_ids['pay_code'][] = $this->createPayCode( $this->company_id, 100, $policy_ids['pay_formula_policy'][0] );
		$policy_ids['pay_code'][] = $this->createPayCode( $this->company_id, 110, $policy_ids['pay_formula_policy'][1] );
		$policy_ids['pay_code'][] = $this->createPayCode( $this->company_id, 120, $policy_ids['pay_formula_policy'][2] );

		$policy_ids['overtime'][] = $this->createOverTimePolicy( $this->company_id, 90, $this->policy_ids['contributing_shift_policy'][12], $policy_ids['pay_code'][0] );
		$policy_ids['overtime'][] = $this->createOverTimePolicy( $this->company_id, 1000, $this->policy_ids['contributing_shift_policy'][12], $policy_ids['pay_code'][1] );
		$policy_ids['overtime'][] = $this->createOverTimePolicy( $this->company_id, 1001, $this->policy_ids['contributing_shift_policy'][12], $policy_ids['pay_code'][2] );
		//$policy_ids['overtime'][] = $this->createOverTimePolicy( $this->company_id, 230, $this->policy_ids['contributing_shift_policy'][12], $policy_ids['pay_code'][3] );

		//Create Policy Group
		$dd->createPolicyGroup( $this->company_id,
								null, //Meal
								null, //Exception
								null, //Holiday
								$policy_ids['overtime'], //OT
								null, //Premium
								null, //Round
								[ $this->user_id ], //Users
								null, //Break
								null, //Accrual
								null, //Expense
								null, //Absence
								[ $this->policy_ids['regular'][12] ] //Regular
		);


		$date_epoch = TTDate::getMiddleDayEpoch( TTDate::getBeginWeekEpoch( time() ) );
		$date_stamp = TTDate::getDate( 'DATE', $date_epoch );

		//
		//Day of Week: 1
		//
		$dd->createPunchPair( $this->user_id,
							  strtotime( $date_stamp . ' 8:00AM' ),
							  strtotime( $date_stamp . ' 3:30PM' ),
							  [
									  'in_type_id'    => 10,
									  'out_type_id'   => 10,
									  'branch_id'     => 0,
									  'department_id' => 0,
									  'job_id'        => 0,
									  'job_item_id'   => 0,
									  'punch_tag_id'  => []
							  ],
							  true
		);
		$dd->createPunchPair( $this->user_id,
							  strtotime( $date_stamp . ' 3:30PM' ),
							  strtotime( $date_stamp . ' 4:45PM' ),
							  [
									  'in_type_id'    => 10,
									  'out_type_id'   => 10,
									  'branch_id'     => 0,
									  'department_id' => 0,
									  'job_id'        => 0,
									  'job_item_id'   => 0,
									  'punch_tag_id'  => []
							  ],
							  true
		);
		$dd->createPunchPair( $this->user_id,
							  strtotime( $date_stamp . ' 4:45PM' ),
							  strtotime( $date_stamp . ' 5:30PM' ),
							  [
									  'in_type_id'    => 10,
									  'out_type_id'   => 10,
									  'branch_id'     => 0,
									  'department_id' => 0,
									  'job_id'        => 0,
									  'job_item_id'   => 0,
									  'punch_tag_id'  => []
							  ],
							  true
		);
		$dd->createPunchPair( $this->user_id,
							  strtotime( $date_stamp . ' 5:30PM' ),
							  strtotime( $date_stamp . ' 8:00PM' ),
							  [
									  'in_type_id'    => 10,
									  'out_type_id'   => 10,
									  'branch_id'     => 0,
									  'department_id' => 0,
									  'job_id'        => 0,
									  'job_item_id'   => 0,
									  'punch_tag_id'  => []
							  ],
							  true
		);

		$udt_arr = $this->getUserDateTotalArray( $date_epoch, $date_epoch );
		//print_r($udt_arr);

		//Total Time
		$this->assertEquals( 5, $udt_arr[$date_epoch][0]['object_type_id'] );                               //5=System Total
		$this->assertEquals( $udt_arr[$date_epoch][0]['pay_code_id'], TTUUID::getZeroID() );
		$this->assertEquals( $udt_arr[$date_epoch][0]['total_time'], ( 12 * 3600 ) );
		//Regular Time
		$this->assertEquals( 20, $udt_arr[$date_epoch][1]['object_type_id'] );                              //Regular Time
		$this->assertEquals( $udt_arr[$date_epoch][1]['pay_code_id'], $this->policy_ids['pay_code'][100] ); //Regular Time
		$this->assertEquals( $udt_arr[$date_epoch][1]['total_time'], ( 7 * 3600 ) );
		////Overtime1
		//$this->assertEquals( 30, $udt_arr[$date_epoch][2]['object_type_id'] );                              //Overtime
		//$this->assertEquals( $udt_arr[$date_epoch][2]['pay_code_id'], $policy_ids['pay_code'][0] );
		//$this->assertEquals( $udt_arr[$date_epoch][2]['total_time'], ( 0.5 * 3600 ) );
		////Overtime1
		//$this->assertEquals( 30, $udt_arr[$date_epoch][3]['object_type_id'] );                              //Overtime
		//$this->assertEquals( $udt_arr[$date_epoch][3]['pay_code_id'], $policy_ids['pay_code'][0] );
		//$this->assertEquals( $udt_arr[$date_epoch][3]['total_time'], ( 0.75 * 3600 ) );
		////Overtime1
		//$this->assertEquals( 30, $udt_arr[$date_epoch][4]['object_type_id'] );                              //Overtime
		//$this->assertEquals( $udt_arr[$date_epoch][4]['pay_code_id'], $policy_ids['pay_code'][0] );
		//$this->assertEquals( $udt_arr[$date_epoch][4]['total_time'], ( 1.25 * 3600 ) );
		////Overtime1
		//$this->assertEquals( 30, $udt_arr[$date_epoch][5]['object_type_id'] );                              //Overtime
		//$this->assertEquals( $udt_arr[$date_epoch][5]['pay_code_id'], $policy_ids['pay_code'][0] );
		//$this->assertEquals( $udt_arr[$date_epoch][5]['total_time'], ( 2.5 * 3600 ) );
		//Overtime1
		$this->assertEquals( 30, $udt_arr[$date_epoch][2]['object_type_id'] );                              //Overtime
		$this->assertEquals( $udt_arr[$date_epoch][2]['pay_code_id'], $policy_ids['pay_code'][0] );
		$this->assertEquals( $udt_arr[$date_epoch][2]['total_time'], ( 5.0 * 3600 ) );

		//Make sure no other hours
		$this->assertCount( 3, $udt_arr[$date_epoch] );

		return true;
	}

	/**
	 * @group OvertimePolicy_testDifferentialDailyOverTimePolicyD
	 */
	function testDifferentialDailyOverTimePolicyD() {
		if ( getTTProductEdition() == TT_PRODUCT_COMMUNITY ) {
			return true;
		}

		global $dd;

		$policy_ids['pay_formula_policy'][] = $this->createPayFormulaPolicy( $this->company_id, 200 );      //OT1.5
		$policy_ids['pay_formula_policy'][] = $this->createPayFormulaPolicy( $this->company_id, 210 );      //OT2.0
		$policy_ids['pay_formula_policy'][] = $this->createPayFormulaPolicy( $this->company_id, 220 );      //OT2.5

		//
		//Test where combined_rate is different for the differential OT policies.
		//

		//Daily
		$policy_ids['pay_code'][] = $this->createPayCode( $this->company_id, 100, $policy_ids['pay_formula_policy'][0] );
		$policy_ids['pay_code'][] = $this->createPayCode( $this->company_id, 110, $policy_ids['pay_formula_policy'][1] );
		$policy_ids['pay_code'][] = $this->createPayCode( $this->company_id, 120, $policy_ids['pay_formula_policy'][2] );

		$policy_ids['overtime'][] = $this->createOverTimePolicy( $this->company_id, 90, $this->policy_ids['contributing_shift_policy'][12], $policy_ids['pay_code'][0] );
		$policy_ids['overtime'][] = $this->createOverTimePolicy( $this->company_id, 1000, $this->policy_ids['contributing_shift_policy'][12], $policy_ids['pay_code'][1] );
		$policy_ids['overtime'][] = $this->createOverTimePolicy( $this->company_id, 1001, $this->policy_ids['contributing_shift_policy'][12], $policy_ids['pay_code'][2] );
		//$policy_ids['overtime'][] = $this->createOverTimePolicy( $this->company_id, 230, $this->policy_ids['contributing_shift_policy'][12], $policy_ids['pay_code'][3] );

		//Create Policy Group
		$dd->createPolicyGroup( $this->company_id,
								null, //Meal
								null, //Exception
								null, //Holiday
								$policy_ids['overtime'], //OT
								null, //Premium
								null, //Round
								[ $this->user_id ], //Users
								null, //Break
								null, //Accrual
								null, //Expense
								null, //Absence
								[ $this->policy_ids['regular'][12] ] //Regular
		);


		$date_epoch = TTDate::getMiddleDayEpoch( TTDate::getBeginWeekEpoch( time() ) );
		$date_stamp = TTDate::getDate( 'DATE', $date_epoch );

		//
		//Day of Week: 1
		//
		$dd->createPunchPair( $this->user_id,
							  strtotime( $date_stamp . ' 8:00AM' ),
							  strtotime( $date_stamp . ' 3:30PM' ),
							  [
									  'in_type_id'    => 10,
									  'out_type_id'   => 10,
									  'branch_id'     => 0,
									  'department_id' => 0,
									  'job_id'        => 0,
									  'job_item_id'   => 0,
									  'punch_tag_id'  => []
							  ],
							  true
		);
		$dd->createPunchPair( $this->user_id,
							  strtotime( $date_stamp . ' 3:30PM' ),
							  strtotime( $date_stamp . ' 4:45PM' ),
							  [
									  'in_type_id'    => 10,
									  'out_type_id'   => 10,
									  'branch_id'     => $this->branch_ids[0],
									  'department_id' => 0,
									  'job_id'        => 0,
									  'job_item_id'   => 0,
									  'punch_tag_id'  => []
							  ],
							  true
		);
		$dd->createPunchPair( $this->user_id,
							  strtotime( $date_stamp . ' 4:45PM' ),
							  strtotime( $date_stamp . ' 5:30PM' ),
							  [
									  'in_type_id'    => 10,
									  'out_type_id'   => 10,
									  'branch_id'     => $this->branch_ids[1],
									  'department_id' => 0,
									  'job_id'        => 0,
									  'job_item_id'   => 0,
									  'punch_tag_id'  => []
							  ],
							  true
		);
		$dd->createPunchPair( $this->user_id,
							  strtotime( $date_stamp . ' 5:30PM' ),
							  strtotime( $date_stamp . ' 8:00PM' ),
							  [
									  'in_type_id'    => 10,
									  'out_type_id'   => 10,
									  'branch_id'     => $this->branch_ids[0],
									  'department_id' => 0,
									  'job_id'        => 0,
									  'job_item_id'   => 0,
									  'punch_tag_id'  => []
							  ],
							  true
		);

		$udt_arr = $this->getUserDateTotalArray( $date_epoch, $date_epoch );
		//print_r($udt_arr);
		//Total Time
		$this->assertEquals( 5, $udt_arr[$date_epoch][0]['object_type_id'] );                               //5=System Total
		$this->assertEquals( $udt_arr[$date_epoch][0]['pay_code_id'], TTUUID::getZeroID() );
		$this->assertEquals( $udt_arr[$date_epoch][0]['total_time'], ( 12 * 3600 ) );
		//Regular Time
		$this->assertEquals( 20, $udt_arr[$date_epoch][1]['object_type_id'] );                              //Regular Time
		$this->assertEquals( $udt_arr[$date_epoch][1]['pay_code_id'], $this->policy_ids['pay_code'][100] ); //Regular Time
		$this->assertEquals( $udt_arr[$date_epoch][1]['total_time'], ( 7 * 3600 ) );
		//Overtime1
		$this->assertEquals( 30, $udt_arr[$date_epoch][2]['object_type_id'] );                              //Overtime
		$this->assertEquals( $udt_arr[$date_epoch][2]['pay_code_id'], $policy_ids['pay_code'][2] );
		$this->assertEquals( $udt_arr[$date_epoch][2]['total_time'], ( 0.75 * 3600 ) );
		//Overtime1
		$this->assertEquals( 30, $udt_arr[$date_epoch][3]['object_type_id'] );                              //Overtime
		$this->assertEquals( $udt_arr[$date_epoch][3]['pay_code_id'], $policy_ids['pay_code'][1] );
		$this->assertEquals( $udt_arr[$date_epoch][3]['total_time'], ( 0.75 * 3600 ) );
		//Overtime1
		$this->assertEquals( 30, $udt_arr[$date_epoch][4]['object_type_id'] );                              //Overtime
		$this->assertEquals( $udt_arr[$date_epoch][4]['pay_code_id'], $policy_ids['pay_code'][1] );
		$this->assertEquals( $udt_arr[$date_epoch][4]['total_time'], ( 2.5 * 3600 ) );
		//Overtime1
		$this->assertEquals( 30, $udt_arr[$date_epoch][5]['object_type_id'] );                              //Overtime
		$this->assertEquals( $udt_arr[$date_epoch][5]['pay_code_id'], $policy_ids['pay_code'][0] );
		$this->assertEquals( $udt_arr[$date_epoch][5]['total_time'], ( 0.50 * 3600 ) );
		//Overtime1
		$this->assertEquals( 30, $udt_arr[$date_epoch][6]['object_type_id'] );                              //Overtime
		$this->assertEquals( $udt_arr[$date_epoch][6]['pay_code_id'], $policy_ids['pay_code'][0] );
		$this->assertEquals( $udt_arr[$date_epoch][6]['total_time'], ( 0.50 * 3600 ) );

		//Make sure no other hours
		$this->assertCount( 7, $udt_arr[$date_epoch] );

		return true;
	}

	/**
	 * @group OvertimePolicy_testDifferentialDailyOverTimePolicyD2
	 */
	function testDifferentialDailyOverTimePolicyD2() {
		if ( getTTProductEdition() == TT_PRODUCT_COMMUNITY ) {
			return true;
		}

		global $dd;

		$policy_ids['pay_formula_policy'][] = $this->createPayFormulaPolicy( $this->company_id, 200 );      //OT1.5
		$policy_ids['pay_formula_policy'][] = $this->createPayFormulaPolicy( $this->company_id, 210 );      //OT2.0
		$policy_ids['pay_formula_policy'][] = $this->createPayFormulaPolicy( $this->company_id, 220 );      //OT2.5

		//
		//Test where combined_rate is the same for the differential OT policies.
		//

		//Daily
		$policy_ids['pay_code'][] = $this->createPayCode( $this->company_id, 100, $policy_ids['pay_formula_policy'][0] );
		$policy_ids['pay_code'][] = $this->createPayCode( $this->company_id, 110, $policy_ids['pay_formula_policy'][1] );
		$policy_ids['pay_code'][] = $this->createPayCode( $this->company_id, 120, $policy_ids['pay_formula_policy'][1] );

		$policy_ids['overtime'][] = $this->createOverTimePolicy( $this->company_id, 90, $this->policy_ids['contributing_shift_policy'][12], $policy_ids['pay_code'][0] );
		$policy_ids['overtime'][] = $this->createOverTimePolicy( $this->company_id, 1000, $this->policy_ids['contributing_shift_policy'][12], $policy_ids['pay_code'][1] );
		$policy_ids['overtime'][] = $this->createOverTimePolicy( $this->company_id, 1001, $this->policy_ids['contributing_shift_policy'][12], $policy_ids['pay_code'][2] );
		//$policy_ids['overtime'][] = $this->createOverTimePolicy( $this->company_id, 230, $this->policy_ids['contributing_shift_policy'][12], $policy_ids['pay_code'][3] );

		//Create Policy Group
		$dd->createPolicyGroup( $this->company_id,
								null, //Meal
								null, //Exception
								null, //Holiday
								$policy_ids['overtime'], //OT
								null, //Premium
								null, //Round
								[ $this->user_id ], //Users
								null, //Break
								null, //Accrual
								null, //Expense
								null, //Absence
								[ $this->policy_ids['regular'][12] ] //Regular
		);


		$date_epoch = TTDate::getMiddleDayEpoch( TTDate::getBeginWeekEpoch( time() ) );
		$date_stamp = TTDate::getDate( 'DATE', $date_epoch );

		//
		//Day of Week: 1
		//
		$dd->createPunchPair( $this->user_id,
							  strtotime( $date_stamp . ' 8:00AM' ),
							  strtotime( $date_stamp . ' 3:30PM' ),
							  [
									  'in_type_id'    => 10,
									  'out_type_id'   => 10,
									  'branch_id'     => 0,
									  'department_id' => 0,
									  'job_id'        => 0,
									  'job_item_id'   => 0,
									  'punch_tag_id'  => []
							  ],
							  true
		);
		$dd->createPunchPair( $this->user_id,
							  strtotime( $date_stamp . ' 3:30PM' ),
							  strtotime( $date_stamp . ' 4:45PM' ),
							  [
									  'in_type_id'    => 10,
									  'out_type_id'   => 10,
									  'branch_id'     => $this->branch_ids[0],
									  'department_id' => 0,
									  'job_id'        => 0,
									  'job_item_id'   => 0,
									  'punch_tag_id'  => []
							  ],
							  true
		);
		$dd->createPunchPair( $this->user_id,
							  strtotime( $date_stamp . ' 4:45PM' ),
							  strtotime( $date_stamp . ' 5:30PM' ),
							  [
									  'in_type_id'    => 10,
									  'out_type_id'   => 10,
									  'branch_id'     => $this->branch_ids[1],
									  'department_id' => 0,
									  'job_id'        => 0,
									  'job_item_id'   => 0,
									  'punch_tag_id'  => []
							  ],
							  true
		);
		$dd->createPunchPair( $this->user_id,
							  strtotime( $date_stamp . ' 5:30PM' ),
							  strtotime( $date_stamp . ' 8:00PM' ),
							  [
									  'in_type_id'    => 10,
									  'out_type_id'   => 10,
									  'branch_id'     => $this->branch_ids[0],
									  'department_id' => 0,
									  'job_id'        => 0,
									  'job_item_id'   => 0,
									  'punch_tag_id'  => []
							  ],
							  true
		);

		$udt_arr = $this->getUserDateTotalArray( $date_epoch, $date_epoch );
		//print_r($udt_arr);
		//Total Time
		$this->assertEquals( 5, $udt_arr[$date_epoch][0]['object_type_id'] );                               //5=System Total
		$this->assertEquals( $udt_arr[$date_epoch][0]['pay_code_id'], TTUUID::getZeroID() );
		$this->assertEquals( $udt_arr[$date_epoch][0]['total_time'], ( 12 * 3600 ) );
		//Regular Time
		$this->assertEquals( 20, $udt_arr[$date_epoch][1]['object_type_id'] );                              //Regular Time
		$this->assertEquals( $udt_arr[$date_epoch][1]['pay_code_id'], $this->policy_ids['pay_code'][100] ); //Regular Time
		$this->assertEquals( $udt_arr[$date_epoch][1]['total_time'], ( 7 * 3600 ) );
		//Overtime1
		$this->assertEquals( 30, $udt_arr[$date_epoch][2]['object_type_id'] );                              //Overtime
		$this->assertEquals( $udt_arr[$date_epoch][2]['pay_code_id'], $policy_ids['pay_code'][2] );
		$this->assertEquals( $udt_arr[$date_epoch][2]['total_time'], ( 0.75 * 3600 ) );
		//Overtime1
		$this->assertEquals( 30, $udt_arr[$date_epoch][3]['object_type_id'] );                              //Overtime
		$this->assertEquals( $udt_arr[$date_epoch][3]['pay_code_id'], $policy_ids['pay_code'][1] );
		$this->assertEquals( $udt_arr[$date_epoch][3]['total_time'], ( 0.75 * 3600 ) );
		//Overtime1
		$this->assertEquals( 30, $udt_arr[$date_epoch][4]['object_type_id'] );                              //Overtime
		$this->assertEquals( $udt_arr[$date_epoch][4]['pay_code_id'], $policy_ids['pay_code'][1] );
		$this->assertEquals( $udt_arr[$date_epoch][4]['total_time'], ( 2.5 * 3600 ) );
		//Overtime1
		$this->assertEquals( 30, $udt_arr[$date_epoch][5]['object_type_id'] );                              //Overtime
		$this->assertEquals( $udt_arr[$date_epoch][5]['pay_code_id'], $policy_ids['pay_code'][0] );
		$this->assertEquals( $udt_arr[$date_epoch][5]['total_time'], ( 0.50 * 3600 ) );
		//Overtime1
		$this->assertEquals( 30, $udt_arr[$date_epoch][6]['object_type_id'] );                              //Overtime
		$this->assertEquals( $udt_arr[$date_epoch][6]['pay_code_id'], $policy_ids['pay_code'][0] );
		$this->assertEquals( $udt_arr[$date_epoch][6]['total_time'], ( 0.50 * 3600 ) );

		//Make sure no other hours
		$this->assertCount( 7, $udt_arr[$date_epoch] );

		return true;
	}

	/**
	 * @group OvertimePolicy_testDifferentialDailyOverTimePolicyE1
	 */
	function testDifferentialDailyOverTimePolicyE1() {
		if ( getTTProductEdition() == TT_PRODUCT_COMMUNITY ) {
			return true;
		}

		global $dd;

		$policy_ids['pay_formula_policy'][] = $this->createPayFormulaPolicy( $this->company_id, 200 );      //OT1.5
		$policy_ids['pay_formula_policy'][] = $this->createPayFormulaPolicy( $this->company_id, 210 );      //OT2.0
		$policy_ids['pay_formula_policy'][] = $this->createPayFormulaPolicy( $this->company_id, 220 );      //OT2.5

		//
		//Test where combined_rate is higher for the differential OT policies that occur in the middle of the shift for just an hour or so.
		//  The lower rate should then apply to records that haven't already been assigned to an OT policy.
		//

		//Daily
		$policy_ids['pay_code'][] = $this->createPayCode( $this->company_id, 100, $policy_ids['pay_formula_policy'][0] );
		$policy_ids['pay_code'][] = $this->createPayCode( $this->company_id, 110, $policy_ids['pay_formula_policy'][1] );
		$policy_ids['pay_code'][] = $this->createPayCode( $this->company_id, 120, $policy_ids['pay_formula_policy'][1] );

		$policy_ids['overtime'][] = $this->createOverTimePolicy( $this->company_id, 100, $this->policy_ids['contributing_shift_policy'][12], $policy_ids['pay_code'][0] );
		$policy_ids['overtime'][] = $this->createOverTimePolicy( $this->company_id, 1900, $this->policy_ids['contributing_shift_policy'][12], $policy_ids['pay_code'][1] );
		//$policy_ids['overtime'][] = $this->createOverTimePolicy( $this->company_id, 1001, $this->policy_ids['contributing_shift_policy'][12], $policy_ids['pay_code'][2] );
		//$policy_ids['overtime'][] = $this->createOverTimePolicy( $this->company_id, 230, $this->policy_ids['contributing_shift_policy'][12], $policy_ids['pay_code'][3] );

		//Create Policy Group
		$dd->createPolicyGroup( $this->company_id,
								null, //Meal
								null, //Exception
								null, //Holiday
								$policy_ids['overtime'], //OT
								null, //Premium
								null, //Round
								[ $this->user_id ], //Users
								null, //Break
								null, //Accrual
								null, //Expense
								null, //Absence
								[ $this->policy_ids['regular'][12] ] //Regular
		);


		$date_epoch = TTDate::getMiddleDayEpoch( TTDate::getBeginWeekEpoch( time() ) );
		$date_stamp = TTDate::getDate( 'DATE', $date_epoch );

		//
		//Day of Week: 1
		//
		$dd->createPunchPair( $this->user_id,
							  strtotime( $date_stamp . ' 8:00AM' ),
							  strtotime( $date_stamp . ' 1:00PM' ),
							  [
									  'in_type_id'    => 10,
									  'out_type_id'   => 10,
									  'branch_id'     => 0,
									  'department_id' => 0,
									  'job_id'        => 0,
									  'job_item_id'   => 0,
									  'punch_tag_id'  => []
							  ],
							  true
		);
		$dd->createPunchPair( $this->user_id,
							  strtotime( $date_stamp . ' 1:00PM' ),
							  strtotime( $date_stamp . ' 2:00PM' ),
							  [
									  'in_type_id'    => 10,
									  'out_type_id'   => 10,
									  'branch_id'     => $this->branch_ids[0],
									  'department_id' => 0,
									  'job_id'        => 0,
									  'job_item_id'   => 0,
									  'punch_tag_id'  => []
							  ],
							  true
		);
		$dd->createPunchPair( $this->user_id,
							  strtotime( $date_stamp . ' 2:00PM' ),
							  strtotime( $date_stamp . ' 8:00PM' ),
							  [
									  'in_type_id'    => 10,
									  'out_type_id'   => 10,
									  'branch_id'     => 0,
									  'department_id' => 0,
									  'job_id'        => 0,
									  'job_item_id'   => 0,
									  'punch_tag_id'  => []
							  ],
							  true
		);

		$udt_arr = $this->getUserDateTotalArray( $date_epoch, $date_epoch );
		//print_r($udt_arr);
		//Total Time
		$this->assertEquals( 5, $udt_arr[$date_epoch][0]['object_type_id'] );                               //5=System Total
		$this->assertEquals( $udt_arr[$date_epoch][0]['pay_code_id'], TTUUID::getZeroID() );
		$this->assertEquals( $udt_arr[$date_epoch][0]['total_time'], ( 12 * 3600 ) );
		//Regular Time
		$this->assertEquals( 20, $udt_arr[$date_epoch][1]['object_type_id'] );                              //Regular Time
		$this->assertEquals( $udt_arr[$date_epoch][1]['pay_code_id'], $this->policy_ids['pay_code'][100] ); //Regular Time
		$this->assertEquals( $udt_arr[$date_epoch][1]['total_time'], ( 2 * 3600 ) );
		//Regular Time
		$this->assertEquals( 20, $udt_arr[$date_epoch][2]['object_type_id'] );                              //Regular Time
		$this->assertEquals( $udt_arr[$date_epoch][2]['pay_code_id'], $this->policy_ids['pay_code'][100] ); //Regular Time
		$this->assertEquals( $udt_arr[$date_epoch][2]['total_time'], ( 5 * 3600 ) );
		//Overtime2
		$this->assertEquals( 30, $udt_arr[$date_epoch][3]['object_type_id'] );                              //Overtime
		$this->assertEquals( $udt_arr[$date_epoch][3]['pay_code_id'], $policy_ids['pay_code'][1] );
		$this->assertEquals( $udt_arr[$date_epoch][3]['total_time'], ( 1 * 3600 ) );
		//Overtime1
		$this->assertEquals( 30, $udt_arr[$date_epoch][4]['object_type_id'] );                              //Overtime
		$this->assertEquals( $udt_arr[$date_epoch][4]['pay_code_id'], $policy_ids['pay_code'][0] );
		$this->assertEquals( $udt_arr[$date_epoch][4]['total_time'], ( 4 * 3600 ) );

		//Make sure no other hours
		$this->assertCount( 5, $udt_arr[$date_epoch] );

		return true;
	}

	/**
	 * @group OvertimePolicy_testDifferentialWeeklyOverTimePolicyA
	 */
	function testDifferentialWeeklyOverTimePolicyA() {
		if ( getTTProductEdition() == TT_PRODUCT_COMMUNITY ) {
			return true;
		}

		global $dd;

		//
		// This tests a specific bug that occurred due to calculateOverTimePolicy not sorting the input UDT records and therefore the output was incorrect
		// when there were multiple regular time policies in the same day, and weekly overtime that only applied with a differential criteria.
		//

		$policy_ids['pay_formula_policy'][] = $this->createPayFormulaPolicy( $this->company_id, 200 );                                                                                //OT1.5
		$policy_ids['pay_formula_policy'][] = $this->createPayFormulaPolicy( $this->company_id, 210 );                                                                                //OT2.0
		$policy_ids['pay_formula_policy'][] = $this->createPayFormulaPolicy( $this->company_id, 220 );                                                                                //OT2.5

		//Daily
		$policy_ids['pay_code'][] = $this->createPayCode( $this->company_id, 100, $policy_ids['pay_formula_policy'][0] );
		$policy_ids['pay_code'][] = $this->createPayCode( $this->company_id, 110, $policy_ids['pay_formula_policy'][1] );
		$policy_ids['pay_code'][] = $this->createPayCode( $this->company_id, 120, $policy_ids['pay_formula_policy'][2] );

		//Weekly
		$policy_ids['pay_code'][] = $this->createPayCode( $this->company_id, 230, $policy_ids['pay_formula_policy'][0] );
		//$policy_ids['pay_code'][]  = $this->createPayCode( $this->company_id, 240, $policy_ids['pay_formula_policy'][1] );
		//$policy_ids['pay_code'][]  = $this->createPayCode( $this->company_id, 250, $policy_ids['pay_formula_policy'][2] );

		//Regular
		$policy_ids['regular'][] = $this->createRegularTimePolicy( $this->company_id, 1010, $this->policy_ids['contributing_shift_policy'][10], $this->policy_ids['pay_code'][101] ); //Branch 1
		$policy_ids['regular'][] = $this->createRegularTimePolicy( $this->company_id, 1020, $this->policy_ids['contributing_shift_policy'][10], $this->policy_ids['pay_code'][102] ); //Branch 2

		//$policy_ids['overtime'][] = $this->createOverTimePolicy( $this->company_id, 100, $this->policy_ids['contributing_shift_policy'][12], $policy_ids['pay_code'][0] );
		$policy_ids['overtime'][] = $this->createOverTimePolicy( $this->company_id, 1230, $this->policy_ids['contributing_shift_policy'][12], $policy_ids['pay_code'][1] );
		$policy_ids['overtime'][] = $this->createOverTimePolicy( $this->company_id, 1231, $this->policy_ids['contributing_shift_policy'][12], $policy_ids['pay_code'][2] );
		$policy_ids['overtime'][] = $this->createOverTimePolicy( $this->company_id, 230, $this->policy_ids['contributing_shift_policy'][12], $policy_ids['pay_code'][3] );

		//Create Policy Group
		$dd->createPolicyGroup( $this->company_id,
								null, //Meal
								null, //Exception
								null, //Holiday
								$policy_ids['overtime'], //OT
								null, //Premium
								null, //Round
								[ $this->user_id ], //Users
								null, //Break
								null, //Accrual
								null, //Expense
								null, //Absence
								array_merge( [ $this->policy_ids['regular'][12] ], $policy_ids['regular'] ) //Regular
		);


		$date_epoch = TTDate::getMiddleDayEpoch( TTDate::getBeginWeekEpoch( time() ) );
		$date_stamp = TTDate::getDate( 'DATE', $date_epoch );

		//
		//Day of Week: 1
		//
		$dd->createPunchPair( $this->user_id,
							  strtotime( $date_stamp . ' 8:00AM' ),
							  strtotime( $date_stamp . ' 4:00PM' ),
							  [
									  'in_type_id'    => 10,
									  'out_type_id'   => 10,
									  'branch_id'     => 0,
									  'department_id' => 0,
									  'job_id'        => 0,
									  'job_item_id'   => 0,
									  'punch_tag_id'  => []
							  ],
							  true
		);

		$udt_arr = $this->getUserDateTotalArray( $date_epoch, $date_epoch );
		//print_r($udt_arr);
		//Total Time
		$this->assertEquals( 5, $udt_arr[$date_epoch][0]['object_type_id'] );                                                                                                         //5=System Total
		$this->assertEquals( $udt_arr[$date_epoch][0]['pay_code_id'], TTUUID::getZeroID() );
		$this->assertEquals( $udt_arr[$date_epoch][0]['total_time'], ( 8 * 3600 ) );
		//Regular Time
		$this->assertEquals( 20, $udt_arr[$date_epoch][1]['object_type_id'] );                                                                                                        //Regular Time
		$this->assertEquals( $udt_arr[$date_epoch][1]['pay_code_id'], $this->policy_ids['pay_code'][100] );                                                                           //Regular Time
		$this->assertEquals( $udt_arr[$date_epoch][1]['total_time'], ( 8 * 3600 ) );
		//Make sure no other hours
		$this->assertCount( 2, $udt_arr[$date_epoch] );

		//
		//Day of Week: 2
		//
		$date_epoch = TTDate::incrementDate( TTDate::getMiddleDayEpoch( TTDate::getBeginWeekEpoch( time() ) ), 1, 'day' );
		$date_stamp = TTDate::getDate( 'DATE', $date_epoch );

		$dd->createPunchPair( $this->user_id,
							  strtotime( $date_stamp . ' 8:00AM' ),
							  strtotime( $date_stamp . ' 4:00PM' ),
							  [
									  'in_type_id'    => 10,
									  'out_type_id'   => 10,
									  'branch_id'     => 0,
									  'department_id' => 0,
									  'job_id'        => 0,
									  'job_item_id'   => 0,
									  'punch_tag_id'  => []
							  ],
							  true
		);

		$udt_arr = $this->getUserDateTotalArray( $date_epoch, $date_epoch );
		//print_r($udt_arr);
		//Total Time
		$this->assertEquals( 5, $udt_arr[$date_epoch][0]['object_type_id'] );                                                                                                         //5=System Total
		$this->assertEquals( $udt_arr[$date_epoch][0]['pay_code_id'], TTUUID::getZeroID() );
		$this->assertEquals( $udt_arr[$date_epoch][0]['total_time'], ( 8 * 3600 ) );
		//Regular Time
		$this->assertEquals( 20, $udt_arr[$date_epoch][1]['object_type_id'] );                                                                                                        //Regular Time
		$this->assertEquals( $udt_arr[$date_epoch][1]['pay_code_id'], $this->policy_ids['pay_code'][100] );                                                                           //Regular Time
		$this->assertEquals( $udt_arr[$date_epoch][1]['total_time'], ( 8 * 3600 ) );
		//Make sure no other hours
		$this->assertCount( 2, $udt_arr[$date_epoch] );


		//
		//Day of Week: 3
		//
		$date_epoch = TTDate::incrementDate( TTDate::getMiddleDayEpoch( TTDate::getBeginWeekEpoch( time() ) ), 2, 'day' );
		$date_stamp = TTDate::getDate( 'DATE', $date_epoch );

		$dd->createPunchPair( $this->user_id,
							  strtotime( $date_stamp . ' 8:00AM' ),
							  strtotime( $date_stamp . ' 4:00PM' ),
							  [
									  'in_type_id'    => 10,
									  'out_type_id'   => 10,
									  'branch_id'     => 0,
									  'department_id' => 0,
									  'job_id'        => 0,
									  'job_item_id'   => 0,
									  'punch_tag_id'  => []
							  ],
							  true
		);

		$udt_arr = $this->getUserDateTotalArray( $date_epoch, $date_epoch );
		//print_r($udt_arr);
		//Total Time
		$this->assertEquals( 5, $udt_arr[$date_epoch][0]['object_type_id'] );                                                                                                         //5=System Total
		$this->assertEquals( $udt_arr[$date_epoch][0]['pay_code_id'], TTUUID::getZeroID() );
		$this->assertEquals( $udt_arr[$date_epoch][0]['total_time'], ( 8 * 3600 ) );
		//Regular Time
		$this->assertEquals( 20, $udt_arr[$date_epoch][1]['object_type_id'] );                                                                                                        //Regular Time
		$this->assertEquals( $udt_arr[$date_epoch][1]['pay_code_id'], $this->policy_ids['pay_code'][100] );                                                                           //Regular Time
		$this->assertEquals( $udt_arr[$date_epoch][1]['total_time'], ( 8 * 3600 ) );
		//Make sure no other hours
		$this->assertCount( 2, $udt_arr[$date_epoch] );


		//
		//Day of Week: 4
		//
		$date_epoch = TTDate::incrementDate( TTDate::getMiddleDayEpoch( TTDate::getBeginWeekEpoch( time() ) ), 3, 'day' );
		$date_stamp = TTDate::getDate( 'DATE', $date_epoch );

		$dd->createPunchPair( $this->user_id,
							  strtotime( $date_stamp . ' 8:00AM' ),
							  strtotime( $date_stamp . ' 2:00PM' ),
							  [
									  'in_type_id'    => 10,
									  'out_type_id'   => 10,
									  'branch_id'     => 0,
									  'department_id' => 0,
									  'job_id'        => 0,
									  'job_item_id'   => 0,
									  'punch_tag_id'  => []
							  ],
							  true
		);

		$udt_arr = $this->getUserDateTotalArray( $date_epoch, $date_epoch );
		//print_r($udt_arr);
		//Total Time
		$this->assertEquals( 5, $udt_arr[$date_epoch][0]['object_type_id'] );                                                                                                         //5=System Total
		$this->assertEquals( $udt_arr[$date_epoch][0]['pay_code_id'], TTUUID::getZeroID() );
		$this->assertEquals( $udt_arr[$date_epoch][0]['total_time'], ( 6 * 3600 ) );
		//Regular Time
		$this->assertEquals( 20, $udt_arr[$date_epoch][1]['object_type_id'] );                                                                                                        //Regular Time
		$this->assertEquals( $udt_arr[$date_epoch][1]['pay_code_id'], $this->policy_ids['pay_code'][100] );                                                                           //Regular Time
		$this->assertEquals( $udt_arr[$date_epoch][1]['total_time'], ( 6 * 3600 ) );
		//Make sure no other hours
		$this->assertCount( 2, $udt_arr[$date_epoch] );


		//
		//Day of Week: 5
		//
		$date_epoch = TTDate::incrementDate( TTDate::getMiddleDayEpoch( TTDate::getBeginWeekEpoch( time() ) ), 4, 'day' );
		$date_stamp = TTDate::getDate( 'DATE', $date_epoch );

		$dd->createPunchPair( $this->user_id,
							  strtotime( $date_stamp . ' 8:00AM' ),
							  strtotime( $date_stamp . ' 1:00PM' ),
							  [
									  'in_type_id'    => 10,
									  'out_type_id'   => 10,
									  'branch_id'     => 0,
									  'department_id' => 0,
									  'job_id'        => 0,
									  'job_item_id'   => 0,
									  'punch_tag_id'  => []
							  ],
							  true
		);
		$dd->createPunchPair( $this->user_id,
							  strtotime( $date_stamp . ' 3:00PM' ),
							  strtotime( $date_stamp . ' 6:00PM' ),
							  [
									  'in_type_id'    => 10,
									  'out_type_id'   => 10,
									  'branch_id'     => $this->branch_ids[1],
									  'department_id' => 0,
									  'job_id'        => 0,
									  'job_item_id'   => 0,
									  'punch_tag_id'  => []
							  ],
							  true
		);

		$udt_arr = $this->getUserDateTotalArray( $date_epoch, $date_epoch );
		//print_r($udt_arr);
		//Total Time
		$this->assertEquals( 5, $udt_arr[$date_epoch][0]['object_type_id'] );                                                                                                         //5=System Total
		$this->assertEquals( $udt_arr[$date_epoch][0]['pay_code_id'], TTUUID::getZeroID() );
		$this->assertEquals( $udt_arr[$date_epoch][0]['total_time'], ( 8 * 3600 ) );
		//Regular Time
		$this->assertEquals( 20, $udt_arr[$date_epoch][1]['object_type_id'] );                                                                                                        //Regular Time
		$this->assertEquals( $udt_arr[$date_epoch][1]['pay_code_id'], $this->policy_ids['pay_code'][100] );                                                                           //Regular Time
		$this->assertEquals( $udt_arr[$date_epoch][1]['total_time'], ( 1 * 3600 ) );
		//Weekly Overtime1
		$this->assertEquals( 30, $udt_arr[$date_epoch][2]['object_type_id'] );                                                                                                        //Overtime
		$this->assertEquals( $udt_arr[$date_epoch][2]['pay_code_id'], $policy_ids['pay_code'][3] );
		$this->assertEquals( $udt_arr[$date_epoch][2]['total_time'], ( 4 * 3600 ) );
		//Overtime1
		$this->assertEquals( 30, $udt_arr[$date_epoch][3]['object_type_id'] );                                                                                                        //Overtime
		$this->assertEquals( $udt_arr[$date_epoch][3]['pay_code_id'], $policy_ids['pay_code'][1] );
		$this->assertEquals( $udt_arr[$date_epoch][3]['total_time'], ( 3 * 3600 ) );

		//Make sure no other hours
		$this->assertCount( 4, $udt_arr[$date_epoch] );

		return true;
	}

	/**
	 * @group OvertimePolicy_testDifferentialDailyAndWeeklyOverTimePolicyA
	 */
	function testDifferentialDailyAndWeeklyOverTimePolicyA() {
		if ( getTTProductEdition() == TT_PRODUCT_COMMUNITY ) {
			return true;
		}

		global $dd;

		$policy_ids['pay_formula_policy'][] = $this->createPayFormulaPolicy( $this->company_id, 200 );      //OT1.5
		$policy_ids['pay_formula_policy'][] = $this->createPayFormulaPolicy( $this->company_id, 210 );      //OT2.0
		$policy_ids['pay_formula_policy'][] = $this->createPayFormulaPolicy( $this->company_id, 220 );      //OT2.5

		//Daily
		$policy_ids['pay_code'][] = $this->createPayCode( $this->company_id, 100, $policy_ids['pay_formula_policy'][0] );
		$policy_ids['pay_code'][] = $this->createPayCode( $this->company_id, 110, $policy_ids['pay_formula_policy'][1] );
		$policy_ids['pay_code'][] = $this->createPayCode( $this->company_id, 120, $policy_ids['pay_formula_policy'][2] );

		//Weekly
		$policy_ids['pay_code'][] = $this->createPayCode( $this->company_id, 230, $policy_ids['pay_formula_policy'][0] );
		//$policy_ids['pay_code'][]  = $this->createPayCode( $this->company_id, 240, $policy_ids['pay_formula_policy'][1] );
		//$policy_ids['pay_code'][]  = $this->createPayCode( $this->company_id, 250, $policy_ids['pay_formula_policy'][2] );

		$policy_ids['overtime'][] = $this->createOverTimePolicy( $this->company_id, 100, $this->policy_ids['contributing_shift_policy'][12], $policy_ids['pay_code'][0] );
		$policy_ids['overtime'][] = $this->createOverTimePolicy( $this->company_id, 1000, $this->policy_ids['contributing_shift_policy'][12], $policy_ids['pay_code'][1] );
		$policy_ids['overtime'][] = $this->createOverTimePolicy( $this->company_id, 1001, $this->policy_ids['contributing_shift_policy'][12], $policy_ids['pay_code'][2] );
		$policy_ids['overtime'][] = $this->createOverTimePolicy( $this->company_id, 230, $this->policy_ids['contributing_shift_policy'][12], $policy_ids['pay_code'][3] );

		//Create Policy Group
		$dd->createPolicyGroup( $this->company_id,
								null, //Meal
								null, //Exception
								null, //Holiday
								$policy_ids['overtime'], //OT
								null, //Premium
								null, //Round
								[ $this->user_id ], //Users
								null, //Break
								null, //Accrual
								null, //Expense
								null, //Absence
								[ $this->policy_ids['regular'][12] ] //Regular
		);


		$date_epoch = TTDate::getMiddleDayEpoch( TTDate::getBeginWeekEpoch( time() ) );
		$date_stamp = TTDate::getDate( 'DATE', $date_epoch );

		//
		//Day of Week: 1
		//
		$dd->createPunchPair( $this->user_id,
							  strtotime( $date_stamp . ' 8:00AM' ),
							  strtotime( $date_stamp . ' 8:00PM' ),
							  [
									  'in_type_id'    => 10,
									  'out_type_id'   => 10,
									  'branch_id'     => 0,
									  'department_id' => 0,
									  'job_id'        => 0,
									  'job_item_id'   => 0,
									  'punch_tag_id'  => []
							  ],
							  true
		);

		$udt_arr = $this->getUserDateTotalArray( $date_epoch, $date_epoch );
		//print_r($udt_arr);
		//Total Time
		$this->assertEquals( 5, $udt_arr[$date_epoch][0]['object_type_id'] );                               //5=System Total
		$this->assertEquals( $udt_arr[$date_epoch][0]['pay_code_id'], TTUUID::getZeroID() );
		$this->assertEquals( $udt_arr[$date_epoch][0]['total_time'], ( 12 * 3600 ) );
		//Regular Time
		$this->assertEquals( 20, $udt_arr[$date_epoch][1]['object_type_id'] );                              //Regular Time
		$this->assertEquals( $udt_arr[$date_epoch][1]['pay_code_id'], $this->policy_ids['pay_code'][100] ); //Regular Time
		$this->assertEquals( $udt_arr[$date_epoch][1]['total_time'], ( 8 * 3600 ) );
		//Overtime1
		$this->assertEquals( 30, $udt_arr[$date_epoch][2]['object_type_id'] );                              //Overtime
		$this->assertEquals( $udt_arr[$date_epoch][2]['pay_code_id'], $policy_ids['pay_code'][0] );
		$this->assertEquals( $udt_arr[$date_epoch][2]['total_time'], ( 4 * 3600 ) );
		//Make sure no other hours
		$this->assertCount( 3, $udt_arr[$date_epoch] );

		//
		//Day of Week: 2
		//
		$date_epoch = TTDate::incrementDate( TTDate::getMiddleDayEpoch( TTDate::getBeginWeekEpoch( time() ) ), 1, 'day' );
		$date_stamp = TTDate::getDate( 'DATE', $date_epoch );

		$dd->createPunchPair( $this->user_id,
							  strtotime( $date_stamp . ' 8:00AM' ),
							  strtotime( $date_stamp . ' 8:00PM' ),
							  [
									  'in_type_id'    => 10,
									  'out_type_id'   => 10,
									  'branch_id'     => 0,
									  'department_id' => 0,
									  'job_id'        => 0,
									  'job_item_id'   => 0,
									  'punch_tag_id'  => []
							  ],
							  true
		);

		$udt_arr = $this->getUserDateTotalArray( $date_epoch, $date_epoch );
		//print_r($udt_arr);
		//Total Time
		$this->assertEquals( 5, $udt_arr[$date_epoch][0]['object_type_id'] );                               //5=System Total
		$this->assertEquals( $udt_arr[$date_epoch][0]['pay_code_id'], TTUUID::getZeroID() );
		$this->assertEquals( $udt_arr[$date_epoch][0]['total_time'], ( 12 * 3600 ) );
		//Regular Time
		$this->assertEquals( 20, $udt_arr[$date_epoch][1]['object_type_id'] );                              //Regular Time
		$this->assertEquals( $udt_arr[$date_epoch][1]['pay_code_id'], $this->policy_ids['pay_code'][100] ); //Regular Time
		$this->assertEquals( $udt_arr[$date_epoch][1]['total_time'], ( 8 * 3600 ) );
		//Overtime1
		$this->assertEquals( 30, $udt_arr[$date_epoch][2]['object_type_id'] );                              //Overtime
		$this->assertEquals( $udt_arr[$date_epoch][2]['pay_code_id'], $policy_ids['pay_code'][0] );
		$this->assertEquals( $udt_arr[$date_epoch][2]['total_time'], ( 4 * 3600 ) );
		//Make sure no other hours
		$this->assertCount( 3, $udt_arr[$date_epoch] );

		//
		//Day of Week: 3
		//
		$date_epoch = TTDate::incrementDate( TTDate::getMiddleDayEpoch( TTDate::getBeginWeekEpoch( time() ) ), 2, 'day' );
		$date_stamp = TTDate::getDate( 'DATE', $date_epoch );

		$dd->createPunchPair( $this->user_id,
							  strtotime( $date_stamp . ' 8:00AM' ),
							  strtotime( $date_stamp . ' 8:00PM' ),
							  [
									  'in_type_id'    => 10,
									  'out_type_id'   => 10,
									  'branch_id'     => 0,
									  'department_id' => 0,
									  'job_id'        => 0,
									  'job_item_id'   => 0,
									  'punch_tag_id'  => []
							  ],
							  true
		);

		$udt_arr = $this->getUserDateTotalArray( $date_epoch, $date_epoch );
		//print_r($udt_arr);
		//Total Time
		$this->assertEquals( 5, $udt_arr[$date_epoch][0]['object_type_id'] );                               //5=System Total
		$this->assertEquals( $udt_arr[$date_epoch][0]['pay_code_id'], TTUUID::getZeroID() );
		$this->assertEquals( $udt_arr[$date_epoch][0]['total_time'], ( 12 * 3600 ) );
		//Regular Time
		$this->assertEquals( 20, $udt_arr[$date_epoch][1]['object_type_id'] );                              //Regular Time
		$this->assertEquals( $udt_arr[$date_epoch][1]['pay_code_id'], $this->policy_ids['pay_code'][100] ); //Regular Time
		$this->assertEquals( $udt_arr[$date_epoch][1]['total_time'], ( 8 * 3600 ) );
		//Overtime1
		$this->assertEquals( 30, $udt_arr[$date_epoch][2]['object_type_id'] );                              //Overtime
		$this->assertEquals( $udt_arr[$date_epoch][2]['pay_code_id'], $policy_ids['pay_code'][0] );
		$this->assertEquals( $udt_arr[$date_epoch][2]['total_time'], ( 4 * 3600 ) );
		//Make sure no other hours
		$this->assertCount( 3, $udt_arr[$date_epoch] );

		//
		//Day of Week: 4
		//
		$date_epoch = TTDate::incrementDate( TTDate::getMiddleDayEpoch( TTDate::getBeginWeekEpoch( time() ) ), 3, 'day' );
		$date_stamp = TTDate::getDate( 'DATE', $date_epoch );

		$dd->createPunchPair( $this->user_id,
							  strtotime( $date_stamp . ' 8:00AM' ),
							  strtotime( $date_stamp . ' 8:00PM' ),
							  [
									  'in_type_id'    => 10,
									  'out_type_id'   => 10,
									  'branch_id'     => 0,
									  'department_id' => 0,
									  'job_id'        => 0,
									  'job_item_id'   => 0,
									  'punch_tag_id'  => []
							  ],
							  true
		);

		$udt_arr = $this->getUserDateTotalArray( $date_epoch, $date_epoch );
		//print_r($udt_arr);
		//Total Time
		$this->assertEquals( 5, $udt_arr[$date_epoch][0]['object_type_id'] );                               //5=System Total
		$this->assertEquals( $udt_arr[$date_epoch][0]['pay_code_id'], TTUUID::getZeroID() );
		$this->assertEquals( $udt_arr[$date_epoch][0]['total_time'], ( 12 * 3600 ) );
		//Regular Time
		$this->assertEquals( 20, $udt_arr[$date_epoch][1]['object_type_id'] );                              //Regular Time
		$this->assertEquals( $udt_arr[$date_epoch][1]['pay_code_id'], $this->policy_ids['pay_code'][100] ); //Regular Time
		$this->assertEquals( $udt_arr[$date_epoch][1]['total_time'], ( 7 * 3600 ) );
		//Weekly Overtime1
		$this->assertEquals( 30, $udt_arr[$date_epoch][2]['object_type_id'] );                              //Overtime
		$this->assertEquals( $udt_arr[$date_epoch][2]['pay_code_id'], $policy_ids['pay_code'][3] );
		$this->assertEquals( $udt_arr[$date_epoch][2]['total_time'], ( 1 * 3600 ) );
		//Overtime1
		$this->assertEquals( 30, $udt_arr[$date_epoch][3]['object_type_id'] );                              //Overtime
		$this->assertEquals( $udt_arr[$date_epoch][3]['pay_code_id'], $policy_ids['pay_code'][0] );
		$this->assertEquals( $udt_arr[$date_epoch][3]['total_time'], ( 4 * 3600 ) );
		//Make sure no other hours
		$this->assertCount( 4, $udt_arr[$date_epoch] );

		//
		//Day of Week: 5
		//
		$date_epoch = TTDate::incrementDate( TTDate::getMiddleDayEpoch( TTDate::getBeginWeekEpoch( time() ) ), 4, 'day' );
		$date_stamp = TTDate::getDate( 'DATE', $date_epoch );

		$dd->createPunchPair( $this->user_id,
							  strtotime( $date_stamp . ' 8:00AM' ),
							  strtotime( $date_stamp . ' 8:00PM' ),
							  [
									  'in_type_id'    => 10,
									  'out_type_id'   => 10,
									  'branch_id'     => 0,
									  'department_id' => 0,
									  'job_id'        => 0,
									  'job_item_id'   => 0,
									  'punch_tag_id'  => []
							  ],
							  true
		);

		$udt_arr = $this->getUserDateTotalArray( $date_epoch, $date_epoch );
		//print_r($udt_arr);
		//Total Time
		$this->assertEquals( 5, $udt_arr[$date_epoch][0]['object_type_id'] );                               //5=System Total
		$this->assertEquals( $udt_arr[$date_epoch][0]['pay_code_id'], TTUUID::getZeroID() );
		$this->assertEquals( $udt_arr[$date_epoch][0]['total_time'], ( 12 * 3600 ) );
		//Weekly Overtime1
		$this->assertEquals( 30, $udt_arr[$date_epoch][1]['object_type_id'] );                              //Overtime
		$this->assertEquals( $udt_arr[$date_epoch][1]['pay_code_id'], $policy_ids['pay_code'][3] );
		$this->assertEquals( $udt_arr[$date_epoch][1]['total_time'], ( 8 * 3600 ) );
		//Overtime1
		$this->assertEquals( 30, $udt_arr[$date_epoch][2]['object_type_id'] );                              //Overtime
		$this->assertEquals( $udt_arr[$date_epoch][2]['pay_code_id'], $policy_ids['pay_code'][0] );
		$this->assertEquals( $udt_arr[$date_epoch][2]['total_time'], ( 4 * 3600 ) );
		//Make sure no other hours
		$this->assertCount( 3, $udt_arr[$date_epoch] );

		//
		//Day of Week: 6
		//
		$date_epoch = TTDate::incrementDate( TTDate::getMiddleDayEpoch( TTDate::getBeginWeekEpoch( time() ) ), 5, 'day' );
		$date_stamp = TTDate::getDate( 'DATE', $date_epoch );

		$dd->createPunchPair( $this->user_id,
							  strtotime( $date_stamp . ' 8:00AM' ),
							  strtotime( $date_stamp . ' 8:00PM' ),
							  [
									  'in_type_id'    => 10,
									  'out_type_id'   => 10,
									  'branch_id'     => 0,
									  'department_id' => 0,
									  'job_id'        => 0,
									  'job_item_id'   => 0,
									  'punch_tag_id'  => []
							  ],
							  true
		);

		$udt_arr = $this->getUserDateTotalArray( $date_epoch, $date_epoch );
		//print_r($udt_arr);
		//Total Time
		$this->assertEquals( 5, $udt_arr[$date_epoch][0]['object_type_id'] );                               //5=System Total
		$this->assertEquals( $udt_arr[$date_epoch][0]['pay_code_id'], TTUUID::getZeroID() );
		$this->assertEquals( $udt_arr[$date_epoch][0]['total_time'], ( 12 * 3600 ) );
		//Weekly Overtime1
		$this->assertEquals( 30, $udt_arr[$date_epoch][1]['object_type_id'] );                              //Overtime
		$this->assertEquals( $udt_arr[$date_epoch][1]['pay_code_id'], $policy_ids['pay_code'][3] );
		$this->assertEquals( $udt_arr[$date_epoch][1]['total_time'], ( 8 * 3600 ) );
		//Overtime1
		$this->assertEquals( 30, $udt_arr[$date_epoch][2]['object_type_id'] );                              //Overtime
		$this->assertEquals( $udt_arr[$date_epoch][2]['pay_code_id'], $policy_ids['pay_code'][0] );
		$this->assertEquals( $udt_arr[$date_epoch][2]['total_time'], ( 4 * 3600 ) );
		//Make sure no other hours
		$this->assertCount( 3, $udt_arr[$date_epoch] );

		return true;
	}

	/**
	 * @group OvertimePolicy_testDifferentialDailyAndWeeklyOverTimePolicyB
	 */
	function testDifferentialDailyAndWeeklyOverTimePolicyB() {
		if ( getTTProductEdition() == TT_PRODUCT_COMMUNITY ) {
			return true;
		}

		global $dd;

		$policy_ids['pay_formula_policy'][] = $this->createPayFormulaPolicy( $this->company_id, 200 );      //OT1.5
		$policy_ids['pay_formula_policy'][] = $this->createPayFormulaPolicy( $this->company_id, 210 );      //OT2.0
		$policy_ids['pay_formula_policy'][] = $this->createPayFormulaPolicy( $this->company_id, 220 );      //OT2.5

		//Daily
		$policy_ids['pay_code'][] = $this->createPayCode( $this->company_id, 100, $policy_ids['pay_formula_policy'][0] );
		$policy_ids['pay_code'][] = $this->createPayCode( $this->company_id, 110, $policy_ids['pay_formula_policy'][1] );
		$policy_ids['pay_code'][] = $this->createPayCode( $this->company_id, 120, $policy_ids['pay_formula_policy'][2] );

		//Weekly
		$policy_ids['pay_code'][] = $this->createPayCode( $this->company_id, 230, $policy_ids['pay_formula_policy'][0] );
		//$policy_ids['pay_code'][]  = $this->createPayCode( $this->company_id, 240, $policy_ids['pay_formula_policy'][1] );
		//$policy_ids['pay_code'][]  = $this->createPayCode( $this->company_id, 250, $policy_ids['pay_formula_policy'][2] );

		$policy_ids['overtime'][] = $this->createOverTimePolicy( $this->company_id, 100, $this->policy_ids['contributing_shift_policy'][12], $policy_ids['pay_code'][0] );
		$policy_ids['overtime'][] = $this->createOverTimePolicy( $this->company_id, 1000, $this->policy_ids['contributing_shift_policy'][12], $policy_ids['pay_code'][1] );
		$policy_ids['overtime'][] = $this->createOverTimePolicy( $this->company_id, 1001, $this->policy_ids['contributing_shift_policy'][12], $policy_ids['pay_code'][2] );
		$policy_ids['overtime'][] = $this->createOverTimePolicy( $this->company_id, 230, $this->policy_ids['contributing_shift_policy'][12], $policy_ids['pay_code'][3] );

		//Create Policy Group
		$dd->createPolicyGroup( $this->company_id,
								null, //Meal
								null, //Exception
								null, //Holiday
								$policy_ids['overtime'], //OT
								null, //Premium
								null, //Round
								[ $this->user_id ], //Users
								null, //Break
								null, //Accrual
								null, //Expense
								null, //Absence
								[ $this->policy_ids['regular'][12] ] //Regular
		);


		$date_epoch = TTDate::getMiddleDayEpoch( TTDate::getBeginWeekEpoch( time() ) );
		$date_stamp = TTDate::getDate( 'DATE', $date_epoch );

		//
		//Day of Week: 1
		//
		$dd->createPunchPair( $this->user_id,
							  strtotime( $date_stamp . ' 8:00AM' ),
							  strtotime( $date_stamp . ' 8:00PM' ),
							  [
									  'in_type_id'    => 10,
									  'out_type_id'   => 10,
									  'branch_id'     => $this->branch_ids[0],
									  'department_id' => 0,
									  'job_id'        => 0,
									  'job_item_id'   => 0,
									  'punch_tag_id'  => []
							  ],
							  true
		);

		$udt_arr = $this->getUserDateTotalArray( $date_epoch, $date_epoch );
		//print_r($udt_arr);
		//Total Time
		$this->assertEquals( 5, $udt_arr[$date_epoch][0]['object_type_id'] );                               //5=System Total
		$this->assertEquals( $udt_arr[$date_epoch][0]['pay_code_id'], TTUUID::getZeroID() );
		$this->assertEquals( $udt_arr[$date_epoch][0]['total_time'], ( 12 * 3600 ) );
		//Regular Time
		$this->assertEquals( 20, $udt_arr[$date_epoch][1]['object_type_id'] );                              //Regular Time
		$this->assertEquals( $udt_arr[$date_epoch][1]['pay_code_id'], $this->policy_ids['pay_code'][100] ); //Regular Time
		$this->assertEquals( $udt_arr[$date_epoch][1]['total_time'], ( 8 * 3600 ) );
		//Overtime1
		$this->assertEquals( 30, $udt_arr[$date_epoch][2]['object_type_id'] );                              //Overtime
		$this->assertEquals( $udt_arr[$date_epoch][2]['pay_code_id'], $policy_ids['pay_code'][1] );
		$this->assertEquals( $udt_arr[$date_epoch][2]['total_time'], ( 4 * 3600 ) );
		//Make sure no other hours
		$this->assertCount( 3, $udt_arr[$date_epoch] );

		//
		//Day of Week: 2
		//
		$date_epoch = TTDate::incrementDate( TTDate::getMiddleDayEpoch( TTDate::getBeginWeekEpoch( time() ) ), 1, 'day' );
		$date_stamp = TTDate::getDate( 'DATE', $date_epoch );

		$dd->createPunchPair( $this->user_id,
							  strtotime( $date_stamp . ' 8:00AM' ),
							  strtotime( $date_stamp . ' 8:00PM' ),
							  [
									  'in_type_id'    => 10,
									  'out_type_id'   => 10,
									  'branch_id'     => $this->branch_ids[0],
									  'department_id' => 0,
									  'job_id'        => 0,
									  'job_item_id'   => 0,
									  'punch_tag_id'  => []
							  ],
							  true
		);

		$udt_arr = $this->getUserDateTotalArray( $date_epoch, $date_epoch );
		//print_r($udt_arr);
		//Total Time
		$this->assertEquals( 5, $udt_arr[$date_epoch][0]['object_type_id'] );                               //5=System Total
		$this->assertEquals( $udt_arr[$date_epoch][0]['pay_code_id'], TTUUID::getZeroID() );
		$this->assertEquals( $udt_arr[$date_epoch][0]['total_time'], ( 12 * 3600 ) );
		//Regular Time
		$this->assertEquals( 20, $udt_arr[$date_epoch][1]['object_type_id'] );                              //Regular Time
		$this->assertEquals( $udt_arr[$date_epoch][1]['pay_code_id'], $this->policy_ids['pay_code'][100] ); //Regular Time
		$this->assertEquals( $udt_arr[$date_epoch][1]['total_time'], ( 8 * 3600 ) );
		//Overtime1
		$this->assertEquals( 30, $udt_arr[$date_epoch][2]['object_type_id'] );                              //Overtime
		$this->assertEquals( $udt_arr[$date_epoch][2]['pay_code_id'], $policy_ids['pay_code'][1] );
		$this->assertEquals( $udt_arr[$date_epoch][2]['total_time'], ( 4 * 3600 ) );
		//Make sure no other hours
		$this->assertCount( 3, $udt_arr[$date_epoch] );

		//
		//Day of Week: 3
		//
		$date_epoch = TTDate::incrementDate( TTDate::getMiddleDayEpoch( TTDate::getBeginWeekEpoch( time() ) ), 2, 'day' );
		$date_stamp = TTDate::getDate( 'DATE', $date_epoch );

		$dd->createPunchPair( $this->user_id,
							  strtotime( $date_stamp . ' 8:00AM' ),
							  strtotime( $date_stamp . ' 8:00PM' ),
							  [
									  'in_type_id'    => 10,
									  'out_type_id'   => 10,
									  'branch_id'     => $this->branch_ids[0],
									  'department_id' => 0,
									  'job_id'        => 0,
									  'job_item_id'   => 0,
									  'punch_tag_id'  => []
							  ],
							  true
		);

		$udt_arr = $this->getUserDateTotalArray( $date_epoch, $date_epoch );
		//print_r($udt_arr);
		//Total Time
		$this->assertEquals( 5, $udt_arr[$date_epoch][0]['object_type_id'] );                               //5=System Total
		$this->assertEquals( $udt_arr[$date_epoch][0]['pay_code_id'], TTUUID::getZeroID() );
		$this->assertEquals( $udt_arr[$date_epoch][0]['total_time'], ( 12 * 3600 ) );
		//Regular Time
		$this->assertEquals( 20, $udt_arr[$date_epoch][1]['object_type_id'] );                              //Regular Time
		$this->assertEquals( $udt_arr[$date_epoch][1]['pay_code_id'], $this->policy_ids['pay_code'][100] ); //Regular Time
		$this->assertEquals( $udt_arr[$date_epoch][1]['total_time'], ( 8 * 3600 ) );
		//Overtime1
		$this->assertEquals( 30, $udt_arr[$date_epoch][2]['object_type_id'] );                              //Overtime
		$this->assertEquals( $udt_arr[$date_epoch][2]['pay_code_id'], $policy_ids['pay_code'][1] );
		$this->assertEquals( $udt_arr[$date_epoch][2]['total_time'], ( 4 * 3600 ) );
		//Make sure no other hours
		$this->assertCount( 3, $udt_arr[$date_epoch] );

		//
		//Day of Week: 4
		//
		$date_epoch = TTDate::incrementDate( TTDate::getMiddleDayEpoch( TTDate::getBeginWeekEpoch( time() ) ), 3, 'day' );
		$date_stamp = TTDate::getDate( 'DATE', $date_epoch );

		$dd->createPunchPair( $this->user_id,
							  strtotime( $date_stamp . ' 8:00AM' ),
							  strtotime( $date_stamp . ' 8:00PM' ),
							  [
									  'in_type_id'    => 10,
									  'out_type_id'   => 10,
									  'branch_id'     => $this->branch_ids[0],
									  'department_id' => 0,
									  'job_id'        => 0,
									  'job_item_id'   => 0,
									  'punch_tag_id'  => []
							  ],
							  true
		);

		$udt_arr = $this->getUserDateTotalArray( $date_epoch, $date_epoch );
		//print_r($udt_arr);
		//Total Time
		$this->assertEquals( 5, $udt_arr[$date_epoch][0]['object_type_id'] );                               //5=System Total
		$this->assertEquals( $udt_arr[$date_epoch][0]['pay_code_id'], TTUUID::getZeroID() );
		$this->assertEquals( $udt_arr[$date_epoch][0]['total_time'], ( 12 * 3600 ) );
		//Regular Time
		$this->assertEquals( 20, $udt_arr[$date_epoch][1]['object_type_id'] );                              //Regular Time
		$this->assertEquals( $udt_arr[$date_epoch][1]['pay_code_id'], $this->policy_ids['pay_code'][100] ); //Regular Time
		$this->assertEquals( $udt_arr[$date_epoch][1]['total_time'], ( 7 * 3600 ) );
		//Weekly Overtime1
		$this->assertEquals( 30, $udt_arr[$date_epoch][2]['object_type_id'] );                              //Overtime
		$this->assertEquals( $udt_arr[$date_epoch][2]['pay_code_id'], $policy_ids['pay_code'][3] );
		$this->assertEquals( $udt_arr[$date_epoch][2]['total_time'], ( 1 * 3600 ) );
		//Overtime1
		$this->assertEquals( 30, $udt_arr[$date_epoch][3]['object_type_id'] );                              //Overtime
		$this->assertEquals( $udt_arr[$date_epoch][3]['pay_code_id'], $policy_ids['pay_code'][1] );
		$this->assertEquals( $udt_arr[$date_epoch][3]['total_time'], ( 4 * 3600 ) );
		//Make sure no other hours
		$this->assertCount( 4, $udt_arr[$date_epoch] );

		//
		//Day of Week: 5
		//
		$date_epoch = TTDate::incrementDate( TTDate::getMiddleDayEpoch( TTDate::getBeginWeekEpoch( time() ) ), 4, 'day' );
		$date_stamp = TTDate::getDate( 'DATE', $date_epoch );

		$dd->createPunchPair( $this->user_id,
							  strtotime( $date_stamp . ' 8:00AM' ),
							  strtotime( $date_stamp . ' 8:00PM' ),
							  [
									  'in_type_id'    => 10,
									  'out_type_id'   => 10,
									  'branch_id'     => $this->branch_ids[0],
									  'department_id' => 0,
									  'job_id'        => 0,
									  'job_item_id'   => 0,
									  'punch_tag_id'  => []
							  ],
							  true
		);

		$udt_arr = $this->getUserDateTotalArray( $date_epoch, $date_epoch );
		//print_r($udt_arr);
		//Total Time
		$this->assertEquals( 5, $udt_arr[$date_epoch][0]['object_type_id'] );                               //5=System Total
		$this->assertEquals( $udt_arr[$date_epoch][0]['pay_code_id'], TTUUID::getZeroID() );
		$this->assertEquals( $udt_arr[$date_epoch][0]['total_time'], ( 12 * 3600 ) );
		//Weekly Overtime1
		$this->assertEquals( 30, $udt_arr[$date_epoch][1]['object_type_id'] );                              //Overtime
		$this->assertEquals( $udt_arr[$date_epoch][1]['pay_code_id'], $policy_ids['pay_code'][3] );
		$this->assertEquals( $udt_arr[$date_epoch][1]['total_time'], ( 8 * 3600 ) );
		//Overtime1
		$this->assertEquals( 30, $udt_arr[$date_epoch][2]['object_type_id'] );                              //Overtime
		$this->assertEquals( $udt_arr[$date_epoch][2]['pay_code_id'], $policy_ids['pay_code'][1] );
		$this->assertEquals( $udt_arr[$date_epoch][2]['total_time'], ( 4 * 3600 ) );
		//Make sure no other hours
		$this->assertCount( 3, $udt_arr[$date_epoch] );

		//
		//Day of Week: 6
		//
		$date_epoch = TTDate::incrementDate( TTDate::getMiddleDayEpoch( TTDate::getBeginWeekEpoch( time() ) ), 5, 'day' );
		$date_stamp = TTDate::getDate( 'DATE', $date_epoch );

		$dd->createPunchPair( $this->user_id,
							  strtotime( $date_stamp . ' 8:00AM' ),
							  strtotime( $date_stamp . ' 8:00PM' ),
							  [
									  'in_type_id'    => 10,
									  'out_type_id'   => 10,
									  'branch_id'     => $this->branch_ids[0],
									  'department_id' => 0,
									  'job_id'        => 0,
									  'job_item_id'   => 0,
									  'punch_tag_id'  => []
							  ],
							  true
		);

		$udt_arr = $this->getUserDateTotalArray( $date_epoch, $date_epoch );
		//print_r($udt_arr);
		//Total Time
		$this->assertEquals( 5, $udt_arr[$date_epoch][0]['object_type_id'] );                               //5=System Total
		$this->assertEquals( $udt_arr[$date_epoch][0]['pay_code_id'], TTUUID::getZeroID() );
		$this->assertEquals( $udt_arr[$date_epoch][0]['total_time'], ( 12 * 3600 ) );
		//Weekly Overtime1
		$this->assertEquals( 30, $udt_arr[$date_epoch][1]['object_type_id'] );                              //Overtime
		$this->assertEquals( $udt_arr[$date_epoch][1]['pay_code_id'], $policy_ids['pay_code'][3] );
		$this->assertEquals( $udt_arr[$date_epoch][1]['total_time'], ( 8 * 3600 ) );
		//Overtime1
		$this->assertEquals( 30, $udt_arr[$date_epoch][2]['object_type_id'] );                              //Overtime
		$this->assertEquals( $udt_arr[$date_epoch][2]['pay_code_id'], $policy_ids['pay_code'][1] );
		$this->assertEquals( $udt_arr[$date_epoch][2]['total_time'], ( 4 * 3600 ) );
		//Make sure no other hours
		$this->assertCount( 3, $udt_arr[$date_epoch] );

		return true;
	}

	/**
	 * @group OvertimePolicy_testDifferentialDailyAndWeeklyOverTimePolicyC
	 */
	function testDifferentialDailyAndWeeklyOverTimePolicyC() {
		if ( getTTProductEdition() == TT_PRODUCT_COMMUNITY ) {
			return true;
		}

		global $dd;

		$policy_ids['pay_formula_policy'][] = $this->createPayFormulaPolicy( $this->company_id, 200 );      //OT1.5
		$policy_ids['pay_formula_policy'][] = $this->createPayFormulaPolicy( $this->company_id, 210 );      //OT2.0
		$policy_ids['pay_formula_policy'][] = $this->createPayFormulaPolicy( $this->company_id, 220 );      //OT2.5

		//Daily
		$policy_ids['pay_code'][] = $this->createPayCode( $this->company_id, 100, $policy_ids['pay_formula_policy'][0] );
		$policy_ids['pay_code'][] = $this->createPayCode( $this->company_id, 110, $policy_ids['pay_formula_policy'][1] );
		$policy_ids['pay_code'][] = $this->createPayCode( $this->company_id, 120, $policy_ids['pay_formula_policy'][2] );

		//Weekly
		$policy_ids['pay_code'][] = $this->createPayCode( $this->company_id, 230, $policy_ids['pay_formula_policy'][0] );
		//$policy_ids['pay_code'][]  = $this->createPayCode( $this->company_id, 240, $policy_ids['pay_formula_policy'][1] );
		//$policy_ids['pay_code'][]  = $this->createPayCode( $this->company_id, 250, $policy_ids['pay_formula_policy'][2] );

		$policy_ids['overtime'][] = $this->createOverTimePolicy( $this->company_id, 100, $this->policy_ids['contributing_shift_policy'][12], $policy_ids['pay_code'][0] );
		$policy_ids['overtime'][] = $this->createOverTimePolicy( $this->company_id, 1000, $this->policy_ids['contributing_shift_policy'][12], $policy_ids['pay_code'][1] );
		$policy_ids['overtime'][] = $this->createOverTimePolicy( $this->company_id, 1001, $this->policy_ids['contributing_shift_policy'][12], $policy_ids['pay_code'][2] );
		$policy_ids['overtime'][] = $this->createOverTimePolicy( $this->company_id, 230, $this->policy_ids['contributing_shift_policy'][12], $policy_ids['pay_code'][3] );

		//Create Policy Group
		$dd->createPolicyGroup( $this->company_id,
								null, //Meal
								null, //Exception
								null, //Holiday
								$policy_ids['overtime'], //OT
								null, //Premium
								null, //Round
								[ $this->user_id ], //Users
								null, //Break
								null, //Accrual
								null, //Expense
								null, //Absence
								[ $this->policy_ids['regular'][12] ] //Regular
		);


		$date_epoch = TTDate::getMiddleDayEpoch( TTDate::getBeginWeekEpoch( time() ) );
		$date_stamp = TTDate::getDate( 'DATE', $date_epoch );

		//
		//Day of Week: 1
		//
		$dd->createPunchPair( $this->user_id,
							  strtotime( $date_stamp . ' 8:00AM' ),
							  strtotime( $date_stamp . ' 8:00PM' ),
							  [
									  'in_type_id'    => 10,
									  'out_type_id'   => 10,
									  'branch_id'     => $this->branch_ids[1],
									  'department_id' => 0,
									  'job_id'        => 0,
									  'job_item_id'   => 0,
									  'punch_tag_id'  => []
							  ],
							  true
		);

		$udt_arr = $this->getUserDateTotalArray( $date_epoch, $date_epoch );
		//print_r($udt_arr);
		//Total Time
		$this->assertEquals( 5, $udt_arr[$date_epoch][0]['object_type_id'] );                               //5=System Total
		$this->assertEquals( $udt_arr[$date_epoch][0]['pay_code_id'], TTUUID::getZeroID() );
		$this->assertEquals( $udt_arr[$date_epoch][0]['total_time'], ( 12 * 3600 ) );
		//Regular Time
		$this->assertEquals( 20, $udt_arr[$date_epoch][1]['object_type_id'] );                              //Regular Time
		$this->assertEquals( $udt_arr[$date_epoch][1]['pay_code_id'], $this->policy_ids['pay_code'][100] ); //Regular Time
		$this->assertEquals( $udt_arr[$date_epoch][1]['total_time'], ( 8 * 3600 ) );
		//Overtime1
		$this->assertEquals( 30, $udt_arr[$date_epoch][2]['object_type_id'] );                              //Overtime
		$this->assertEquals( $udt_arr[$date_epoch][2]['pay_code_id'], $policy_ids['pay_code'][2] );
		$this->assertEquals( $udt_arr[$date_epoch][2]['total_time'], ( 4 * 3600 ) );
		//Make sure no other hours
		$this->assertCount( 3, $udt_arr[$date_epoch] );

		//
		//Day of Week: 2
		//
		$date_epoch = TTDate::incrementDate( TTDate::getMiddleDayEpoch( TTDate::getBeginWeekEpoch( time() ) ), 1, 'day' );
		$date_stamp = TTDate::getDate( 'DATE', $date_epoch );

		$dd->createPunchPair( $this->user_id,
							  strtotime( $date_stamp . ' 8:00AM' ),
							  strtotime( $date_stamp . ' 8:00PM' ),
							  [
									  'in_type_id'    => 10,
									  'out_type_id'   => 10,
									  'branch_id'     => $this->branch_ids[1],
									  'department_id' => 0,
									  'job_id'        => 0,
									  'job_item_id'   => 0,
									  'punch_tag_id'  => []
							  ],
							  true
		);

		$udt_arr = $this->getUserDateTotalArray( $date_epoch, $date_epoch );
		//print_r($udt_arr);
		//Total Time
		$this->assertEquals( 5, $udt_arr[$date_epoch][0]['object_type_id'] );                               //5=System Total
		$this->assertEquals( $udt_arr[$date_epoch][0]['pay_code_id'], TTUUID::getZeroID() );
		$this->assertEquals( $udt_arr[$date_epoch][0]['total_time'], ( 12 * 3600 ) );
		//Regular Time
		$this->assertEquals( 20, $udt_arr[$date_epoch][1]['object_type_id'] );                              //Regular Time
		$this->assertEquals( $udt_arr[$date_epoch][1]['pay_code_id'], $this->policy_ids['pay_code'][100] ); //Regular Time
		$this->assertEquals( $udt_arr[$date_epoch][1]['total_time'], ( 8 * 3600 ) );
		//Overtime1
		$this->assertEquals( 30, $udt_arr[$date_epoch][2]['object_type_id'] );                              //Overtime
		$this->assertEquals( $udt_arr[$date_epoch][2]['pay_code_id'], $policy_ids['pay_code'][2] );
		$this->assertEquals( $udt_arr[$date_epoch][2]['total_time'], ( 4 * 3600 ) );
		//Make sure no other hours
		$this->assertCount( 3, $udt_arr[$date_epoch] );

		//
		//Day of Week: 3
		//
		$date_epoch = TTDate::incrementDate( TTDate::getMiddleDayEpoch( TTDate::getBeginWeekEpoch( time() ) ), 2, 'day' );
		$date_stamp = TTDate::getDate( 'DATE', $date_epoch );

		$dd->createPunchPair( $this->user_id,
							  strtotime( $date_stamp . ' 8:00AM' ),
							  strtotime( $date_stamp . ' 8:00PM' ),
							  [
									  'in_type_id'    => 10,
									  'out_type_id'   => 10,
									  'branch_id'     => $this->branch_ids[1],
									  'department_id' => 0,
									  'job_id'        => 0,
									  'job_item_id'   => 0,
									  'punch_tag_id'  => []
							  ],
							  true
		);

		$udt_arr = $this->getUserDateTotalArray( $date_epoch, $date_epoch );
		//print_r($udt_arr);
		//Total Time
		$this->assertEquals( 5, $udt_arr[$date_epoch][0]['object_type_id'] );                               //5=System Total
		$this->assertEquals( $udt_arr[$date_epoch][0]['pay_code_id'], TTUUID::getZeroID() );
		$this->assertEquals( $udt_arr[$date_epoch][0]['total_time'], ( 12 * 3600 ) );
		//Regular Time
		$this->assertEquals( 20, $udt_arr[$date_epoch][1]['object_type_id'] );                              //Regular Time
		$this->assertEquals( $udt_arr[$date_epoch][1]['pay_code_id'], $this->policy_ids['pay_code'][100] ); //Regular Time
		$this->assertEquals( $udt_arr[$date_epoch][1]['total_time'], ( 8 * 3600 ) );
		//Overtime1
		$this->assertEquals( 30, $udt_arr[$date_epoch][2]['object_type_id'] );                              //Overtime
		$this->assertEquals( $udt_arr[$date_epoch][2]['pay_code_id'], $policy_ids['pay_code'][2] );
		$this->assertEquals( $udt_arr[$date_epoch][2]['total_time'], ( 4 * 3600 ) );
		//Make sure no other hours
		$this->assertCount( 3, $udt_arr[$date_epoch] );

		//
		//Day of Week: 4
		//
		$date_epoch = TTDate::incrementDate( TTDate::getMiddleDayEpoch( TTDate::getBeginWeekEpoch( time() ) ), 3, 'day' );
		$date_stamp = TTDate::getDate( 'DATE', $date_epoch );

		$dd->createPunchPair( $this->user_id,
							  strtotime( $date_stamp . ' 8:00AM' ),
							  strtotime( $date_stamp . ' 8:00PM' ),
							  [
									  'in_type_id'    => 10,
									  'out_type_id'   => 10,
									  'branch_id'     => $this->branch_ids[1],
									  'department_id' => 0,
									  'job_id'        => 0,
									  'job_item_id'   => 0,
									  'punch_tag_id'  => []
							  ],
							  true
		);

		$udt_arr = $this->getUserDateTotalArray( $date_epoch, $date_epoch );
		//print_r($udt_arr);
		//Total Time
		$this->assertEquals( 5, $udt_arr[$date_epoch][0]['object_type_id'] );                               //5=System Total
		$this->assertEquals( $udt_arr[$date_epoch][0]['pay_code_id'], TTUUID::getZeroID() );
		$this->assertEquals( $udt_arr[$date_epoch][0]['total_time'], ( 12 * 3600 ) );
		//Regular Time
		$this->assertEquals( 20, $udt_arr[$date_epoch][1]['object_type_id'] );                              //Regular Time
		$this->assertEquals( $udt_arr[$date_epoch][1]['pay_code_id'], $this->policy_ids['pay_code'][100] ); //Regular Time
		$this->assertEquals( $udt_arr[$date_epoch][1]['total_time'], ( 7 * 3600 ) );
		//Weekly Overtime1
		$this->assertEquals( 30, $udt_arr[$date_epoch][2]['object_type_id'] );                              //Overtime
		$this->assertEquals( $udt_arr[$date_epoch][2]['pay_code_id'], $policy_ids['pay_code'][3] );
		$this->assertEquals( $udt_arr[$date_epoch][2]['total_time'], ( 1 * 3600 ) );
		//Overtime1
		$this->assertEquals( 30, $udt_arr[$date_epoch][3]['object_type_id'] );                              //Overtime
		$this->assertEquals( $udt_arr[$date_epoch][3]['pay_code_id'], $policy_ids['pay_code'][2] );
		$this->assertEquals( $udt_arr[$date_epoch][3]['total_time'], ( 4 * 3600 ) );
		//Make sure no other hours
		$this->assertCount( 4, $udt_arr[$date_epoch] );

		//
		//Day of Week: 5
		//
		$date_epoch = TTDate::incrementDate( TTDate::getMiddleDayEpoch( TTDate::getBeginWeekEpoch( time() ) ), 4, 'day' );
		$date_stamp = TTDate::getDate( 'DATE', $date_epoch );

		$dd->createPunchPair( $this->user_id,
							  strtotime( $date_stamp . ' 8:00AM' ),
							  strtotime( $date_stamp . ' 8:00PM' ),
							  [
									  'in_type_id'    => 10,
									  'out_type_id'   => 10,
									  'branch_id'     => $this->branch_ids[1],
									  'department_id' => 0,
									  'job_id'        => 0,
									  'job_item_id'   => 0,
									  'punch_tag_id'  => []
							  ],
							  true
		);

		$udt_arr = $this->getUserDateTotalArray( $date_epoch, $date_epoch );
		//print_r($udt_arr);
		//Total Time
		$this->assertEquals( 5, $udt_arr[$date_epoch][0]['object_type_id'] );                               //5=System Total
		$this->assertEquals( $udt_arr[$date_epoch][0]['pay_code_id'], TTUUID::getZeroID() );
		$this->assertEquals( $udt_arr[$date_epoch][0]['total_time'], ( 12 * 3600 ) );
		//Weekly Overtime1
		$this->assertEquals( 30, $udt_arr[$date_epoch][1]['object_type_id'] );                              //Overtime
		$this->assertEquals( $udt_arr[$date_epoch][1]['pay_code_id'], $policy_ids['pay_code'][3] );
		$this->assertEquals( $udt_arr[$date_epoch][1]['total_time'], ( 8 * 3600 ) );
		//Overtime1
		$this->assertEquals( 30, $udt_arr[$date_epoch][2]['object_type_id'] );                              //Overtime
		$this->assertEquals( $udt_arr[$date_epoch][2]['pay_code_id'], $policy_ids['pay_code'][2] );
		$this->assertEquals( $udt_arr[$date_epoch][2]['total_time'], ( 4 * 3600 ) );
		//Make sure no other hours
		$this->assertCount( 3, $udt_arr[$date_epoch] );

		//
		//Day of Week: 6
		//
		$date_epoch = TTDate::incrementDate( TTDate::getMiddleDayEpoch( TTDate::getBeginWeekEpoch( time() ) ), 5, 'day' );
		$date_stamp = TTDate::getDate( 'DATE', $date_epoch );

		$dd->createPunchPair( $this->user_id,
							  strtotime( $date_stamp . ' 8:00AM' ),
							  strtotime( $date_stamp . ' 8:00PM' ),
							  [
									  'in_type_id'    => 10,
									  'out_type_id'   => 10,
									  'branch_id'     => $this->branch_ids[1],
									  'department_id' => 0,
									  'job_id'        => 0,
									  'job_item_id'   => 0,
									  'punch_tag_id'  => []
							  ],
							  true
		);

		$udt_arr = $this->getUserDateTotalArray( $date_epoch, $date_epoch );
		//print_r($udt_arr);
		//Total Time
		$this->assertEquals( 5, $udt_arr[$date_epoch][0]['object_type_id'] );                               //5=System Total
		$this->assertEquals( $udt_arr[$date_epoch][0]['pay_code_id'], TTUUID::getZeroID() );
		$this->assertEquals( $udt_arr[$date_epoch][0]['total_time'], ( 12 * 3600 ) );
		//Weekly Overtime1
		$this->assertEquals( 30, $udt_arr[$date_epoch][1]['object_type_id'] );                              //Overtime
		$this->assertEquals( $udt_arr[$date_epoch][1]['pay_code_id'], $policy_ids['pay_code'][3] );
		$this->assertEquals( $udt_arr[$date_epoch][1]['total_time'], ( 8 * 3600 ) );
		//Overtime1
		$this->assertEquals( 30, $udt_arr[$date_epoch][2]['object_type_id'] );                              //Overtime
		$this->assertEquals( $udt_arr[$date_epoch][2]['pay_code_id'], $policy_ids['pay_code'][2] );
		$this->assertEquals( $udt_arr[$date_epoch][2]['total_time'], ( 4 * 3600 ) );
		//Make sure no other hours
		$this->assertCount( 3, $udt_arr[$date_epoch] );

		return true;
	}

	/**
	 * @group OvertimePolicy_testDifferentialDailyAndWeeklyOverTimePolicyD
	 */
	function testDifferentialDailyAndWeeklyOverTimePolicyD() {
		if ( getTTProductEdition() == TT_PRODUCT_COMMUNITY ) {
			return true;
		}

		global $dd;

		$policy_ids['pay_formula_policy'][] = $this->createPayFormulaPolicy( $this->company_id, 200 );      //OT1.5
		$policy_ids['pay_formula_policy'][] = $this->createPayFormulaPolicy( $this->company_id, 210 );      //OT2.0
		$policy_ids['pay_formula_policy'][] = $this->createPayFormulaPolicy( $this->company_id, 220 );      //OT2.5

		//Daily
		$policy_ids['pay_code'][] = $this->createPayCode( $this->company_id, 100, $policy_ids['pay_formula_policy'][0] );
		$policy_ids['pay_code'][] = $this->createPayCode( $this->company_id, 110, $policy_ids['pay_formula_policy'][1] );
		$policy_ids['pay_code'][] = $this->createPayCode( $this->company_id, 120, $policy_ids['pay_formula_policy'][2] );

		//Weekly
		$policy_ids['pay_code'][] = $this->createPayCode( $this->company_id, 230, $policy_ids['pay_formula_policy'][0] );
		//$policy_ids['pay_code'][]  = $this->createPayCode( $this->company_id, 240, $policy_ids['pay_formula_policy'][1] );
		//$policy_ids['pay_code'][]  = $this->createPayCode( $this->company_id, 250, $policy_ids['pay_formula_policy'][2] );

		$policy_ids['overtime'][] = $this->createOverTimePolicy( $this->company_id, 100, $this->policy_ids['contributing_shift_policy'][12], $policy_ids['pay_code'][0] );
		$policy_ids['overtime'][] = $this->createOverTimePolicy( $this->company_id, 1000, $this->policy_ids['contributing_shift_policy'][12], $policy_ids['pay_code'][1] );
		$policy_ids['overtime'][] = $this->createOverTimePolicy( $this->company_id, 1001, $this->policy_ids['contributing_shift_policy'][12], $policy_ids['pay_code'][2] );
		$policy_ids['overtime'][] = $this->createOverTimePolicy( $this->company_id, 230, $this->policy_ids['contributing_shift_policy'][12], $policy_ids['pay_code'][3] );

		//Create Policy Group
		$dd->createPolicyGroup( $this->company_id,
								null, //Meal
								null, //Exception
								null, //Holiday
								$policy_ids['overtime'], //OT
								null, //Premium
								null, //Round
								[ $this->user_id ], //Users
								null, //Break
								null, //Accrual
								null, //Expense
								null, //Absence
								[ $this->policy_ids['regular'][12] ] //Regular
		);


		$date_epoch = TTDate::getMiddleDayEpoch( TTDate::getBeginWeekEpoch( time() ) );
		$date_stamp = TTDate::getDate( 'DATE', $date_epoch );

		//
		//Day of Week: 1
		//
		$dd->createPunchPair( $this->user_id,
							  strtotime( $date_stamp . ' 8:00AM' ),
							  strtotime( $date_stamp . ' 8:00PM' ),
							  [
									  'in_type_id'    => 10,
									  'out_type_id'   => 10,
									  'branch_id'     => 0,
									  'department_id' => 0,
									  'job_id'        => 0,
									  'job_item_id'   => 0,
									  'punch_tag_id'  => []
							  ],
							  true
		);

		$udt_arr = $this->getUserDateTotalArray( $date_epoch, $date_epoch );
		//print_r($udt_arr);
		//Total Time
		$this->assertEquals( 5, $udt_arr[$date_epoch][0]['object_type_id'] );                               //5=System Total
		$this->assertEquals( $udt_arr[$date_epoch][0]['pay_code_id'], TTUUID::getZeroID() );
		$this->assertEquals( $udt_arr[$date_epoch][0]['total_time'], ( 12 * 3600 ) );
		//Regular Time
		$this->assertEquals( 20, $udt_arr[$date_epoch][1]['object_type_id'] );                              //Regular Time
		$this->assertEquals( $udt_arr[$date_epoch][1]['pay_code_id'], $this->policy_ids['pay_code'][100] ); //Regular Time
		$this->assertEquals( $udt_arr[$date_epoch][1]['total_time'], ( 8 * 3600 ) );
		//Overtime1
		$this->assertEquals( 30, $udt_arr[$date_epoch][2]['object_type_id'] );                              //Overtime
		$this->assertEquals( $udt_arr[$date_epoch][2]['pay_code_id'], $policy_ids['pay_code'][0] );
		$this->assertEquals( $udt_arr[$date_epoch][2]['total_time'], ( 4 * 3600 ) );
		//Make sure no other hours
		$this->assertCount( 3, $udt_arr[$date_epoch] );

		//
		//Day of Week: 2
		//
		$date_epoch = TTDate::incrementDate( TTDate::getMiddleDayEpoch( TTDate::getBeginWeekEpoch( time() ) ), 1, 'day' );
		$date_stamp = TTDate::getDate( 'DATE', $date_epoch );

		$dd->createPunchPair( $this->user_id,
							  strtotime( $date_stamp . ' 8:00AM' ),
							  strtotime( $date_stamp . ' 8:00PM' ),
							  [
									  'in_type_id'    => 10,
									  'out_type_id'   => 10,
									  'branch_id'     => $this->branch_ids[0],
									  'department_id' => 0,
									  'job_id'        => 0,
									  'job_item_id'   => 0,
									  'punch_tag_id'  => []
							  ],
							  true
		);

		$udt_arr = $this->getUserDateTotalArray( $date_epoch, $date_epoch );
		//print_r($udt_arr);
		//Total Time
		$this->assertEquals( 5, $udt_arr[$date_epoch][0]['object_type_id'] );                               //5=System Total
		$this->assertEquals( $udt_arr[$date_epoch][0]['pay_code_id'], TTUUID::getZeroID() );
		$this->assertEquals( $udt_arr[$date_epoch][0]['total_time'], ( 12 * 3600 ) );
		//Regular Time
		$this->assertEquals( 20, $udt_arr[$date_epoch][1]['object_type_id'] );                              //Regular Time
		$this->assertEquals( $udt_arr[$date_epoch][1]['pay_code_id'], $this->policy_ids['pay_code'][100] ); //Regular Time
		$this->assertEquals( $udt_arr[$date_epoch][1]['total_time'], ( 8 * 3600 ) );
		//Overtime1
		$this->assertEquals( 30, $udt_arr[$date_epoch][2]['object_type_id'] );                              //Overtime
		$this->assertEquals( $udt_arr[$date_epoch][2]['pay_code_id'], $policy_ids['pay_code'][1] );
		$this->assertEquals( $udt_arr[$date_epoch][2]['total_time'], ( 4 * 3600 ) );
		//Make sure no other hours
		$this->assertCount( 3, $udt_arr[$date_epoch] );

		//
		//Day of Week: 3
		//
		$date_epoch = TTDate::incrementDate( TTDate::getMiddleDayEpoch( TTDate::getBeginWeekEpoch( time() ) ), 2, 'day' );
		$date_stamp = TTDate::getDate( 'DATE', $date_epoch );

		$dd->createPunchPair( $this->user_id,
							  strtotime( $date_stamp . ' 8:00AM' ),
							  strtotime( $date_stamp . ' 8:00PM' ),
							  [
									  'in_type_id'    => 10,
									  'out_type_id'   => 10,
									  'branch_id'     => $this->branch_ids[1],
									  'department_id' => 0,
									  'job_id'        => 0,
									  'job_item_id'   => 0,
									  'punch_tag_id'  => []
							  ],
							  true
		);

		$udt_arr = $this->getUserDateTotalArray( $date_epoch, $date_epoch );
		//print_r($udt_arr);
		//Total Time
		$this->assertEquals( 5, $udt_arr[$date_epoch][0]['object_type_id'] );                               //5=System Total
		$this->assertEquals( $udt_arr[$date_epoch][0]['pay_code_id'], TTUUID::getZeroID() );
		$this->assertEquals( $udt_arr[$date_epoch][0]['total_time'], ( 12 * 3600 ) );
		//Regular Time
		$this->assertEquals( 20, $udt_arr[$date_epoch][1]['object_type_id'] );                              //Regular Time
		$this->assertEquals( $udt_arr[$date_epoch][1]['pay_code_id'], $this->policy_ids['pay_code'][100] ); //Regular Time
		$this->assertEquals( $udt_arr[$date_epoch][1]['total_time'], ( 8 * 3600 ) );
		//Overtime1
		$this->assertEquals( 30, $udt_arr[$date_epoch][2]['object_type_id'] );                              //Overtime
		$this->assertEquals( $udt_arr[$date_epoch][2]['pay_code_id'], $policy_ids['pay_code'][2] );
		$this->assertEquals( $udt_arr[$date_epoch][2]['total_time'], ( 4 * 3600 ) );
		//Make sure no other hours
		$this->assertCount( 3, $udt_arr[$date_epoch] );

		//
		//Day of Week: 4
		//
		$date_epoch = TTDate::incrementDate( TTDate::getMiddleDayEpoch( TTDate::getBeginWeekEpoch( time() ) ), 3, 'day' );
		$date_stamp = TTDate::getDate( 'DATE', $date_epoch );

		$dd->createPunchPair( $this->user_id,
							  strtotime( $date_stamp . ' 8:00AM' ),
							  strtotime( $date_stamp . ' 8:00PM' ),
							  [
									  'in_type_id'    => 10,
									  'out_type_id'   => 10,
									  'branch_id'     => 0,
									  'department_id' => 0,
									  'job_id'        => 0,
									  'job_item_id'   => 0,
									  'punch_tag_id'  => []
							  ],
							  true
		);

		$udt_arr = $this->getUserDateTotalArray( $date_epoch, $date_epoch );
		//print_r($udt_arr);
		//Total Time
		$this->assertEquals( 5, $udt_arr[$date_epoch][0]['object_type_id'] );                               //5=System Total
		$this->assertEquals( $udt_arr[$date_epoch][0]['pay_code_id'], TTUUID::getZeroID() );
		$this->assertEquals( $udt_arr[$date_epoch][0]['total_time'], ( 12 * 3600 ) );
		//Regular Time
		$this->assertEquals( 20, $udt_arr[$date_epoch][1]['object_type_id'] );                              //Regular Time
		$this->assertEquals( $udt_arr[$date_epoch][1]['pay_code_id'], $this->policy_ids['pay_code'][100] ); //Regular Time
		$this->assertEquals( $udt_arr[$date_epoch][1]['total_time'], ( 7 * 3600 ) );
		//Weekly Overtime1
		$this->assertEquals( 30, $udt_arr[$date_epoch][2]['object_type_id'] );                              //Overtime
		$this->assertEquals( $udt_arr[$date_epoch][2]['pay_code_id'], $policy_ids['pay_code'][3] );
		$this->assertEquals( $udt_arr[$date_epoch][2]['total_time'], ( 1 * 3600 ) );
		//Overtime1
		$this->assertEquals( 30, $udt_arr[$date_epoch][3]['object_type_id'] );                              //Overtime
		$this->assertEquals( $udt_arr[$date_epoch][3]['pay_code_id'], $policy_ids['pay_code'][0] );
		$this->assertEquals( $udt_arr[$date_epoch][3]['total_time'], ( 4 * 3600 ) );
		//Make sure no other hours
		$this->assertCount( 4, $udt_arr[$date_epoch] );

		//
		//Day of Week: 5
		//
		$date_epoch = TTDate::incrementDate( TTDate::getMiddleDayEpoch( TTDate::getBeginWeekEpoch( time() ) ), 4, 'day' );
		$date_stamp = TTDate::getDate( 'DATE', $date_epoch );

		$dd->createPunchPair( $this->user_id,
							  strtotime( $date_stamp . ' 8:00AM' ),
							  strtotime( $date_stamp . ' 8:00PM' ),
							  [
									  'in_type_id'    => 10,
									  'out_type_id'   => 10,
									  'branch_id'     => $this->branch_ids[0],
									  'department_id' => 0,
									  'job_id'        => 0,
									  'job_item_id'   => 0,
									  'punch_tag_id'  => []
							  ],
							  true
		);

		$udt_arr = $this->getUserDateTotalArray( $date_epoch, $date_epoch );
		//print_r($udt_arr);
		//Total Time
		$this->assertEquals( 5, $udt_arr[$date_epoch][0]['object_type_id'] );                               //5=System Total
		$this->assertEquals( $udt_arr[$date_epoch][0]['pay_code_id'], TTUUID::getZeroID() );
		$this->assertEquals( $udt_arr[$date_epoch][0]['total_time'], ( 12 * 3600 ) );
		//Weekly Overtime1
		$this->assertEquals( 30, $udt_arr[$date_epoch][1]['object_type_id'] );                              //Overtime
		$this->assertEquals( $udt_arr[$date_epoch][1]['pay_code_id'], $policy_ids['pay_code'][3] );
		$this->assertEquals( $udt_arr[$date_epoch][1]['total_time'], ( 8 * 3600 ) );
		//Overtime1
		$this->assertEquals( 30, $udt_arr[$date_epoch][2]['object_type_id'] );                              //Overtime
		$this->assertEquals( $udt_arr[$date_epoch][2]['pay_code_id'], $policy_ids['pay_code'][1] );
		$this->assertEquals( $udt_arr[$date_epoch][2]['total_time'], ( 4 * 3600 ) );
		//Make sure no other hours
		$this->assertCount( 3, $udt_arr[$date_epoch] );

		//
		//Day of Week: 6
		//
		$date_epoch = TTDate::incrementDate( TTDate::getMiddleDayEpoch( TTDate::getBeginWeekEpoch( time() ) ), 5, 'day' );
		$date_stamp = TTDate::getDate( 'DATE', $date_epoch );

		$dd->createPunchPair( $this->user_id,
							  strtotime( $date_stamp . ' 8:00AM' ),
							  strtotime( $date_stamp . ' 8:00PM' ),
							  [
									  'in_type_id'    => 10,
									  'out_type_id'   => 10,
									  'branch_id'     => $this->branch_ids[1],
									  'department_id' => 0,
									  'job_id'        => 0,
									  'job_item_id'   => 0,
									  'punch_tag_id'  => []
							  ],
							  true
		);

		$udt_arr = $this->getUserDateTotalArray( $date_epoch, $date_epoch );
		//print_r($udt_arr);
		//Total Time
		$this->assertEquals( 5, $udt_arr[$date_epoch][0]['object_type_id'] );                               //5=System Total
		$this->assertEquals( $udt_arr[$date_epoch][0]['pay_code_id'], TTUUID::getZeroID() );
		$this->assertEquals( $udt_arr[$date_epoch][0]['total_time'], ( 12 * 3600 ) );
		//Weekly Overtime1
		$this->assertEquals( 30, $udt_arr[$date_epoch][1]['object_type_id'] );                              //Overtime
		$this->assertEquals( $udt_arr[$date_epoch][1]['pay_code_id'], $policy_ids['pay_code'][3] );
		$this->assertEquals( $udt_arr[$date_epoch][1]['total_time'], ( 8 * 3600 ) );
		//Overtime1
		$this->assertEquals( 30, $udt_arr[$date_epoch][2]['object_type_id'] );                              //Overtime
		$this->assertEquals( $udt_arr[$date_epoch][2]['pay_code_id'], $policy_ids['pay_code'][2] );
		$this->assertEquals( $udt_arr[$date_epoch][2]['total_time'], ( 4 * 3600 ) );
		//Make sure no other hours
		$this->assertCount( 3, $udt_arr[$date_epoch] );

		return true;
	}

	/**
	 * @group OvertimePolicy_testDifferentialDailyAndWeeklyOverTimePolicyE
	 */
	function testDifferentialDailyAndWeeklyOverTimePolicyE() {
		if ( getTTProductEdition() == TT_PRODUCT_COMMUNITY ) {
			return true;
		}

		global $dd;

		$policy_ids['pay_formula_policy'][] = $this->createPayFormulaPolicy( $this->company_id, 200 );      //OT1.5
		$policy_ids['pay_formula_policy'][] = $this->createPayFormulaPolicy( $this->company_id, 210 );      //OT2.0
		$policy_ids['pay_formula_policy'][] = $this->createPayFormulaPolicy( $this->company_id, 220 );      //OT2.5

		//Daily
		$policy_ids['pay_code'][] = $this->createPayCode( $this->company_id, 100, $policy_ids['pay_formula_policy'][0] );
		$policy_ids['pay_code'][] = $this->createPayCode( $this->company_id, 110, $policy_ids['pay_formula_policy'][1] );
		$policy_ids['pay_code'][] = $this->createPayCode( $this->company_id, 120, $policy_ids['pay_formula_policy'][2] );

		//Weekly
		$policy_ids['pay_code'][] = $this->createPayCode( $this->company_id, 230, $policy_ids['pay_formula_policy'][0] );
		//$policy_ids['pay_code'][]  = $this->createPayCode( $this->company_id, 240, $policy_ids['pay_formula_policy'][1] );
		//$policy_ids['pay_code'][]  = $this->createPayCode( $this->company_id, 250, $policy_ids['pay_formula_policy'][2] );

		$policy_ids['overtime'][] = $this->createOverTimePolicy( $this->company_id, 100, $this->policy_ids['contributing_shift_policy'][12], $policy_ids['pay_code'][0] );
		$policy_ids['overtime'][] = $this->createOverTimePolicy( $this->company_id, 1000, $this->policy_ids['contributing_shift_policy'][12], $policy_ids['pay_code'][1] );
		$policy_ids['overtime'][] = $this->createOverTimePolicy( $this->company_id, 1001, $this->policy_ids['contributing_shift_policy'][12], $policy_ids['pay_code'][2] );
		$policy_ids['overtime'][] = $this->createOverTimePolicy( $this->company_id, 230, $this->policy_ids['contributing_shift_policy'][12], $policy_ids['pay_code'][3] );

		//Create Policy Group
		$dd->createPolicyGroup( $this->company_id,
								null, //Meal
								null, //Exception
								null, //Holiday
								$policy_ids['overtime'], //OT
								null, //Premium
								null, //Round
								[ $this->user_id ], //Users
								null, //Break
								null, //Accrual
								null, //Expense
								null, //Absence
								[ $this->policy_ids['regular'][12] ] //Regular
		);


		$date_epoch = TTDate::getMiddleDayEpoch( TTDate::getBeginWeekEpoch( time() ) );
		$date_stamp = TTDate::getDate( 'DATE', $date_epoch );

		//
		//Day of Week: 1
		//
		$dd->createPunchPair( $this->user_id,
							  strtotime( $date_stamp . ' 8:00AM' ),
							  strtotime( $date_stamp . ' 4:00PM' ),
							  [
									  'in_type_id'    => 10,
									  'out_type_id'   => 10,
									  'branch_id'     => 0,
									  'department_id' => 0,
									  'job_id'        => 0,
									  'job_item_id'   => 0,
									  'punch_tag_id'  => []
							  ],
							  true
		);
		$dd->createPunchPair( $this->user_id,
							  strtotime( $date_stamp . ' 4:00PM' ),
							  strtotime( $date_stamp . ' 8:00PM' ),
							  [
									  'in_type_id'    => 10,
									  'out_type_id'   => 10,
									  'branch_id'     => 0,
									  'department_id' => 0,
									  'job_id'        => 0,
									  'job_item_id'   => 0,
									  'punch_tag_id'  => []
							  ],
							  true
		);

		$udt_arr = $this->getUserDateTotalArray( $date_epoch, $date_epoch );
		//print_r($udt_arr);
		//Total Time
		$this->assertEquals( 5, $udt_arr[$date_epoch][0]['object_type_id'] );                               //5=System Total
		$this->assertEquals( $udt_arr[$date_epoch][0]['pay_code_id'], TTUUID::getZeroID() );
		$this->assertEquals( $udt_arr[$date_epoch][0]['total_time'], ( 12 * 3600 ) );
		//Regular Time
		$this->assertEquals( 20, $udt_arr[$date_epoch][1]['object_type_id'] );                              //Regular Time
		$this->assertEquals( $udt_arr[$date_epoch][1]['pay_code_id'], $this->policy_ids['pay_code'][100] ); //Regular Time
		$this->assertEquals( $udt_arr[$date_epoch][1]['total_time'], ( 8 * 3600 ) );
		//Overtime1
		$this->assertEquals( 30, $udt_arr[$date_epoch][2]['object_type_id'] );                              //Overtime
		$this->assertEquals( $udt_arr[$date_epoch][2]['pay_code_id'], $policy_ids['pay_code'][0] );
		$this->assertEquals( $udt_arr[$date_epoch][2]['total_time'], ( 4 * 3600 ) );
		//Make sure no other hours
		$this->assertCount( 3, $udt_arr[$date_epoch] );

		//
		//Day of Week: 2
		//
		$date_epoch = TTDate::incrementDate( TTDate::getMiddleDayEpoch( TTDate::getBeginWeekEpoch( time() ) ), 1, 'day' );
		$date_stamp = TTDate::getDate( 'DATE', $date_epoch );

		$dd->createPunchPair( $this->user_id,
							  strtotime( $date_stamp . ' 8:00AM' ),
							  strtotime( $date_stamp . ' 4:00PM' ),
							  [
									  'in_type_id'    => 10,
									  'out_type_id'   => 10,
									  'branch_id'     => $this->branch_ids[0],
									  'department_id' => 0,
									  'job_id'        => 0,
									  'job_item_id'   => 0,
									  'punch_tag_id'  => []
							  ],
							  true
		);
		$dd->createPunchPair( $this->user_id,
							  strtotime( $date_stamp . ' 4:00PM' ),
							  strtotime( $date_stamp . ' 8:00PM' ),
							  [
									  'in_type_id'    => 10,
									  'out_type_id'   => 10,
									  'branch_id'     => $this->branch_ids[0],
									  'department_id' => 0,
									  'job_id'        => 0,
									  'job_item_id'   => 0,
									  'punch_tag_id'  => []
							  ],
							  true
		);

		$udt_arr = $this->getUserDateTotalArray( $date_epoch, $date_epoch );
		//print_r($udt_arr);
		//Total Time
		$this->assertEquals( 5, $udt_arr[$date_epoch][0]['object_type_id'] );                               //5=System Total
		$this->assertEquals( $udt_arr[$date_epoch][0]['pay_code_id'], TTUUID::getZeroID() );
		$this->assertEquals( $udt_arr[$date_epoch][0]['total_time'], ( 12 * 3600 ) );
		//Regular Time
		$this->assertEquals( 20, $udt_arr[$date_epoch][1]['object_type_id'] );                              //Regular Time
		$this->assertEquals( $udt_arr[$date_epoch][1]['pay_code_id'], $this->policy_ids['pay_code'][100] ); //Regular Time
		$this->assertEquals( $udt_arr[$date_epoch][1]['total_time'], ( 8 * 3600 ) );
		//Overtime1
		$this->assertEquals( 30, $udt_arr[$date_epoch][2]['object_type_id'] );                              //Overtime
		$this->assertEquals( $udt_arr[$date_epoch][2]['pay_code_id'], $policy_ids['pay_code'][1] );
		$this->assertEquals( $udt_arr[$date_epoch][2]['total_time'], ( 4 * 3600 ) );
		//Make sure no other hours
		$this->assertCount( 3, $udt_arr[$date_epoch] );

		//
		//Day of Week: 3
		//
		$date_epoch = TTDate::incrementDate( TTDate::getMiddleDayEpoch( TTDate::getBeginWeekEpoch( time() ) ), 2, 'day' );
		$date_stamp = TTDate::getDate( 'DATE', $date_epoch );

		$dd->createPunchPair( $this->user_id,
							  strtotime( $date_stamp . ' 8:00AM' ),
							  strtotime( $date_stamp . ' 4:00PM' ),
							  [
									  'in_type_id'    => 10,
									  'out_type_id'   => 10,
									  'branch_id'     => $this->branch_ids[1],
									  'department_id' => 0,
									  'job_id'        => 0,
									  'job_item_id'   => 0,
									  'punch_tag_id'  => []
							  ],
							  true
		);
		$dd->createPunchPair( $this->user_id,
							  strtotime( $date_stamp . ' 4:00PM' ),
							  strtotime( $date_stamp . ' 8:00PM' ),
							  [
									  'in_type_id'    => 10,
									  'out_type_id'   => 10,
									  'branch_id'     => $this->branch_ids[1],
									  'department_id' => 0,
									  'job_id'        => 0,
									  'job_item_id'   => 0,
									  'punch_tag_id'  => []
							  ],
							  true
		);

		$udt_arr = $this->getUserDateTotalArray( $date_epoch, $date_epoch );
		//print_r($udt_arr);
		//Total Time
		$this->assertEquals( 5, $udt_arr[$date_epoch][0]['object_type_id'] );                               //5=System Total
		$this->assertEquals( $udt_arr[$date_epoch][0]['pay_code_id'], TTUUID::getZeroID() );
		$this->assertEquals( $udt_arr[$date_epoch][0]['total_time'], ( 12 * 3600 ) );
		//Regular Time
		$this->assertEquals( 20, $udt_arr[$date_epoch][1]['object_type_id'] );                              //Regular Time
		$this->assertEquals( $udt_arr[$date_epoch][1]['pay_code_id'], $this->policy_ids['pay_code'][100] ); //Regular Time
		$this->assertEquals( $udt_arr[$date_epoch][1]['total_time'], ( 8 * 3600 ) );
		//Overtime1
		$this->assertEquals( 30, $udt_arr[$date_epoch][2]['object_type_id'] );                              //Overtime
		$this->assertEquals( $udt_arr[$date_epoch][2]['pay_code_id'], $policy_ids['pay_code'][2] );
		$this->assertEquals( $udt_arr[$date_epoch][2]['total_time'], ( 4 * 3600 ) );
		//Make sure no other hours
		$this->assertCount( 3, $udt_arr[$date_epoch] );

		//
		//Day of Week: 4
		//
		$date_epoch = TTDate::incrementDate( TTDate::getMiddleDayEpoch( TTDate::getBeginWeekEpoch( time() ) ), 3, 'day' );
		$date_stamp = TTDate::getDate( 'DATE', $date_epoch );

		$dd->createPunchPair( $this->user_id,
							  strtotime( $date_stamp . ' 8:00AM' ),
							  strtotime( $date_stamp . ' 4:00PM' ),
							  [
									  'in_type_id'    => 10,
									  'out_type_id'   => 10,
									  'branch_id'     => 0,
									  'department_id' => 0,
									  'job_id'        => 0,
									  'job_item_id'   => 0,
									  'punch_tag_id'  => []
							  ],
							  true
		);
		$dd->createPunchPair( $this->user_id,
							  strtotime( $date_stamp . ' 4:00PM' ),
							  strtotime( $date_stamp . ' 8:00PM' ),
							  [
									  'in_type_id'    => 10,
									  'out_type_id'   => 10,
									  'branch_id'     => 0,
									  'department_id' => 0,
									  'job_id'        => 0,
									  'job_item_id'   => 0,
									  'punch_tag_id'  => []
							  ],
							  true
		);

		$udt_arr = $this->getUserDateTotalArray( $date_epoch, $date_epoch );
		//print_r($udt_arr);
		//Total Time
		$this->assertEquals( 5, $udt_arr[$date_epoch][0]['object_type_id'] );                               //5=System Total
		$this->assertEquals( $udt_arr[$date_epoch][0]['pay_code_id'], TTUUID::getZeroID() );
		$this->assertEquals( $udt_arr[$date_epoch][0]['total_time'], ( 12 * 3600 ) );
		//Regular Time
		$this->assertEquals( 20, $udt_arr[$date_epoch][1]['object_type_id'] );                              //Regular Time
		$this->assertEquals( $udt_arr[$date_epoch][1]['pay_code_id'], $this->policy_ids['pay_code'][100] ); //Regular Time
		$this->assertEquals( $udt_arr[$date_epoch][1]['total_time'], ( 7 * 3600 ) );
		//Weekly Overtime1
		$this->assertEquals( 30, $udt_arr[$date_epoch][2]['object_type_id'] );                              //Overtime
		$this->assertEquals( $udt_arr[$date_epoch][2]['pay_code_id'], $policy_ids['pay_code'][3] );
		$this->assertEquals( $udt_arr[$date_epoch][2]['total_time'], ( 1 * 3600 ) );
		//Overtime1
		$this->assertEquals( 30, $udt_arr[$date_epoch][3]['object_type_id'] );                              //Overtime
		$this->assertEquals( $udt_arr[$date_epoch][3]['pay_code_id'], $policy_ids['pay_code'][0] );
		$this->assertEquals( $udt_arr[$date_epoch][3]['total_time'], ( 4 * 3600 ) );
		//Make sure no other hours
		$this->assertCount( 4, $udt_arr[$date_epoch] );

		//
		//Day of Week: 5
		//
		$date_epoch = TTDate::incrementDate( TTDate::getMiddleDayEpoch( TTDate::getBeginWeekEpoch( time() ) ), 4, 'day' );
		$date_stamp = TTDate::getDate( 'DATE', $date_epoch );

		$dd->createPunchPair( $this->user_id,
							  strtotime( $date_stamp . ' 8:00AM' ),
							  strtotime( $date_stamp . ' 4:00PM' ),
							  [
									  'in_type_id'    => 10,
									  'out_type_id'   => 10,
									  'branch_id'     => $this->branch_ids[0],
									  'department_id' => 0,
									  'job_id'        => 0,
									  'job_item_id'   => 0,
									  'punch_tag_id'  => []
							  ],
							  true
		);
		$dd->createPunchPair( $this->user_id,
							  strtotime( $date_stamp . ' 4:00PM' ),
							  strtotime( $date_stamp . ' 8:00PM' ),
							  [
									  'in_type_id'    => 10,
									  'out_type_id'   => 10,
									  'branch_id'     => $this->branch_ids[0],
									  'department_id' => 0,
									  'job_id'        => 0,
									  'job_item_id'   => 0,
									  'punch_tag_id'  => []
							  ],
							  true
		);

		$udt_arr = $this->getUserDateTotalArray( $date_epoch, $date_epoch );
		//print_r($udt_arr);
		//Total Time
		$this->assertEquals( 5, $udt_arr[$date_epoch][0]['object_type_id'] );                               //5=System Total
		$this->assertEquals( $udt_arr[$date_epoch][0]['pay_code_id'], TTUUID::getZeroID() );
		$this->assertEquals( $udt_arr[$date_epoch][0]['total_time'], ( 12 * 3600 ) );
		//Weekly Overtime1
		$this->assertEquals( 30, $udt_arr[$date_epoch][1]['object_type_id'] );                              //Overtime
		$this->assertEquals( $udt_arr[$date_epoch][1]['pay_code_id'], $policy_ids['pay_code'][3] );
		$this->assertEquals( $udt_arr[$date_epoch][1]['total_time'], ( 8 * 3600 ) );
		//Overtime1
		$this->assertEquals( 30, $udt_arr[$date_epoch][2]['object_type_id'] );                              //Overtime
		$this->assertEquals( $udt_arr[$date_epoch][2]['pay_code_id'], $policy_ids['pay_code'][1] );
		$this->assertEquals( $udt_arr[$date_epoch][2]['total_time'], ( 4 * 3600 ) );
		//Make sure no other hours
		$this->assertCount( 3, $udt_arr[$date_epoch] );

		//
		//Day of Week: 6
		//
		$date_epoch = TTDate::incrementDate( TTDate::getMiddleDayEpoch( TTDate::getBeginWeekEpoch( time() ) ), 5, 'day' );
		$date_stamp = TTDate::getDate( 'DATE', $date_epoch );

		$dd->createPunchPair( $this->user_id,
							  strtotime( $date_stamp . ' 8:00AM' ),
							  strtotime( $date_stamp . ' 4:00PM' ),
							  [
									  'in_type_id'    => 10,
									  'out_type_id'   => 10,
									  'branch_id'     => $this->branch_ids[1],
									  'department_id' => 0,
									  'job_id'        => 0,
									  'job_item_id'   => 0,
									  'punch_tag_id'  => []
							  ],
							  true
		);
		$dd->createPunchPair( $this->user_id,
							  strtotime( $date_stamp . ' 4:00PM' ),
							  strtotime( $date_stamp . ' 8:00PM' ),
							  [
									  'in_type_id'    => 10,
									  'out_type_id'   => 10,
									  'branch_id'     => $this->branch_ids[1],
									  'department_id' => 0,
									  'job_id'        => 0,
									  'job_item_id'   => 0,
									  'punch_tag_id'  => []
							  ],
							  true
		);
		$udt_arr = $this->getUserDateTotalArray( $date_epoch, $date_epoch );
		//print_r($udt_arr);
		//Total Time
		$this->assertEquals( 5, $udt_arr[$date_epoch][0]['object_type_id'] );                               //5=System Total
		$this->assertEquals( $udt_arr[$date_epoch][0]['pay_code_id'], TTUUID::getZeroID() );
		$this->assertEquals( $udt_arr[$date_epoch][0]['total_time'], ( 12 * 3600 ) );
		//Weekly Overtime1
		$this->assertEquals( 30, $udt_arr[$date_epoch][1]['object_type_id'] );                              //Overtime
		$this->assertEquals( $udt_arr[$date_epoch][1]['pay_code_id'], $policy_ids['pay_code'][3] );
		$this->assertEquals( $udt_arr[$date_epoch][1]['total_time'], ( 8 * 3600 ) );
		//Overtime1
		$this->assertEquals( 30, $udt_arr[$date_epoch][2]['object_type_id'] );                              //Overtime
		$this->assertEquals( $udt_arr[$date_epoch][2]['pay_code_id'], $policy_ids['pay_code'][2] );
		$this->assertEquals( $udt_arr[$date_epoch][2]['total_time'], ( 4 * 3600 ) );
		//Make sure no other hours
		$this->assertCount( 3, $udt_arr[$date_epoch] );

		return true;
	}

	/**
	 * @group OvertimePolicy_testDifferentialDailyAndWeeklyOverTimePolicyF
	 */
	function testDifferentialDailyAndWeeklyOverTimePolicyF() {
		if ( getTTProductEdition() == TT_PRODUCT_COMMUNITY ) {
			return true;
		}

		global $dd;

		$policy_ids['pay_formula_policy'][] = $this->createPayFormulaPolicy( $this->company_id, 200 );      //OT1.5
		$policy_ids['pay_formula_policy'][] = $this->createPayFormulaPolicy( $this->company_id, 210 );      //OT2.0
		$policy_ids['pay_formula_policy'][] = $this->createPayFormulaPolicy( $this->company_id, 220 );      //OT2.5

		//Daily
		$policy_ids['pay_code'][] = $this->createPayCode( $this->company_id, 100, $policy_ids['pay_formula_policy'][0] );
		$policy_ids['pay_code'][] = $this->createPayCode( $this->company_id, 110, $policy_ids['pay_formula_policy'][1] );
		$policy_ids['pay_code'][] = $this->createPayCode( $this->company_id, 120, $policy_ids['pay_formula_policy'][2] );

		//Weekly
		$policy_ids['pay_code'][] = $this->createPayCode( $this->company_id, 230, $policy_ids['pay_formula_policy'][0] );
		//$policy_ids['pay_code'][]  = $this->createPayCode( $this->company_id, 240, $policy_ids['pay_formula_policy'][1] );
		//$policy_ids['pay_code'][]  = $this->createPayCode( $this->company_id, 250, $policy_ids['pay_formula_policy'][2] );

		$policy_ids['overtime'][] = $this->createOverTimePolicy( $this->company_id, 100, $this->policy_ids['contributing_shift_policy'][12], $policy_ids['pay_code'][0] );
		$policy_ids['overtime'][] = $this->createOverTimePolicy( $this->company_id, 1000, $this->policy_ids['contributing_shift_policy'][12], $policy_ids['pay_code'][1] );
		$policy_ids['overtime'][] = $this->createOverTimePolicy( $this->company_id, 1001, $this->policy_ids['contributing_shift_policy'][12], $policy_ids['pay_code'][2] );
		$policy_ids['overtime'][] = $this->createOverTimePolicy( $this->company_id, 230, $this->policy_ids['contributing_shift_policy'][12], $policy_ids['pay_code'][3] );

		//Create Policy Group
		$dd->createPolicyGroup( $this->company_id,
								null, //Meal
								null, //Exception
								null, //Holiday
								$policy_ids['overtime'], //OT
								null, //Premium
								null, //Round
								[ $this->user_id ], //Users
								null, //Break
								null, //Accrual
								null, //Expense
								null, //Absence
								[ $this->policy_ids['regular'][12] ] //Regular
		);


		$date_epoch = TTDate::getMiddleDayEpoch( TTDate::getBeginWeekEpoch( time() ) );
		$date_stamp = TTDate::getDate( 'DATE', $date_epoch );

		//
		//Day of Week: 1
		//
		$dd->createPunchPair( $this->user_id,
							  strtotime( $date_stamp . ' 8:00AM' ),
							  strtotime( $date_stamp . ' 4:00PM' ),
							  [
									  'in_type_id'    => 10,
									  'out_type_id'   => 10,
									  'branch_id'     => 0,
									  'department_id' => 0,
									  'job_id'        => 0,
									  'job_item_id'   => 0,
									  'punch_tag_id'  => []
							  ],
							  true
		);
		$dd->createPunchPair( $this->user_id,
							  strtotime( $date_stamp . ' 4:00PM' ),
							  strtotime( $date_stamp . ' 8:00PM' ),
							  [
									  'in_type_id'    => 10,
									  'out_type_id'   => 10,
									  'branch_id'     => $this->branch_ids[0],
									  'department_id' => 0,
									  'job_id'        => 0,
									  'job_item_id'   => 0,
									  'punch_tag_id'  => []
							  ],
							  true
		);

		$udt_arr = $this->getUserDateTotalArray( $date_epoch, $date_epoch );
		//print_r($udt_arr);
		//Total Time
		$this->assertEquals( 5, $udt_arr[$date_epoch][0]['object_type_id'] );                               //5=System Total
		$this->assertEquals( $udt_arr[$date_epoch][0]['pay_code_id'], TTUUID::getZeroID() );
		$this->assertEquals( $udt_arr[$date_epoch][0]['total_time'], ( 12 * 3600 ) );
		//Regular Time
		$this->assertEquals( 20, $udt_arr[$date_epoch][1]['object_type_id'] );                              //Regular Time
		$this->assertEquals( $udt_arr[$date_epoch][1]['pay_code_id'], $this->policy_ids['pay_code'][100] ); //Regular Time
		$this->assertEquals( $udt_arr[$date_epoch][1]['total_time'], ( 8 * 3600 ) );
		//Overtime1
		$this->assertEquals( 30, $udt_arr[$date_epoch][2]['object_type_id'] );                              //Overtime
		$this->assertEquals( $udt_arr[$date_epoch][2]['pay_code_id'], $policy_ids['pay_code'][1] );
		$this->assertEquals( $udt_arr[$date_epoch][2]['total_time'], ( 4 * 3600 ) );
		//Make sure no other hours
		$this->assertCount( 3, $udt_arr[$date_epoch] );

		//
		//Day of Week: 2
		//
		$date_epoch = TTDate::incrementDate( TTDate::getMiddleDayEpoch( TTDate::getBeginWeekEpoch( time() ) ), 1, 'day' );
		$date_stamp = TTDate::getDate( 'DATE', $date_epoch );

		$dd->createPunchPair( $this->user_id,
							  strtotime( $date_stamp . ' 8:00AM' ),
							  strtotime( $date_stamp . ' 4:00PM' ),
							  [
									  'in_type_id'    => 10,
									  'out_type_id'   => 10,
									  'branch_id'     => $this->branch_ids[0],
									  'department_id' => 0,
									  'job_id'        => 0,
									  'job_item_id'   => 0,
									  'punch_tag_id'  => []
							  ],
							  true
		);
		$dd->createPunchPair( $this->user_id,
							  strtotime( $date_stamp . ' 4:00PM' ),
							  strtotime( $date_stamp . ' 8:00PM' ),
							  [
									  'in_type_id'    => 10,
									  'out_type_id'   => 10,
									  'branch_id'     => 0,
									  'department_id' => 0,
									  'job_id'        => 0,
									  'job_item_id'   => 0,
									  'punch_tag_id'  => []
							  ],
							  true
		);

		$udt_arr = $this->getUserDateTotalArray( $date_epoch, $date_epoch );
		//print_r($udt_arr);
		//Total Time
		$this->assertEquals( 5, $udt_arr[$date_epoch][0]['object_type_id'] );                               //5=System Total
		$this->assertEquals( $udt_arr[$date_epoch][0]['pay_code_id'], TTUUID::getZeroID() );
		$this->assertEquals( $udt_arr[$date_epoch][0]['total_time'], ( 12 * 3600 ) );
		//Regular Time
		$this->assertEquals( 20, $udt_arr[$date_epoch][1]['object_type_id'] );                              //Regular Time
		$this->assertEquals( $udt_arr[$date_epoch][1]['pay_code_id'], $this->policy_ids['pay_code'][100] ); //Regular Time
		$this->assertEquals( $udt_arr[$date_epoch][1]['total_time'], ( 8 * 3600 ) );
		//Overtime1
		$this->assertEquals( 30, $udt_arr[$date_epoch][2]['object_type_id'] );                              //Overtime
		$this->assertEquals( $udt_arr[$date_epoch][2]['pay_code_id'], $policy_ids['pay_code'][0] );
		$this->assertEquals( $udt_arr[$date_epoch][2]['total_time'], ( 4 * 3600 ) );
		//Make sure no other hours
		$this->assertCount( 3, $udt_arr[$date_epoch] );

		//
		//Day of Week: 3
		//
		$date_epoch = TTDate::incrementDate( TTDate::getMiddleDayEpoch( TTDate::getBeginWeekEpoch( time() ) ), 2, 'day' );
		$date_stamp = TTDate::getDate( 'DATE', $date_epoch );

		$dd->createPunchPair( $this->user_id,
							  strtotime( $date_stamp . ' 8:00AM' ),
							  strtotime( $date_stamp . ' 4:00PM' ),
							  [
									  'in_type_id'    => 10,
									  'out_type_id'   => 10,
									  'branch_id'     => 0,
									  'department_id' => 0,
									  'job_id'        => 0,
									  'job_item_id'   => 0,
									  'punch_tag_id'  => []
							  ],
							  true
		);
		$dd->createPunchPair( $this->user_id,
							  strtotime( $date_stamp . ' 4:00PM' ),
							  strtotime( $date_stamp . ' 8:00PM' ),
							  [
									  'in_type_id'    => 10,
									  'out_type_id'   => 10,
									  'branch_id'     => $this->branch_ids[1],
									  'department_id' => 0,
									  'job_id'        => 0,
									  'job_item_id'   => 0,
									  'punch_tag_id'  => []
							  ],
							  true
		);

		$udt_arr = $this->getUserDateTotalArray( $date_epoch, $date_epoch );
		//print_r($udt_arr);
		//Total Time
		$this->assertEquals( 5, $udt_arr[$date_epoch][0]['object_type_id'] );                               //5=System Total
		$this->assertEquals( $udt_arr[$date_epoch][0]['pay_code_id'], TTUUID::getZeroID() );
		$this->assertEquals( $udt_arr[$date_epoch][0]['total_time'], ( 12 * 3600 ) );
		//Regular Time
		$this->assertEquals( 20, $udt_arr[$date_epoch][1]['object_type_id'] );                              //Regular Time
		$this->assertEquals( $udt_arr[$date_epoch][1]['pay_code_id'], $this->policy_ids['pay_code'][100] ); //Regular Time
		$this->assertEquals( $udt_arr[$date_epoch][1]['total_time'], ( 8 * 3600 ) );
		//Overtime1
		$this->assertEquals( 30, $udt_arr[$date_epoch][2]['object_type_id'] );                              //Overtime
		$this->assertEquals( $udt_arr[$date_epoch][2]['pay_code_id'], $policy_ids['pay_code'][2] );
		$this->assertEquals( $udt_arr[$date_epoch][2]['total_time'], ( 4 * 3600 ) );
		//Make sure no other hours
		$this->assertCount( 3, $udt_arr[$date_epoch] );

		//
		//Day of Week: 4
		//
		$date_epoch = TTDate::incrementDate( TTDate::getMiddleDayEpoch( TTDate::getBeginWeekEpoch( time() ) ), 3, 'day' );
		$date_stamp = TTDate::getDate( 'DATE', $date_epoch );

		$dd->createPunchPair( $this->user_id,
							  strtotime( $date_stamp . ' 8:00AM' ),
							  strtotime( $date_stamp . ' 4:00PM' ),
							  [
									  'in_type_id'    => 10,
									  'out_type_id'   => 10,
									  'branch_id'     => $this->branch_ids[1],
									  'department_id' => 0,
									  'job_id'        => 0,
									  'job_item_id'   => 0,
									  'punch_tag_id'  => []
							  ],
							  true
		);
		$dd->createPunchPair( $this->user_id,
							  strtotime( $date_stamp . ' 4:00PM' ),
							  strtotime( $date_stamp . ' 8:00PM' ),
							  [
									  'in_type_id'    => 10,
									  'out_type_id'   => 10,
									  'branch_id'     => 0,
									  'department_id' => 0,
									  'job_id'        => 0,
									  'job_item_id'   => 0,
									  'punch_tag_id'  => []
							  ],
							  true
		);

		$udt_arr = $this->getUserDateTotalArray( $date_epoch, $date_epoch );
		//print_r($udt_arr);
		//Total Time
		$this->assertEquals( 5, $udt_arr[$date_epoch][0]['object_type_id'] );                               //5=System Total
		$this->assertEquals( $udt_arr[$date_epoch][0]['pay_code_id'], TTUUID::getZeroID() );
		$this->assertEquals( $udt_arr[$date_epoch][0]['total_time'], ( 12 * 3600 ) );
		//Regular Time
		$this->assertEquals( 20, $udt_arr[$date_epoch][1]['object_type_id'] );                              //Regular Time
		$this->assertEquals( $udt_arr[$date_epoch][1]['pay_code_id'], $this->policy_ids['pay_code'][100] ); //Regular Time
		$this->assertEquals( $udt_arr[$date_epoch][1]['total_time'], ( 7 * 3600 ) );
		//Weekly Overtime1
		$this->assertEquals( 30, $udt_arr[$date_epoch][2]['object_type_id'] );                              //Overtime
		$this->assertEquals( $udt_arr[$date_epoch][2]['pay_code_id'], $policy_ids['pay_code'][3] );
		$this->assertEquals( $udt_arr[$date_epoch][2]['total_time'], ( 1 * 3600 ) );
		//Overtime1
		$this->assertEquals( 30, $udt_arr[$date_epoch][3]['object_type_id'] );                              //Overtime
		$this->assertEquals( $udt_arr[$date_epoch][3]['pay_code_id'], $policy_ids['pay_code'][0] );
		$this->assertEquals( $udt_arr[$date_epoch][3]['total_time'], ( 4 * 3600 ) );
		//Make sure no other hours
		$this->assertCount( 4, $udt_arr[$date_epoch] );

		//
		//Day of Week: 5
		//
		$date_epoch = TTDate::incrementDate( TTDate::getMiddleDayEpoch( TTDate::getBeginWeekEpoch( time() ) ), 4, 'day' );
		$date_stamp = TTDate::getDate( 'DATE', $date_epoch );

		$dd->createPunchPair( $this->user_id,
							  strtotime( $date_stamp . ' 8:00AM' ),
							  strtotime( $date_stamp . ' 4:00PM' ),
							  [
									  'in_type_id'    => 10,
									  'out_type_id'   => 10,
									  'branch_id'     => $this->branch_ids[0],
									  'department_id' => 0,
									  'job_id'        => 0,
									  'job_item_id'   => 0,
									  'punch_tag_id'  => []
							  ],
							  true
		);
		$dd->createPunchPair( $this->user_id,
							  strtotime( $date_stamp . ' 4:00PM' ),
							  strtotime( $date_stamp . ' 8:00PM' ),
							  [
									  'in_type_id'    => 10,
									  'out_type_id'   => 10,
									  'branch_id'     => $this->branch_ids[1],
									  'department_id' => 0,
									  'job_id'        => 0,
									  'job_item_id'   => 0,
									  'punch_tag_id'  => []
							  ],
							  true
		);

		$udt_arr = $this->getUserDateTotalArray( $date_epoch, $date_epoch );
		//print_r($udt_arr);
		//Total Time
		$this->assertEquals( 5, $udt_arr[$date_epoch][0]['object_type_id'] );                               //5=System Total
		$this->assertEquals( $udt_arr[$date_epoch][0]['pay_code_id'], TTUUID::getZeroID() );
		$this->assertEquals( $udt_arr[$date_epoch][0]['total_time'], ( 12 * 3600 ) );
		//Weekly Overtime1
		$this->assertEquals( 30, $udt_arr[$date_epoch][1]['object_type_id'] );                              //Overtime
		$this->assertEquals( $udt_arr[$date_epoch][1]['pay_code_id'], $policy_ids['pay_code'][3] );
		$this->assertEquals( $udt_arr[$date_epoch][1]['total_time'], ( 8 * 3600 ) );
		//Overtime1
		$this->assertEquals( 30, $udt_arr[$date_epoch][2]['object_type_id'] );                              //Overtime
		$this->assertEquals( $udt_arr[$date_epoch][2]['pay_code_id'], $policy_ids['pay_code'][2] );
		$this->assertEquals( $udt_arr[$date_epoch][2]['total_time'], ( 4 * 3600 ) );
		//Make sure no other hours
		$this->assertCount( 3, $udt_arr[$date_epoch] );

		//
		//Day of Week: 6
		//
		$date_epoch = TTDate::incrementDate( TTDate::getMiddleDayEpoch( TTDate::getBeginWeekEpoch( time() ) ), 5, 'day' );
		$date_stamp = TTDate::getDate( 'DATE', $date_epoch );

		$dd->createPunchPair( $this->user_id,
							  strtotime( $date_stamp . ' 8:00AM' ),
							  strtotime( $date_stamp . ' 4:00PM' ),
							  [
									  'in_type_id'    => 10,
									  'out_type_id'   => 10,
									  'branch_id'     => $this->branch_ids[1],
									  'department_id' => 0,
									  'job_id'        => 0,
									  'job_item_id'   => 0,
									  'punch_tag_id'  => []
							  ],
							  true
		);
		$dd->createPunchPair( $this->user_id,
							  strtotime( $date_stamp . ' 4:00PM' ),
							  strtotime( $date_stamp . ' 8:00PM' ),
							  [
									  'in_type_id'    => 10,
									  'out_type_id'   => 10,
									  'branch_id'     => $this->branch_ids[0],
									  'department_id' => 0,
									  'job_id'        => 0,
									  'job_item_id'   => 0,
									  'punch_tag_id'  => []
							  ],
							  true
		);
		$udt_arr = $this->getUserDateTotalArray( $date_epoch, $date_epoch );
		//print_r($udt_arr);
		//Total Time
		$this->assertEquals( 5, $udt_arr[$date_epoch][0]['object_type_id'] );                               //5=System Total
		$this->assertEquals( $udt_arr[$date_epoch][0]['pay_code_id'], TTUUID::getZeroID() );
		$this->assertEquals( $udt_arr[$date_epoch][0]['total_time'], ( 12 * 3600 ) );
		//Weekly Overtime1
		$this->assertEquals( 30, $udt_arr[$date_epoch][1]['object_type_id'] );                              //Overtime
		$this->assertEquals( $udt_arr[$date_epoch][1]['pay_code_id'], $policy_ids['pay_code'][3] );
		$this->assertEquals( $udt_arr[$date_epoch][1]['total_time'], ( 8 * 3600 ) );
		//Overtime1
		$this->assertEquals( 30, $udt_arr[$date_epoch][2]['object_type_id'] );                              //Overtime
		$this->assertEquals( $udt_arr[$date_epoch][2]['pay_code_id'], $policy_ids['pay_code'][1] );
		$this->assertEquals( $udt_arr[$date_epoch][2]['total_time'], ( 4 * 3600 ) );
		//Make sure no other hours
		$this->assertCount( 3, $udt_arr[$date_epoch] );

		return true;
	}

	/**
	 * @group OvertimePolicy_testDifferentialDailyAndWeeklyOverTimePolicyG
	 */
	function testDifferentialDailyAndWeeklyOverTimePolicyG() {
		if ( getTTProductEdition() == TT_PRODUCT_COMMUNITY ) {
			return true;
		}

		global $dd;

		$policy_ids['pay_formula_policy'][] = $this->createPayFormulaPolicy( $this->company_id, 200 );      //OT1.5
		$policy_ids['pay_formula_policy'][] = $this->createPayFormulaPolicy( $this->company_id, 210 );      //OT2.0
		$policy_ids['pay_formula_policy'][] = $this->createPayFormulaPolicy( $this->company_id, 220 );      //OT2.5

		//Daily
		$policy_ids['pay_code'][] = $this->createPayCode( $this->company_id, 100, $policy_ids['pay_formula_policy'][0] );
		$policy_ids['pay_code'][] = $this->createPayCode( $this->company_id, 110, $policy_ids['pay_formula_policy'][1] );
		$policy_ids['pay_code'][] = $this->createPayCode( $this->company_id, 120, $policy_ids['pay_formula_policy'][2] );

		//Weekly
		$policy_ids['pay_code'][] = $this->createPayCode( $this->company_id, 230, $policy_ids['pay_formula_policy'][0] );
		//$policy_ids['pay_code'][]  = $this->createPayCode( $this->company_id, 240, $policy_ids['pay_formula_policy'][1] );
		//$policy_ids['pay_code'][]  = $this->createPayCode( $this->company_id, 250, $policy_ids['pay_formula_policy'][2] );

		$policy_ids['overtime'][] = $this->createOverTimePolicy( $this->company_id, 100, $this->policy_ids['contributing_shift_policy'][12], $policy_ids['pay_code'][0] );
		$policy_ids['overtime'][] = $this->createOverTimePolicy( $this->company_id, 1000, $this->policy_ids['contributing_shift_policy'][12], $policy_ids['pay_code'][1] );
		$policy_ids['overtime'][] = $this->createOverTimePolicy( $this->company_id, 1001, $this->policy_ids['contributing_shift_policy'][12], $policy_ids['pay_code'][2] );
		$policy_ids['overtime'][] = $this->createOverTimePolicy( $this->company_id, 230, $this->policy_ids['contributing_shift_policy'][12], $policy_ids['pay_code'][3] );

		//Create Policy Group
		$dd->createPolicyGroup( $this->company_id,
								null, //Meal
								null, //Exception
								null, //Holiday
								$policy_ids['overtime'], //OT
								null, //Premium
								null, //Round
								[ $this->user_id ], //Users
								null, //Break
								null, //Accrual
								null, //Expense
								null, //Absence
								[ $this->policy_ids['regular'][12] ] //Regular
		);


		$date_epoch = TTDate::getMiddleDayEpoch( TTDate::getBeginWeekEpoch( time() ) );
		$date_stamp = TTDate::getDate( 'DATE', $date_epoch );

		//
		//Day of Week: 1
		//
		$dd->createPunchPair( $this->user_id,
							  strtotime( $date_stamp . ' 8:00AM' ),
							  strtotime( $date_stamp . ' 4:00PM' ),
							  [
									  'in_type_id'    => 10,
									  'out_type_id'   => 10,
									  'branch_id'     => 0,
									  'department_id' => 0,
									  'job_id'        => 0,
									  'job_item_id'   => 0,
									  'punch_tag_id'  => []
							  ],
							  true
		);
		$dd->createPunchPair( $this->user_id,
							  strtotime( $date_stamp . ' 4:00PM' ),
							  strtotime( $date_stamp . ' 8:00PM' ),
							  [
									  'in_type_id'    => 10,
									  'out_type_id'   => 10,
									  'branch_id'     => $this->branch_ids[0],
									  'department_id' => 0,
									  'job_id'        => 0,
									  'job_item_id'   => 0,
									  'punch_tag_id'  => []
							  ],
							  true
		);

		$udt_arr = $this->getUserDateTotalArray( $date_epoch, $date_epoch );
		//print_r($udt_arr);
		//Total Time
		$this->assertEquals( 5, $udt_arr[$date_epoch][0]['object_type_id'] );                               //5=System Total
		$this->assertEquals( $udt_arr[$date_epoch][0]['pay_code_id'], TTUUID::getZeroID() );
		$this->assertEquals( $udt_arr[$date_epoch][0]['total_time'], ( 12 * 3600 ) );
		//Regular Time
		$this->assertEquals( 20, $udt_arr[$date_epoch][1]['object_type_id'] );                              //Regular Time
		$this->assertEquals( $udt_arr[$date_epoch][1]['pay_code_id'], $this->policy_ids['pay_code'][100] ); //Regular Time
		$this->assertEquals( $udt_arr[$date_epoch][1]['total_time'], ( 8 * 3600 ) );
		//Overtime1
		$this->assertEquals( 30, $udt_arr[$date_epoch][2]['object_type_id'] );                              //Overtime
		$this->assertEquals( $udt_arr[$date_epoch][2]['pay_code_id'], $policy_ids['pay_code'][1] );
		$this->assertEquals( $udt_arr[$date_epoch][2]['total_time'], ( 4 * 3600 ) );
		//Make sure no other hours
		$this->assertCount( 3, $udt_arr[$date_epoch] );

		//
		//Day of Week: 2
		//
		$date_epoch = TTDate::incrementDate( TTDate::getMiddleDayEpoch( TTDate::getBeginWeekEpoch( time() ) ), 1, 'day' );
		$date_stamp = TTDate::getDate( 'DATE', $date_epoch );

		$dd->createPunchPair( $this->user_id,
							  strtotime( $date_stamp . ' 8:00AM' ),
							  strtotime( $date_stamp . ' 11:00AM' ),
							  [
									  'in_type_id'    => 10,
									  'out_type_id'   => 10,
									  'branch_id'     => $this->branch_ids[0],
									  'department_id' => 0,
									  'job_id'        => 0,
									  'job_item_id'   => 0,
									  'punch_tag_id'  => []
							  ],
							  true
		);
		$dd->createPunchPair( $this->user_id,
							  strtotime( $date_stamp . ' 12:00PM' ),
							  strtotime( $date_stamp . ' 9:00PM' ),
							  [
									  'in_type_id'    => 10,
									  'out_type_id'   => 10,
									  'branch_id'     => 0,
									  'department_id' => 0,
									  'job_id'        => 0,
									  'job_item_id'   => 0,
									  'punch_tag_id'  => []
							  ],
							  true
		);

		$udt_arr = $this->getUserDateTotalArray( $date_epoch, $date_epoch );
		//print_r($udt_arr);
		//Total Time
		$this->assertEquals( 5, $udt_arr[$date_epoch][0]['object_type_id'] );                               //5=System Total
		$this->assertEquals( $udt_arr[$date_epoch][0]['pay_code_id'], TTUUID::getZeroID() );
		$this->assertEquals( $udt_arr[$date_epoch][0]['total_time'], ( 12 * 3600 ) );
		//Regular Time
		$this->assertEquals( 20, $udt_arr[$date_epoch][1]['object_type_id'] );                              //Regular Time
		$this->assertEquals( $udt_arr[$date_epoch][1]['pay_code_id'], $this->policy_ids['pay_code'][100] ); //Regular Time
		$this->assertEquals( $udt_arr[$date_epoch][1]['total_time'], ( 3 * 3600 ) );
		//Regular Time
		$this->assertEquals( 20, $udt_arr[$date_epoch][2]['object_type_id'] );                              //Regular Time
		$this->assertEquals( $udt_arr[$date_epoch][2]['pay_code_id'], $this->policy_ids['pay_code'][100] ); //Regular Time
		$this->assertEquals( $udt_arr[$date_epoch][2]['total_time'], ( 5 * 3600 ) );
		//Overtime1
		$this->assertEquals( 30, $udt_arr[$date_epoch][3]['object_type_id'] );                              //Overtime
		$this->assertEquals( $udt_arr[$date_epoch][3]['pay_code_id'], $policy_ids['pay_code'][0] );
		$this->assertEquals( $udt_arr[$date_epoch][3]['total_time'], ( 4 * 3600 ) );
		//Make sure no other hours
		$this->assertCount( 4, $udt_arr[$date_epoch] );


		//
		//Day of Week: 3
		//
		$date_epoch = TTDate::incrementDate( TTDate::getMiddleDayEpoch( TTDate::getBeginWeekEpoch( time() ) ), 2, 'day' );
		$date_stamp = TTDate::getDate( 'DATE', $date_epoch );

		$dd->createPunchPair( $this->user_id,
							  strtotime( $date_stamp . ' 8:00AM' ),
							  strtotime( $date_stamp . ' 9:00AM' ),
							  [
									  'in_type_id'    => 10,
									  'out_type_id'   => 10,
									  'branch_id'     => 0,
									  'department_id' => 0,
									  'job_id'        => 0,
									  'job_item_id'   => 0,
									  'punch_tag_id'  => []
							  ],
							  true
		);
		$dd->createPunchPair( $this->user_id,
							  strtotime( $date_stamp . ' 10:00AM' ),
							  strtotime( $date_stamp . ' 9:00PM' ),
							  [
									  'in_type_id'    => 10,
									  'out_type_id'   => 10,
									  'branch_id'     => $this->branch_ids[1],
									  'department_id' => 0,
									  'job_id'        => 0,
									  'job_item_id'   => 0,
									  'punch_tag_id'  => []
							  ],
							  true
		);

		$udt_arr = $this->getUserDateTotalArray( $date_epoch, $date_epoch );
		//print_r($udt_arr);
		//Total Time
		$this->assertEquals( 5, $udt_arr[$date_epoch][0]['object_type_id'] );                               //5=System Total
		$this->assertEquals( $udt_arr[$date_epoch][0]['pay_code_id'], TTUUID::getZeroID() );
		$this->assertEquals( $udt_arr[$date_epoch][0]['total_time'], ( 12 * 3600 ) );
		//Regular Time
		$this->assertEquals( 20, $udt_arr[$date_epoch][1]['object_type_id'] );                              //Regular Time
		$this->assertEquals( $udt_arr[$date_epoch][1]['pay_code_id'], $this->policy_ids['pay_code'][100] ); //Regular Time
		$this->assertEquals( $udt_arr[$date_epoch][1]['total_time'], ( 1 * 3600 ) );
		//Regular Time
		$this->assertEquals( 20, $udt_arr[$date_epoch][2]['object_type_id'] );                              //Regular Time
		$this->assertEquals( $udt_arr[$date_epoch][2]['pay_code_id'], $this->policy_ids['pay_code'][100] ); //Regular Time
		$this->assertEquals( $udt_arr[$date_epoch][2]['total_time'], ( 7 * 3600 ) );

		//Overtime1
		$this->assertEquals( 30, $udt_arr[$date_epoch][3]['object_type_id'] );                              //Overtime
		$this->assertEquals( $udt_arr[$date_epoch][3]['pay_code_id'], $policy_ids['pay_code'][2] );
		$this->assertEquals( $udt_arr[$date_epoch][3]['total_time'], ( 4 * 3600 ) );
		//Make sure no other hours
		$this->assertCount( 4, $udt_arr[$date_epoch] );


		//
		//Day of Week: 4
		//
		$date_epoch = TTDate::incrementDate( TTDate::getMiddleDayEpoch( TTDate::getBeginWeekEpoch( time() ) ), 3, 'day' );
		$date_stamp = TTDate::getDate( 'DATE', $date_epoch );

		$dd->createPunchPair( $this->user_id,
							  strtotime( $date_stamp . ' 8:00AM' ),
							  strtotime( $date_stamp . ' 4:00PM' ),
							  [
									  'in_type_id'    => 10,
									  'out_type_id'   => 10,
									  'branch_id'     => $this->branch_ids[1],
									  'department_id' => 0,
									  'job_id'        => 0,
									  'job_item_id'   => 0,
									  'punch_tag_id'  => []
							  ],
							  true
		);
		$dd->createPunchPair( $this->user_id,
							  strtotime( $date_stamp . ' 5:00PM' ),
							  strtotime( $date_stamp . ' 9:00PM' ),
							  [
									  'in_type_id'    => 10,
									  'out_type_id'   => 10,
									  'branch_id'     => 0,
									  'department_id' => 0,
									  'job_id'        => 0,
									  'job_item_id'   => 0,
									  'punch_tag_id'  => []
							  ],
							  true
		);

		$udt_arr = $this->getUserDateTotalArray( $date_epoch, $date_epoch );
		//print_r($udt_arr);
		//Total Time
		$this->assertEquals( 5, $udt_arr[$date_epoch][0]['object_type_id'] );                               //5=System Total
		$this->assertEquals( $udt_arr[$date_epoch][0]['pay_code_id'], TTUUID::getZeroID() );
		$this->assertEquals( $udt_arr[$date_epoch][0]['total_time'], ( 12 * 3600 ) );
		//Regular Time
		$this->assertEquals( 20, $udt_arr[$date_epoch][1]['object_type_id'] );                              //Regular Time
		$this->assertEquals( $udt_arr[$date_epoch][1]['pay_code_id'], $this->policy_ids['pay_code'][100] ); //Regular Time
		$this->assertEquals( $udt_arr[$date_epoch][1]['total_time'], ( 7 * 3600 ) );
		//Weekly Overtime1
		$this->assertEquals( 30, $udt_arr[$date_epoch][2]['object_type_id'] );                              //Overtime
		$this->assertEquals( $udt_arr[$date_epoch][2]['pay_code_id'], $policy_ids['pay_code'][3] );
		$this->assertEquals( $udt_arr[$date_epoch][2]['total_time'], ( 1 * 3600 ) );
		//Overtime1
		$this->assertEquals( 30, $udt_arr[$date_epoch][3]['object_type_id'] );                              //Overtime
		$this->assertEquals( $udt_arr[$date_epoch][3]['pay_code_id'], $policy_ids['pay_code'][0] );
		$this->assertEquals( $udt_arr[$date_epoch][3]['total_time'], ( 4 * 3600 ) );
		//Make sure no other hours
		$this->assertCount( 4, $udt_arr[$date_epoch] );


		//
		//Day of Week: 5
		//
		$date_epoch = TTDate::incrementDate( TTDate::getMiddleDayEpoch( TTDate::getBeginWeekEpoch( time() ) ), 4, 'day' );
		$date_stamp = TTDate::getDate( 'DATE', $date_epoch );

		$dd->createPunchPair( $this->user_id,
							  strtotime( $date_stamp . ' 8:00AM' ),
							  strtotime( $date_stamp . ' 6:00PM' ),
							  [
									  'in_type_id'    => 10,
									  'out_type_id'   => 10,
									  'branch_id'     => $this->branch_ids[0],
									  'department_id' => 0,
									  'job_id'        => 0,
									  'job_item_id'   => 0,
									  'punch_tag_id'  => []
							  ],
							  true
		);
		$dd->createPunchPair( $this->user_id,
							  strtotime( $date_stamp . ' 7:00PM' ),
							  strtotime( $date_stamp . ' 9:00PM' ),
							  [
									  'in_type_id'    => 10,
									  'out_type_id'   => 10,
									  'branch_id'     => $this->branch_ids[1],
									  'department_id' => 0,
									  'job_id'        => 0,
									  'job_item_id'   => 0,
									  'punch_tag_id'  => []
							  ],
							  true
		);

		$udt_arr = $this->getUserDateTotalArray( $date_epoch, $date_epoch );
		//print_r($udt_arr);
		//Total Time
		$this->assertEquals( 5, $udt_arr[$date_epoch][0]['object_type_id'] );                               //5=System Total
		$this->assertEquals( $udt_arr[$date_epoch][0]['pay_code_id'], TTUUID::getZeroID() );
		$this->assertEquals( $udt_arr[$date_epoch][0]['total_time'], ( 12 * 3600 ) );
		//Weekly Overtime1
		$this->assertEquals( 30, $udt_arr[$date_epoch][1]['object_type_id'] );                              //Overtime
		$this->assertEquals( $udt_arr[$date_epoch][1]['pay_code_id'], $policy_ids['pay_code'][3] );
		$this->assertEquals( $udt_arr[$date_epoch][1]['total_time'], ( 8 * 3600 ) );
		//Overtime1
		$this->assertEquals( 30, $udt_arr[$date_epoch][2]['object_type_id'] );                              //Overtime
		$this->assertEquals( $udt_arr[$date_epoch][2]['pay_code_id'], $policy_ids['pay_code'][2] );
		$this->assertEquals( $udt_arr[$date_epoch][2]['total_time'], ( 2 * 3600 ) );
		//Overtime1
		$this->assertEquals( 30, $udt_arr[$date_epoch][3]['object_type_id'] );                              //Overtime
		$this->assertEquals( $udt_arr[$date_epoch][3]['pay_code_id'], $policy_ids['pay_code'][1] );
		$this->assertEquals( $udt_arr[$date_epoch][3]['total_time'], ( 2 * 3600 ) );

		//Make sure no other hours
		$this->assertCount( 4, $udt_arr[$date_epoch] );


		//
		//Day of Week: 6
		//
		$date_epoch = TTDate::incrementDate( TTDate::getMiddleDayEpoch( TTDate::getBeginWeekEpoch( time() ) ), 5, 'day' );
		$date_stamp = TTDate::getDate( 'DATE', $date_epoch );

		$dd->createPunchPair( $this->user_id,
							  strtotime( $date_stamp . ' 8:00AM' ),
							  strtotime( $date_stamp . ' 7:00PM' ),
							  [
									  'in_type_id'    => 10,
									  'out_type_id'   => 10,
									  'branch_id'     => $this->branch_ids[1],
									  'department_id' => 0,
									  'job_id'        => 0,
									  'job_item_id'   => 0,
									  'punch_tag_id'  => []
							  ],
							  true
		);
		$dd->createPunchPair( $this->user_id,
							  strtotime( $date_stamp . ' 8:00PM' ),
							  strtotime( $date_stamp . ' 9:00PM' ),
							  [
									  'in_type_id'    => 10,
									  'out_type_id'   => 10,
									  'branch_id'     => $this->branch_ids[0],
									  'department_id' => 0,
									  'job_id'        => 0,
									  'job_item_id'   => 0,
									  'punch_tag_id'  => []
							  ],
							  true
		);
		$udt_arr = $this->getUserDateTotalArray( $date_epoch, $date_epoch );
		//print_r($udt_arr);
		//Total Time
		$this->assertEquals( 5, $udt_arr[$date_epoch][0]['object_type_id'] );                               //5=System Total
		$this->assertEquals( $udt_arr[$date_epoch][0]['pay_code_id'], TTUUID::getZeroID() );
		$this->assertEquals( $udt_arr[$date_epoch][0]['total_time'], ( 12 * 3600 ) );
		//Weekly Overtime1
		$this->assertEquals( 30, $udt_arr[$date_epoch][1]['object_type_id'] );                              //Overtime
		$this->assertEquals( $udt_arr[$date_epoch][1]['pay_code_id'], $policy_ids['pay_code'][3] );
		$this->assertEquals( $udt_arr[$date_epoch][1]['total_time'], ( 8 * 3600 ) );
		//Overtime1
		$this->assertEquals( 30, $udt_arr[$date_epoch][2]['object_type_id'] );                              //Overtime
		$this->assertEquals( $udt_arr[$date_epoch][2]['pay_code_id'], $policy_ids['pay_code'][2] );
		$this->assertEquals( $udt_arr[$date_epoch][2]['total_time'], ( 3 * 3600 ) );
		//Overtime1
		$this->assertEquals( 30, $udt_arr[$date_epoch][3]['object_type_id'] );                              //Overtime
		$this->assertEquals( $udt_arr[$date_epoch][3]['pay_code_id'], $policy_ids['pay_code'][1] );
		$this->assertEquals( $udt_arr[$date_epoch][3]['total_time'], ( 1 * 3600 ) );

		//Make sure no other hours
		$this->assertCount( 4, $udt_arr[$date_epoch] );

		return true;
	}

	/**
	 * @group OvertimePolicy_testDifferentialDailyAndWeeklyOverTimePolicyH
	 */
	function testDifferentialDailyAndWeeklyOverTimePolicyH() {
		if ( getTTProductEdition() == TT_PRODUCT_COMMUNITY ) {
			return true;
		}

		global $dd;

		//Test Daily>8, Daily>12, Weekly>40, Weekly>44, BiWeekly >80, BiWeekly >88, where the Weekly and BiWeekly have differential criteria
		//and only one of them applies.

		$policy_ids['pay_formula_policy'][] = $this->createPayFormulaPolicy( $this->company_id, 200 );                    //OT1.5
		$policy_ids['pay_formula_policy'][] = $this->createPayFormulaPolicy( $this->company_id, 210 );                    //OT2.0
		$policy_ids['pay_formula_policy'][] = $this->createPayFormulaPolicy( $this->company_id, 220 );                    //OT2.5

		//Daily
		$policy_ids['pay_code'][] = $this->createPayCode( $this->company_id, 100, $policy_ids['pay_formula_policy'][0] ); //>8
		$policy_ids['pay_code'][] = $this->createPayCode( $this->company_id, 110, $policy_ids['pay_formula_policy'][1] ); //>9
		$policy_ids['pay_code'][] = $this->createPayCode( $this->company_id, 120, $policy_ids['pay_formula_policy'][2] ); //>10

		//Weekly
		$policy_ids['pay_code'][] = $this->createPayCode( $this->company_id, 230, $policy_ids['pay_formula_policy'][0] ); //>31
		$policy_ids['pay_code'][] = $this->createPayCode( $this->company_id, 240, $policy_ids['pay_formula_policy'][1] ); //>39

		//BiWeekly
		$policy_ids['pay_code'][] = $this->createPayCode( $this->company_id, 300, $policy_ids['pay_formula_policy'][0] ); //>80 - BiWeekly
		$policy_ids['pay_code'][] = $this->createPayCode( $this->company_id, 310, $policy_ids['pay_formula_policy'][1] ); //>84 - BiWeekly
		$policy_ids['pay_code'][] = $this->createPayCode( $this->company_id, 320, $policy_ids['pay_formula_policy'][2] ); //>84 - BiWeekly

		$policy_ids['overtime'][] = $this->createOverTimePolicy( $this->company_id, 100, $this->policy_ids['contributing_shift_policy'][12], $policy_ids['pay_code'][0] );
		$policy_ids['overtime'][] = $this->createOverTimePolicy( $this->company_id, 110, $this->policy_ids['contributing_shift_policy'][12], $policy_ids['pay_code'][1] );
		$policy_ids['overtime'][] = $this->createOverTimePolicy( $this->company_id, 120, $this->policy_ids['contributing_shift_policy'][12], $policy_ids['pay_code'][2] );
		$policy_ids['overtime'][] = $this->createOverTimePolicy( $this->company_id, 1230, $this->policy_ids['contributing_shift_policy'][12], $policy_ids['pay_code'][3] );
		$policy_ids['overtime'][] = $this->createOverTimePolicy( $this->company_id, 1240, $this->policy_ids['contributing_shift_policy'][12], $policy_ids['pay_code'][4] );
		$policy_ids['overtime'][] = $this->createOverTimePolicy( $this->company_id, 1300, $this->policy_ids['contributing_shift_policy'][12], $policy_ids['pay_code'][5] );
		$policy_ids['overtime'][] = $this->createOverTimePolicy( $this->company_id, 1310, $this->policy_ids['contributing_shift_policy'][12], $policy_ids['pay_code'][6] );
		$policy_ids['overtime'][] = $this->createOverTimePolicy( $this->company_id, 1320, $this->policy_ids['contributing_shift_policy'][12], $policy_ids['pay_code'][7] );

		//Create Policy Group
		$dd->createPolicyGroup( $this->company_id,
								null, //Meal
								null, //Exception
								null, //Holiday
								$policy_ids['overtime'], //OT
								null, //Premium
								null, //Round
								[ $this->user_id ], //Users
								null, //Break
								null, //Accrual
								null, //Expense
								null, //Absence
								[ $this->policy_ids['regular'][12] ] //Regular
		);

		//Start two weeks ago...
		$start_epoch = $date_epoch = TTDate::getMiddleDayEpoch( TTDate::getBeginWeekEpoch( time() ) );

		$current_pay_period_obj = $this->getCurrentPayPeriod( $date_epoch );
		if ( is_object( $current_pay_period_obj ) ) {
			$date_stamp = TTDate::getDate( 'DATE', $current_pay_period_obj->getStartDate() );
			$start_epoch = $date_epoch = TTDate::getMiddleDayEpoch( $current_pay_period_obj->getStartDate() );
		} else {
			$date_stamp = TTDate::getDate( 'DATE', $date_epoch );
		}
		Debug::text( 'Using date stamp: ' . TTDate::getDate( 'DATE+TIME', $date_stamp ), __FILE__, __LINE__, __METHOD__, 10 );

		//
		//Day of Week: 1
		//
		$dd->createPunchPair( $this->user_id,
							  strtotime( $date_stamp . ' 8:00AM' ),
							  strtotime( $date_stamp . ' 4:00PM' ),
							  [
									  'in_type_id'    => 10,
									  'out_type_id'   => 10,
									  'branch_id'     => $this->branch_ids[0],
									  'department_id' => 0,
									  'job_id'        => 0,
									  'job_item_id'   => 0,
									  'punch_tag_id'  => []
							  ],
							  true
		);
		$dd->createPunchPair( $this->user_id,
							  strtotime( $date_stamp . ' 4:00PM' ),
							  strtotime( $date_stamp . ' 8:00PM' ),
							  [
									  'in_type_id'    => 10,
									  'out_type_id'   => 10,
									  'branch_id'     => $this->branch_ids[0],
									  'department_id' => 0,
									  'job_id'        => 0,
									  'job_item_id'   => 0,
									  'punch_tag_id'  => []
							  ],
							  true
		);

		$udt_arr = $this->getUserDateTotalArray( $date_epoch, $date_epoch );
		//print_r($udt_arr);
		//print_r($policy_ids['pay_code']);
		//Total Time
		$this->assertEquals( 5, $udt_arr[$date_epoch][0]['object_type_id'] );                                             //5=System Total
		$this->assertEquals( $udt_arr[$date_epoch][0]['pay_code_id'], TTUUID::getZeroID() );
		$this->assertEquals( $udt_arr[$date_epoch][0]['total_time'], ( 12 * 3600 ) );
		//Regular Time
		$this->assertEquals( 20, $udt_arr[$date_epoch][1]['object_type_id'] );                                            //Regular Time
		$this->assertEquals( $udt_arr[$date_epoch][1]['pay_code_id'], $this->policy_ids['pay_code'][100] );               //Regular Time
		$this->assertEquals( $udt_arr[$date_epoch][1]['total_time'], ( 8 * 3600 ) );
		//Overtime >10
		$this->assertEquals( 30, $udt_arr[$date_epoch][2]['object_type_id'] );                                            //Overtime
		$this->assertEquals( $udt_arr[$date_epoch][2]['pay_code_id'], $policy_ids['pay_code'][2] );
		$this->assertEquals( $udt_arr[$date_epoch][2]['total_time'], ( 2 * 3600 ) );
		//Overtime >9
		$this->assertEquals( 30, $udt_arr[$date_epoch][3]['object_type_id'] );                                            //Overtime
		$this->assertEquals( $udt_arr[$date_epoch][3]['pay_code_id'], $policy_ids['pay_code'][1] );
		$this->assertEquals( $udt_arr[$date_epoch][3]['total_time'], ( 1 * 3600 ) );
		//Overtime >8
		$this->assertEquals( 30, $udt_arr[$date_epoch][4]['object_type_id'] );                                            //Overtime
		$this->assertEquals( $udt_arr[$date_epoch][4]['pay_code_id'], $policy_ids['pay_code'][0] );
		$this->assertEquals( $udt_arr[$date_epoch][4]['total_time'], ( 1 * 3600 ) );
		//Make sure no other hours
		$this->assertCount( 5, $udt_arr[$date_epoch] );

		//
		//Day of Week: 2
		//
		$date_epoch = TTDate::incrementDate( TTDate::getMiddleDayEpoch( TTDate::getBeginWeekEpoch( $start_epoch ) ), 1, 'day' );
		$date_stamp = TTDate::getDate( 'DATE', $date_epoch );

		$dd->createPunchPair( $this->user_id,
							  strtotime( $date_stamp . ' 8:00AM' ),
							  strtotime( $date_stamp . ' 4:00PM' ),
							  [
									  'in_type_id'    => 10,
									  'out_type_id'   => 10,
									  'branch_id'     => $this->branch_ids[0],
									  'department_id' => 0,
									  'job_id'        => 0,
									  'job_item_id'   => 0,
									  'punch_tag_id'  => []
							  ],
							  true
		);
		$dd->createPunchPair( $this->user_id,
							  strtotime( $date_stamp . ' 4:00PM' ),
							  strtotime( $date_stamp . ' 8:00PM' ),
							  [
									  'in_type_id'    => 10,
									  'out_type_id'   => 10,
									  'branch_id'     => $this->branch_ids[0],
									  'department_id' => 0,
									  'job_id'        => 0,
									  'job_item_id'   => 0,
									  'punch_tag_id'  => []
							  ],
							  true
		);

		$udt_arr = $this->getUserDateTotalArray( $date_epoch, $date_epoch );
		//print_r($udt_arr);
		//print_r($policy_ids['pay_code']);
		//Total Time
		$this->assertEquals( 5, $udt_arr[$date_epoch][0]['object_type_id'] );                                             //5=System Total
		$this->assertEquals( $udt_arr[$date_epoch][0]['pay_code_id'], TTUUID::getZeroID() );
		$this->assertEquals( $udt_arr[$date_epoch][0]['total_time'], ( 12 * 3600 ) );
		//Regular Time
		$this->assertEquals( 20, $udt_arr[$date_epoch][1]['object_type_id'] );                                            //Regular Time
		$this->assertEquals( $udt_arr[$date_epoch][1]['pay_code_id'], $this->policy_ids['pay_code'][100] );               //Regular Time
		$this->assertEquals( $udt_arr[$date_epoch][1]['total_time'], ( 8 * 3600 ) );
		//Overtime >10
		$this->assertEquals( 30, $udt_arr[$date_epoch][2]['object_type_id'] );                                            //Overtime
		$this->assertEquals( $udt_arr[$date_epoch][2]['pay_code_id'], $policy_ids['pay_code'][2] );
		$this->assertEquals( $udt_arr[$date_epoch][2]['total_time'], ( 2 * 3600 ) );
		//Overtime >9
		$this->assertEquals( 30, $udt_arr[$date_epoch][3]['object_type_id'] );                                            //Overtime
		$this->assertEquals( $udt_arr[$date_epoch][3]['pay_code_id'], $policy_ids['pay_code'][1] );
		$this->assertEquals( $udt_arr[$date_epoch][3]['total_time'], ( 1 * 3600 ) );
		//Overtime >8
		$this->assertEquals( 30, $udt_arr[$date_epoch][4]['object_type_id'] );                                            //Overtime
		$this->assertEquals( $udt_arr[$date_epoch][4]['pay_code_id'], $policy_ids['pay_code'][0] );
		$this->assertEquals( $udt_arr[$date_epoch][4]['total_time'], ( 1 * 3600 ) );
		//Make sure no other hours
		$this->assertCount( 5, $udt_arr[$date_epoch] );


		//
		//Day of Week: 3
		//
		$date_epoch = TTDate::incrementDate( TTDate::getMiddleDayEpoch( TTDate::getBeginWeekEpoch( $start_epoch ) ), 2, 'day' );
		$date_stamp = TTDate::getDate( 'DATE', $date_epoch );

		$dd->createPunchPair( $this->user_id,
							  strtotime( $date_stamp . ' 8:00AM' ),
							  strtotime( $date_stamp . ' 4:00PM' ),
							  [
									  'in_type_id'    => 10,
									  'out_type_id'   => 10,
									  'branch_id'     => $this->branch_ids[0],
									  'department_id' => 0,
									  'job_id'        => 0,
									  'job_item_id'   => 0,
									  'punch_tag_id'  => []
							  ],
							  true
		);
		$dd->createPunchPair( $this->user_id,
							  strtotime( $date_stamp . ' 4:00PM' ),
							  strtotime( $date_stamp . ' 8:00PM' ),
							  [
									  'in_type_id'    => 10,
									  'out_type_id'   => 10,
									  'branch_id'     => $this->branch_ids[0],
									  'department_id' => 0,
									  'job_id'        => 0,
									  'job_item_id'   => 0,
									  'punch_tag_id'  => []
							  ],
							  true
		);

		$udt_arr = $this->getUserDateTotalArray( $date_epoch, $date_epoch );
		//print_r($udt_arr);
		//print_r($policy_ids['pay_code']);
		//Total Time
		$this->assertEquals( 5, $udt_arr[$date_epoch][0]['object_type_id'] );                                             //5=System Total
		$this->assertEquals( $udt_arr[$date_epoch][0]['pay_code_id'], TTUUID::getZeroID() );
		$this->assertEquals( $udt_arr[$date_epoch][0]['total_time'], ( 12 * 3600 ) );
		//Regular Time
		$this->assertEquals( 20, $udt_arr[$date_epoch][1]['object_type_id'] );                                            //Regular Time
		$this->assertEquals( $udt_arr[$date_epoch][1]['pay_code_id'], $this->policy_ids['pay_code'][100] );               //Regular Time
		$this->assertEquals( $udt_arr[$date_epoch][1]['total_time'], ( 8 * 3600 ) );
		//Overtime >10
		$this->assertEquals( 30, $udt_arr[$date_epoch][2]['object_type_id'] );                                            //Overtime
		$this->assertEquals( $udt_arr[$date_epoch][2]['pay_code_id'], $policy_ids['pay_code'][2] );
		$this->assertEquals( $udt_arr[$date_epoch][2]['total_time'], ( 2 * 3600 ) );
		//Overtime >9
		$this->assertEquals( 30, $udt_arr[$date_epoch][3]['object_type_id'] );                                            //Overtime
		$this->assertEquals( $udt_arr[$date_epoch][3]['pay_code_id'], $policy_ids['pay_code'][1] );
		$this->assertEquals( $udt_arr[$date_epoch][3]['total_time'], ( 1 * 3600 ) );
		//Overtime >8
		$this->assertEquals( 30, $udt_arr[$date_epoch][4]['object_type_id'] );                                            //Overtime
		$this->assertEquals( $udt_arr[$date_epoch][4]['pay_code_id'], $policy_ids['pay_code'][0] );
		$this->assertEquals( $udt_arr[$date_epoch][4]['total_time'], ( 1 * 3600 ) );
		//Make sure no other hours
		$this->assertCount( 5, $udt_arr[$date_epoch] );


		//
		//Day of Week: 4
		//
		$date_epoch = TTDate::getMiddleDayEpoch( TTDate::getBeginWeekEpoch( $start_epoch ) + ( 3 * 86400 + 3601 ) );
		$date_stamp = TTDate::getDate( 'DATE', $date_epoch );

		$dd->createPunchPair( $this->user_id,
							  strtotime( $date_stamp . ' 8:00AM' ),
							  strtotime( $date_stamp . ' 4:00PM' ),
							  [
									  'in_type_id'    => 10,
									  'out_type_id'   => 10,
									  'branch_id'     => $this->branch_ids[0],
									  'department_id' => 0,
									  'job_id'        => 0,
									  'job_item_id'   => 0,
									  'punch_tag_id'  => []
							  ],
							  true
		);
		$dd->createPunchPair( $this->user_id,
							  strtotime( $date_stamp . ' 4:00PM' ),
							  strtotime( $date_stamp . ' 8:00PM' ),
							  [
									  'in_type_id'    => 10,
									  'out_type_id'   => 10,
									  'branch_id'     => $this->branch_ids[0],
									  'department_id' => 0,
									  'job_id'        => 0,
									  'job_item_id'   => 0,
									  'punch_tag_id'  => []
							  ],
							  true
		);

		$udt_arr = $this->getUserDateTotalArray( $date_epoch, $date_epoch );
		//print_r($udt_arr);
		//print_r($policy_ids['pay_code']);
		//Total Time
		$this->assertEquals( 5, $udt_arr[$date_epoch][0]['object_type_id'] );                                             //5=System Total
		$this->assertEquals( $udt_arr[$date_epoch][0]['pay_code_id'], TTUUID::getZeroID() );
		$this->assertEquals( $udt_arr[$date_epoch][0]['total_time'], ( 12 * 3600 ) );
		//Regular Time
		$this->assertEquals( 20, $udt_arr[$date_epoch][1]['object_type_id'] );                                            //Regular Time
		$this->assertEquals( $udt_arr[$date_epoch][1]['pay_code_id'], $this->policy_ids['pay_code'][100] );               //Regular Time
		$this->assertEquals( $udt_arr[$date_epoch][1]['total_time'], ( 8 * 3600 ) );
		//Overtime >10
		$this->assertEquals( 30, $udt_arr[$date_epoch][2]['object_type_id'] );                                            //Overtime
		$this->assertEquals( $udt_arr[$date_epoch][2]['pay_code_id'], $policy_ids['pay_code'][2] );
		$this->assertEquals( $udt_arr[$date_epoch][2]['total_time'], ( 2 * 3600 ) );
		//Overtime >9
		$this->assertEquals( 30, $udt_arr[$date_epoch][3]['object_type_id'] );                                            //Overtime
		$this->assertEquals( $udt_arr[$date_epoch][3]['pay_code_id'], $policy_ids['pay_code'][1] );
		$this->assertEquals( $udt_arr[$date_epoch][3]['total_time'], ( 1 * 3600 ) );
		//Overtime >8
		$this->assertEquals( 30, $udt_arr[$date_epoch][4]['object_type_id'] );                                            //Overtime
		$this->assertEquals( $udt_arr[$date_epoch][4]['pay_code_id'], $policy_ids['pay_code'][0] );
		$this->assertEquals( $udt_arr[$date_epoch][4]['total_time'], ( 1 * 3600 ) );
		//Make sure no other hours
		$this->assertCount( 5, $udt_arr[$date_epoch] );


		//
		//Day of Week: 5
		//
		$date_epoch = TTDate::incrementDate( TTDate::getMiddleDayEpoch( TTDate::getBeginWeekEpoch( $start_epoch ) ), 4, 'day' );
		$date_stamp = TTDate::getDate( 'DATE', $date_epoch );

		$dd->createPunchPair( $this->user_id,
							  strtotime( $date_stamp . ' 8:00AM' ),
							  strtotime( $date_stamp . ' 4:00PM' ),
							  [
									  'in_type_id'    => 10,
									  'out_type_id'   => 10,
									  'branch_id'     => $this->branch_ids[0],
									  'department_id' => 0,
									  'job_id'        => 0,
									  'job_item_id'   => 0,
									  'punch_tag_id'  => []
							  ],
							  true
		);
		$dd->createPunchPair( $this->user_id,
							  strtotime( $date_stamp . ' 4:00PM' ),
							  strtotime( $date_stamp . ' 8:00PM' ),
							  [
									  'in_type_id'    => 10,
									  'out_type_id'   => 10,
									  'branch_id'     => $this->branch_ids[0],
									  'department_id' => 0,
									  'job_id'        => 0,
									  'job_item_id'   => 0,
									  'punch_tag_id'  => []
							  ],
							  true
		);

		$udt_arr = $this->getUserDateTotalArray( $date_epoch, $date_epoch );
		//print_r($udt_arr);
		//print_r($policy_ids['pay_code']);
		//Total Time
		$this->assertEquals( 5, $udt_arr[$date_epoch][0]['object_type_id'] );                                             //5=System Total
		$this->assertEquals( $udt_arr[$date_epoch][0]['pay_code_id'], TTUUID::getZeroID() );
		$this->assertEquals( $udt_arr[$date_epoch][0]['total_time'], ( 12 * 3600 ) );
		//Regular Time
		$this->assertEquals( 20, $udt_arr[$date_epoch][1]['object_type_id'] );                                            //Regular Time
		$this->assertEquals( $udt_arr[$date_epoch][1]['pay_code_id'], $this->policy_ids['pay_code'][100] );               //Regular Time
		$this->assertEquals( $udt_arr[$date_epoch][1]['total_time'], ( 8 * 3600 ) );
		//Overtime >10
		$this->assertEquals( 30, $udt_arr[$date_epoch][2]['object_type_id'] );                                            //Overtime
		$this->assertEquals( $udt_arr[$date_epoch][2]['pay_code_id'], $policy_ids['pay_code'][2] );
		$this->assertEquals( $udt_arr[$date_epoch][2]['total_time'], ( 2 * 3600 ) );
		//Overtime >9
		$this->assertEquals( 30, $udt_arr[$date_epoch][3]['object_type_id'] );                                            //Overtime
		$this->assertEquals( $udt_arr[$date_epoch][3]['pay_code_id'], $policy_ids['pay_code'][1] );
		$this->assertEquals( $udt_arr[$date_epoch][3]['total_time'], ( 1 * 3600 ) );
		//Overtime >8
		$this->assertEquals( 30, $udt_arr[$date_epoch][4]['object_type_id'] );                                            //Overtime
		$this->assertEquals( $udt_arr[$date_epoch][4]['pay_code_id'], $policy_ids['pay_code'][0] );
		$this->assertEquals( $udt_arr[$date_epoch][4]['total_time'], ( 1 * 3600 ) );
		//Make sure no other hours
		$this->assertCount( 5, $udt_arr[$date_epoch] );


		//
		//Day of Week: 6
		//
		$date_epoch = TTDate::incrementDate( TTDate::getMiddleDayEpoch( TTDate::getBeginWeekEpoch( $start_epoch ) ), 5, 'day' );
		$date_stamp = TTDate::getDate( 'DATE', $date_epoch );

		$dd->createPunchPair( $this->user_id,
							  strtotime( $date_stamp . ' 8:00AM' ),
							  strtotime( $date_stamp . ' 4:00PM' ),
							  [
									  'in_type_id'    => 10,
									  'out_type_id'   => 10,
									  'branch_id'     => $this->branch_ids[0],
									  'department_id' => 0,
									  'job_id'        => 0,
									  'job_item_id'   => 0,
									  'punch_tag_id'  => []
							  ],
							  true
		);
		$dd->createPunchPair( $this->user_id,
							  strtotime( $date_stamp . ' 4:00PM' ),
							  strtotime( $date_stamp . ' 8:00PM' ),
							  [
									  'in_type_id'    => 10,
									  'out_type_id'   => 10,
									  'branch_id'     => $this->branch_ids[0],
									  'department_id' => 0,
									  'job_id'        => 0,
									  'job_item_id'   => 0,
									  'punch_tag_id'  => []
							  ],
							  true
		);

		$udt_arr = $this->getUserDateTotalArray( $date_epoch, $date_epoch );
		//print_r($udt_arr);
		//print_r($policy_ids['pay_code']);
		//Total Time
		$this->assertEquals( 5, $udt_arr[$date_epoch][0]['object_type_id'] );                                             //5=System Total
		$this->assertEquals( $udt_arr[$date_epoch][0]['pay_code_id'], TTUUID::getZeroID() );
		$this->assertEquals( $udt_arr[$date_epoch][0]['total_time'], ( 12 * 3600 ) );
		//Regular Time
		$this->assertEquals( 20, $udt_arr[$date_epoch][1]['object_type_id'] );                                            //Regular Time
		$this->assertEquals( $udt_arr[$date_epoch][1]['pay_code_id'], $this->policy_ids['pay_code'][100] );               //Regular Time
		$this->assertEquals( $udt_arr[$date_epoch][1]['total_time'], ( 8 * 3600 ) );
		//Overtime >10
		$this->assertEquals( 30, $udt_arr[$date_epoch][2]['object_type_id'] );                                            //Overtime
		$this->assertEquals( $udt_arr[$date_epoch][2]['pay_code_id'], $policy_ids['pay_code'][2] );
		$this->assertEquals( $udt_arr[$date_epoch][2]['total_time'], ( 2 * 3600 ) );
		//Overtime >9
		$this->assertEquals( 30, $udt_arr[$date_epoch][3]['object_type_id'] );                                            //Overtime
		$this->assertEquals( $udt_arr[$date_epoch][3]['pay_code_id'], $policy_ids['pay_code'][1] );
		$this->assertEquals( $udt_arr[$date_epoch][3]['total_time'], ( 1 * 3600 ) );
		//Overtime >8
		$this->assertEquals( 30, $udt_arr[$date_epoch][4]['object_type_id'] );                                            //Overtime
		$this->assertEquals( $udt_arr[$date_epoch][4]['pay_code_id'], $policy_ids['pay_code'][0] );
		$this->assertEquals( $udt_arr[$date_epoch][4]['total_time'], ( 1 * 3600 ) );
		//Make sure no other hours
		$this->assertCount( 5, $udt_arr[$date_epoch] );

		//
		//Day of Week: 7
		//
		$date_epoch = TTDate::incrementDate( TTDate::getMiddleDayEpoch( TTDate::getBeginWeekEpoch( $start_epoch ) ), 6, 'day' );
		$date_stamp = TTDate::getDate( 'DATE', $date_epoch );

		$dd->createPunchPair( $this->user_id,
							  strtotime( $date_stamp . ' 8:00AM' ),
							  strtotime( $date_stamp . ' 4:00PM' ),
							  [
									  'in_type_id'    => 10,
									  'out_type_id'   => 10,
									  'branch_id'     => $this->branch_ids[0],
									  'department_id' => 0,
									  'job_id'        => 0,
									  'job_item_id'   => 0,
									  'punch_tag_id'  => []
							  ],
							  true
		);
		$dd->createPunchPair( $this->user_id,
							  strtotime( $date_stamp . ' 4:00PM' ),
							  strtotime( $date_stamp . ' 8:00PM' ),
							  [
									  'in_type_id'    => 10,
									  'out_type_id'   => 10,
									  'branch_id'     => $this->branch_ids[0],
									  'department_id' => 0,
									  'job_id'        => 0,
									  'job_item_id'   => 0,
									  'punch_tag_id'  => []
							  ],
							  true
		);

		$udt_arr = $this->getUserDateTotalArray( $date_epoch, $date_epoch );
		//print_r($udt_arr);
		//print_r($policy_ids['pay_code']);
		//Total Time
		$this->assertEquals( 5, $udt_arr[$date_epoch][0]['object_type_id'] );                                             //5=System Total
		$this->assertEquals( $udt_arr[$date_epoch][0]['pay_code_id'], TTUUID::getZeroID() );
		$this->assertEquals( $udt_arr[$date_epoch][0]['total_time'], ( 12 * 3600 ) );
		//Regular Time
		$this->assertEquals( 20, $udt_arr[$date_epoch][1]['object_type_id'] );                                            //Regular Time
		$this->assertEquals( $udt_arr[$date_epoch][1]['pay_code_id'], $this->policy_ids['pay_code'][100] );               //Regular Time
		$this->assertEquals( $udt_arr[$date_epoch][1]['total_time'], ( 8 * 3600 ) );
		//Overtime >10
		$this->assertEquals( 30, $udt_arr[$date_epoch][2]['object_type_id'] );                                            //Overtime
		$this->assertEquals( $udt_arr[$date_epoch][2]['pay_code_id'], $policy_ids['pay_code'][2] );
		$this->assertEquals( $udt_arr[$date_epoch][2]['total_time'], ( 2 * 3600 ) );
		//Overtime >9
		$this->assertEquals( 30, $udt_arr[$date_epoch][3]['object_type_id'] );                                            //Overtime
		$this->assertEquals( $udt_arr[$date_epoch][3]['pay_code_id'], $policy_ids['pay_code'][1] );
		$this->assertEquals( $udt_arr[$date_epoch][3]['total_time'], ( 1 * 3600 ) );
		//Overtime >8
		$this->assertEquals( 30, $udt_arr[$date_epoch][4]['object_type_id'] );                                            //Overtime
		$this->assertEquals( $udt_arr[$date_epoch][4]['pay_code_id'], $policy_ids['pay_code'][0] );
		$this->assertEquals( $udt_arr[$date_epoch][4]['total_time'], ( 1 * 3600 ) );
		//Make sure no other hours
		$this->assertCount( 5, $udt_arr[$date_epoch] );

		//
		//Day of Week: 8
		//
		$date_epoch = TTDate::incrementDate( TTDate::getMiddleDayEpoch( TTDate::getBeginWeekEpoch( $start_epoch ) ), 7, 'day' );
		$date_stamp = TTDate::getDate( 'DATE', $date_epoch );

		$dd->createPunchPair( $this->user_id,
							  strtotime( $date_stamp . ' 8:00AM' ),
							  strtotime( $date_stamp . ' 4:00PM' ),
							  [
									  'in_type_id'    => 10,
									  'out_type_id'   => 10,
									  'branch_id'     => $this->branch_ids[0],
									  'department_id' => 0,
									  'job_id'        => 0,
									  'job_item_id'   => 0,
									  'punch_tag_id'  => []
							  ],
							  true
		);
		$dd->createPunchPair( $this->user_id,
							  strtotime( $date_stamp . ' 4:00PM' ),
							  strtotime( $date_stamp . ' 8:00PM' ),
							  [
									  'in_type_id'    => 10,
									  'out_type_id'   => 10,
									  'branch_id'     => $this->branch_ids[0],
									  'department_id' => 0,
									  'job_id'        => 0,
									  'job_item_id'   => 0,
									  'punch_tag_id'  => []
							  ],
							  true
		);

		$udt_arr = $this->getUserDateTotalArray( $date_epoch, $date_epoch );
		//print_r($udt_arr);
		//print_r($policy_ids['pay_code']);
		//Total Time
		$this->assertEquals( 5, $udt_arr[$date_epoch][0]['object_type_id'] );                                             //5=System Total
		$this->assertEquals( $udt_arr[$date_epoch][0]['pay_code_id'], TTUUID::getZeroID() );
		$this->assertEquals( $udt_arr[$date_epoch][0]['total_time'], ( 12 * 3600 ) );
		//Regular Time
		$this->assertEquals( 20, $udt_arr[$date_epoch][1]['object_type_id'] );                                            //Regular Time
		$this->assertEquals( $udt_arr[$date_epoch][1]['pay_code_id'], $this->policy_ids['pay_code'][100] );               //Regular Time
		$this->assertEquals( $udt_arr[$date_epoch][1]['total_time'], ( 8 * 3600 ) );
		//Overtime >10
		$this->assertEquals( 30, $udt_arr[$date_epoch][2]['object_type_id'] );                                            //Overtime
		$this->assertEquals( $udt_arr[$date_epoch][2]['pay_code_id'], $policy_ids['pay_code'][2] );
		$this->assertEquals( $udt_arr[$date_epoch][2]['total_time'], ( 2 * 3600 ) );
		//Overtime >9
		$this->assertEquals( 30, $udt_arr[$date_epoch][3]['object_type_id'] );                                            //Overtime
		$this->assertEquals( $udt_arr[$date_epoch][3]['pay_code_id'], $policy_ids['pay_code'][1] );
		$this->assertEquals( $udt_arr[$date_epoch][3]['total_time'], ( 1 * 3600 ) );
		//Overtime >8
		$this->assertEquals( 30, $udt_arr[$date_epoch][4]['object_type_id'] );                                            //Overtime
		$this->assertEquals( $udt_arr[$date_epoch][4]['pay_code_id'], $policy_ids['pay_code'][0] );
		$this->assertEquals( $udt_arr[$date_epoch][4]['total_time'], ( 1 * 3600 ) );
		//Make sure no other hours
		$this->assertCount( 5, $udt_arr[$date_epoch] );

		//
		//Day of Week: 9
		//
		$date_epoch = TTDate::incrementDate( TTDate::getMiddleDayEpoch( TTDate::getBeginWeekEpoch( $start_epoch ) ), 8, 'day' );
		$date_stamp = TTDate::getDate( 'DATE', $date_epoch );

		$dd->createPunchPair( $this->user_id,
							  strtotime( $date_stamp . ' 8:00AM' ),
							  strtotime( $date_stamp . ' 4:00PM' ),
							  [
									  'in_type_id'    => 10,
									  'out_type_id'   => 10,
									  'branch_id'     => $this->branch_ids[0],
									  'department_id' => 0,
									  'job_id'        => 0,
									  'job_item_id'   => 0,
									  'punch_tag_id'  => []
							  ],
							  true
		);
		$dd->createPunchPair( $this->user_id,
							  strtotime( $date_stamp . ' 4:00PM' ),
							  strtotime( $date_stamp . ' 8:00PM' ),
							  [
									  'in_type_id'    => 10,
									  'out_type_id'   => 10,
									  'branch_id'     => $this->branch_ids[0],
									  'department_id' => 0,
									  'job_id'        => 0,
									  'job_item_id'   => 0,
									  'punch_tag_id'  => []
							  ],
							  true
		);

		$udt_arr = $this->getUserDateTotalArray( $date_epoch, $date_epoch );
		//print_r($udt_arr);
		//print_r($policy_ids['pay_code']);
		//Total Time
		$this->assertEquals( 5, $udt_arr[$date_epoch][0]['object_type_id'] );                                             //5=System Total
		$this->assertEquals( $udt_arr[$date_epoch][0]['pay_code_id'], TTUUID::getZeroID() );
		$this->assertEquals( $udt_arr[$date_epoch][0]['total_time'], ( 12 * 3600 ) );
		//Regular Time
		$this->assertEquals( 20, $udt_arr[$date_epoch][1]['object_type_id'] );                                            //Regular Time
		$this->assertEquals( $udt_arr[$date_epoch][1]['pay_code_id'], $this->policy_ids['pay_code'][100] );               //Regular Time
		$this->assertEquals( $udt_arr[$date_epoch][1]['total_time'], ( 8 * 3600 ) );
		//Overtime >10
		$this->assertEquals( 30, $udt_arr[$date_epoch][2]['object_type_id'] );                                            //Overtime
		$this->assertEquals( $udt_arr[$date_epoch][2]['pay_code_id'], $policy_ids['pay_code'][2] );
		$this->assertEquals( $udt_arr[$date_epoch][2]['total_time'], ( 2 * 3600 ) );
		//Overtime >9
		$this->assertEquals( 30, $udt_arr[$date_epoch][3]['object_type_id'] );                                            //Overtime
		$this->assertEquals( $udt_arr[$date_epoch][3]['pay_code_id'], $policy_ids['pay_code'][1] );
		$this->assertEquals( $udt_arr[$date_epoch][3]['total_time'], ( 1 * 3600 ) );
		//Overtime >8
		$this->assertEquals( 30, $udt_arr[$date_epoch][4]['object_type_id'] );                                            //Overtime
		$this->assertEquals( $udt_arr[$date_epoch][4]['pay_code_id'], $policy_ids['pay_code'][0] );
		$this->assertEquals( $udt_arr[$date_epoch][4]['total_time'], ( 1 * 3600 ) );
		//Make sure no other hours
		$this->assertCount( 5, $udt_arr[$date_epoch] );

		//
		//Day of Week: 10
		//
		$date_epoch = TTDate::incrementDate( TTDate::getMiddleDayEpoch( TTDate::getBeginWeekEpoch( $start_epoch ) ), 9, 'day' );
		$date_stamp = TTDate::getDate( 'DATE', $date_epoch );

		$dd->createPunchPair( $this->user_id,
							  strtotime( $date_stamp . ' 8:00AM' ),
							  strtotime( $date_stamp . ' 4:00PM' ),
							  [
									  'in_type_id'    => 10,
									  'out_type_id'   => 10,
									  'branch_id'     => $this->branch_ids[0],
									  'department_id' => 0,
									  'job_id'        => 0,
									  'job_item_id'   => 0,
									  'punch_tag_id'  => []
							  ],
							  true
		);
		$dd->createPunchPair( $this->user_id,
							  strtotime( $date_stamp . ' 4:00PM' ),
							  strtotime( $date_stamp . ' 8:00PM' ),
							  [
									  'in_type_id'    => 10,
									  'out_type_id'   => 10,
									  'branch_id'     => $this->branch_ids[0],
									  'department_id' => 0,
									  'job_id'        => 0,
									  'job_item_id'   => 0,
									  'punch_tag_id'  => []
							  ],
							  true
		);

		$udt_arr = $this->getUserDateTotalArray( $date_epoch, $date_epoch );
		//print_r($udt_arr);
		//print_r($policy_ids['pay_code']);
		//Total Time
		$this->assertEquals( 5, $udt_arr[$date_epoch][0]['object_type_id'] );                                             //5=System Total
		$this->assertEquals( $udt_arr[$date_epoch][0]['pay_code_id'], TTUUID::getZeroID() );
		$this->assertEquals( $udt_arr[$date_epoch][0]['total_time'], ( 12 * 3600 ) );
		//Regular Time
		$this->assertEquals( 20, $udt_arr[$date_epoch][1]['object_type_id'] );                                            //Regular Time
		$this->assertEquals( $udt_arr[$date_epoch][1]['pay_code_id'], $this->policy_ids['pay_code'][100] );               //Regular Time
		$this->assertEquals( $udt_arr[$date_epoch][1]['total_time'], ( 8 * 3600 ) );
		//Overtime >10
		$this->assertEquals( 30, $udt_arr[$date_epoch][2]['object_type_id'] );                                            //Overtime
		$this->assertEquals( $udt_arr[$date_epoch][2]['pay_code_id'], $policy_ids['pay_code'][2] );
		$this->assertEquals( $udt_arr[$date_epoch][2]['total_time'], ( 2 * 3600 ) );
		//Overtime >9
		$this->assertEquals( 30, $udt_arr[$date_epoch][3]['object_type_id'] );                                            //Overtime
		$this->assertEquals( $udt_arr[$date_epoch][3]['pay_code_id'], $policy_ids['pay_code'][1] );
		$this->assertEquals( $udt_arr[$date_epoch][3]['total_time'], ( 1 * 3600 ) );
		//Overtime >8
		$this->assertEquals( 30, $udt_arr[$date_epoch][4]['object_type_id'] );                                            //Overtime
		$this->assertEquals( $udt_arr[$date_epoch][4]['pay_code_id'], $policy_ids['pay_code'][0] );
		$this->assertEquals( $udt_arr[$date_epoch][4]['total_time'], ( 1 * 3600 ) );
		//Make sure no other hours
		$this->assertCount( 5, $udt_arr[$date_epoch] );

		//
		//Day of Week: 11
		//
		$date_epoch = TTDate::incrementDate( TTDate::getMiddleDayEpoch( TTDate::getBeginWeekEpoch( $start_epoch ) ), 10, 'day' );
		$date_stamp = TTDate::getDate( 'DATE', $date_epoch );

		$dd->createPunchPair( $this->user_id,
							  strtotime( $date_stamp . ' 8:00AM' ),
							  strtotime( $date_stamp . ' 4:00PM' ),
							  [
									  'in_type_id'    => 10,
									  'out_type_id'   => 10,
									  'branch_id'     => $this->branch_ids[0],
									  'department_id' => 0,
									  'job_id'        => 0,
									  'job_item_id'   => 0,
									  'punch_tag_id'  => []
							  ],
							  true
		);
		$dd->createPunchPair( $this->user_id,
							  strtotime( $date_stamp . ' 4:00PM' ),
							  strtotime( $date_stamp . ' 8:00PM' ),
							  [
									  'in_type_id'    => 10,
									  'out_type_id'   => 10,
									  'branch_id'     => $this->branch_ids[0],
									  'department_id' => 0,
									  'job_id'        => 0,
									  'job_item_id'   => 0,
									  'punch_tag_id'  => []
							  ],
							  true
		);

		$udt_arr = $this->getUserDateTotalArray( $date_epoch, $date_epoch );
		//print_r($udt_arr);

		//Total Time
		$this->assertEquals( 5, $udt_arr[$date_epoch][0]['object_type_id'] );                                             //5=System Total
		$this->assertEquals( $udt_arr[$date_epoch][0]['pay_code_id'], TTUUID::getZeroID() );
		$this->assertEquals( $udt_arr[$date_epoch][0]['total_time'], ( 12 * 3600 ) );
		////BiWeekly >86 -- This was compacted out with compactUserDateTotalDataBasedOnTimeStamps()
		//$this->assertEquals( 30, $udt_arr[$date_epoch][1]['object_type_id'] );                                            //Overtime
		//$this->assertEquals( $udt_arr[$date_epoch][1]['pay_code_id'], $policy_ids['pay_code'][7] );
		//$this->assertEquals( $udt_arr[$date_epoch][1]['total_time'], ( 2 * 3600 ) );
		////BiWeekly >86 -- This was compacted out with compactUserDateTotalDataBasedOnTimeStamps()
		//$this->assertEquals( 30, $udt_arr[$date_epoch][2]['object_type_id'] );                                            //Overtime
		//$this->assertEquals( $udt_arr[$date_epoch][2]['pay_code_id'], $policy_ids['pay_code'][7] );
		//$this->assertEquals( $udt_arr[$date_epoch][2]['total_time'], ( 2 * 3600 ) );
		//BiWeekly >86
		$this->assertEquals( 30, $udt_arr[$date_epoch][1]['object_type_id'] );                                            //Overtime
		$this->assertEquals( $udt_arr[$date_epoch][1]['pay_code_id'], $policy_ids['pay_code'][7] );
		$this->assertEquals( $udt_arr[$date_epoch][1]['total_time'], ( 4 * 3600 ) );
		//BiWeekly >84
		$this->assertEquals( 30, $udt_arr[$date_epoch][2]['object_type_id'] );                                            //Overtime
		$this->assertEquals( $udt_arr[$date_epoch][2]['pay_code_id'], $policy_ids['pay_code'][6] );
		$this->assertEquals( $udt_arr[$date_epoch][2]['total_time'], ( 2 * 3600 ) );
		//BiWeekly >80
		$this->assertEquals( 30, $udt_arr[$date_epoch][3]['object_type_id'] );                                            //Overtime
		$this->assertEquals( $udt_arr[$date_epoch][3]['pay_code_id'], $policy_ids['pay_code'][5] );
		$this->assertEquals( $udt_arr[$date_epoch][3]['total_time'], ( 4 * 3600 ) );
		//Overtime >10
		$this->assertEquals( 30, $udt_arr[$date_epoch][4]['object_type_id'] );                                            //Overtime
		$this->assertEquals( $udt_arr[$date_epoch][4]['pay_code_id'], $policy_ids['pay_code'][2] );
		$this->assertEquals( $udt_arr[$date_epoch][4]['total_time'], ( 2 * 3600 ) );
		//Overtime >9 - BiWeekly >86 is at 3.5x rate, so this is ignored.
		//$this->assertEquals( $udt_arr[$date_epoch][5]['object_type_id'], 30 ); //Overtime
		//$this->assertEquals( $udt_arr[$date_epoch][5]['pay_code_id'], $policy_ids['pay_code'][1] );
		//$this->assertEquals( $udt_arr[$date_epoch][5]['total_time'], (1*3600) );
		//Overtime >8 - BiWeekly >84 is at 3.0x rate, so this is ignored.
		//$this->assertEquals( $udt_arr[$date_epoch][4]['object_type_id'], 30 ); //Overtime
		//$this->assertEquals( $udt_arr[$date_epoch][4]['pay_code_id'], $policy_ids['pay_code'][0] );
		//$this->assertEquals( $udt_arr[$date_epoch][4]['total_time'], (1*3600) );

		//Make sure no other hours
		$this->assertCount( 5, $udt_arr[$date_epoch] );

		//
		//Day of Week: 12
		//
		$date_epoch = TTDate::incrementDate( TTDate::getMiddleDayEpoch( TTDate::getBeginWeekEpoch( $start_epoch ) ), 11, 'day' );
		$date_stamp = TTDate::getDate( 'DATE', $date_epoch );

		$dd->createPunchPair( $this->user_id,
							  strtotime( $date_stamp . ' 8:00AM' ),
							  strtotime( $date_stamp . ' 4:00PM' ),
							  [
									  'in_type_id'    => 10,
									  'out_type_id'   => 10,
									  'branch_id'     => $this->branch_ids[0],
									  'department_id' => 0,
									  'job_id'        => 0,
									  'job_item_id'   => 0,
									  'punch_tag_id'  => []
							  ],
							  true
		);
		$dd->createPunchPair( $this->user_id,
							  strtotime( $date_stamp . ' 4:00PM' ),
							  strtotime( $date_stamp . ' 8:00PM' ),
							  [
									  'in_type_id'    => 10,
									  'out_type_id'   => 10,
									  'branch_id'     => $this->branch_ids[0],
									  'department_id' => 0,
									  'job_id'        => 0,
									  'job_item_id'   => 0,
									  'punch_tag_id'  => []
							  ],
							  true
		);

		$udt_arr = $this->getUserDateTotalArray( $date_epoch, $date_epoch );
		//print_r($udt_arr);
		//print_r($policy_ids['pay_code']);
		//Total Time
		$this->assertEquals( 5, $udt_arr[$date_epoch][0]['object_type_id'] );                                             //5=System Total
		$this->assertEquals( $udt_arr[$date_epoch][0]['pay_code_id'], TTUUID::getZeroID() );
		$this->assertEquals( $udt_arr[$date_epoch][0]['total_time'], ( 12 * 3600 ) );
		//BiWeekly >86
		$this->assertEquals( 30, $udt_arr[$date_epoch][1]['object_type_id'] );                                            //Overtime
		$this->assertEquals( $udt_arr[$date_epoch][1]['pay_code_id'], $policy_ids['pay_code'][7] );
		$this->assertEquals( $udt_arr[$date_epoch][1]['total_time'], ( 2 * 3600 ) );
		//BiWeekly >86
		$this->assertEquals( 30, $udt_arr[$date_epoch][2]['object_type_id'] );                                            //Overtime
		$this->assertEquals( $udt_arr[$date_epoch][2]['pay_code_id'], $policy_ids['pay_code'][7] );
		$this->assertEquals( $udt_arr[$date_epoch][2]['total_time'], ( 8 * 3600 ) );
		//Overtime >10
		$this->assertEquals( 30, $udt_arr[$date_epoch][3]['object_type_id'] );                                            //Overtime
		$this->assertEquals( $udt_arr[$date_epoch][3]['pay_code_id'], $policy_ids['pay_code'][2] );
		$this->assertEquals( $udt_arr[$date_epoch][3]['total_time'], ( 2 * 3600 ) );
		//Overtime >9 - BiWeekly >86 is at 3.5x rate, so this is ignored.
		//$this->assertEquals( $udt_arr[$date_epoch][4]['object_type_id'], 30 ); //Overtime
		//$this->assertEquals( $udt_arr[$date_epoch][4]['pay_code_id'], $policy_ids['pay_code'][1] );
		//$this->assertEquals( $udt_arr[$date_epoch][4]['total_time'], (1*3600) );
		//Overtime >8 - BiWeekly >84 is at 3.0x rate, so this is ignored.
		//$this->assertEquals( $udt_arr[$date_epoch][4]['object_type_id'], 30 ); //Overtime
		//$this->assertEquals( $udt_arr[$date_epoch][4]['pay_code_id'], $policy_ids['pay_code'][0] );
		//$this->assertEquals( $udt_arr[$date_epoch][4]['total_time'], (1*3600) );
		//Make sure no other hours
		$this->assertCount( 4, $udt_arr[$date_epoch] );

		//
		//Day of Week: 13
		//
		$date_epoch = TTDate::incrementDate( TTDate::getMiddleDayEpoch( TTDate::getBeginWeekEpoch( $start_epoch ) ), 12, 'day' );
		$date_stamp = TTDate::getDate( 'DATE', $date_epoch );

		$dd->createPunchPair( $this->user_id,
							  strtotime( $date_stamp . ' 8:00AM' ),
							  strtotime( $date_stamp . ' 4:00PM' ),
							  [
									  'in_type_id'    => 10,
									  'out_type_id'   => 10,
									  'branch_id'     => $this->branch_ids[0],
									  'department_id' => 0,
									  'job_id'        => 0,
									  'job_item_id'   => 0,
									  'punch_tag_id'  => []
							  ],
							  true
		);
		$dd->createPunchPair( $this->user_id,
							  strtotime( $date_stamp . ' 4:00PM' ),
							  strtotime( $date_stamp . ' 8:00PM' ),
							  [
									  'in_type_id'    => 10,
									  'out_type_id'   => 10,
									  'branch_id'     => $this->branch_ids[0],
									  'department_id' => 0,
									  'job_id'        => 0,
									  'job_item_id'   => 0,
									  'punch_tag_id'  => []
							  ],
							  true
		);

		$udt_arr = $this->getUserDateTotalArray( $date_epoch, $date_epoch );
		//print_r($udt_arr);
		//print_r($policy_ids['pay_code']);
		//Total Time
		$this->assertEquals( 5, $udt_arr[$date_epoch][0]['object_type_id'] );                                             //5=System Total
		$this->assertEquals( $udt_arr[$date_epoch][0]['pay_code_id'], TTUUID::getZeroID() );
		$this->assertEquals( $udt_arr[$date_epoch][0]['total_time'], ( 12 * 3600 ) );
		//BiWeekly >86
		$this->assertEquals( 30, $udt_arr[$date_epoch][1]['object_type_id'] );                                            //Overtime
		$this->assertEquals( $udt_arr[$date_epoch][1]['pay_code_id'], $policy_ids['pay_code'][7] );
		$this->assertEquals( $udt_arr[$date_epoch][1]['total_time'], ( 2 * 3600 ) );
		//BiWeekly >86
		$this->assertEquals( 30, $udt_arr[$date_epoch][2]['object_type_id'] );                                            //Overtime
		$this->assertEquals( $udt_arr[$date_epoch][2]['pay_code_id'], $policy_ids['pay_code'][7] );
		$this->assertEquals( $udt_arr[$date_epoch][2]['total_time'], ( 8 * 3600 ) );
		//Overtime >10
		$this->assertEquals( 30, $udt_arr[$date_epoch][3]['object_type_id'] );                                            //Overtime
		$this->assertEquals( $udt_arr[$date_epoch][3]['pay_code_id'], $policy_ids['pay_code'][2] );
		$this->assertEquals( $udt_arr[$date_epoch][3]['total_time'], ( 2 * 3600 ) );
		//Overtime >9 - BiWeekly >86 is at 3.5x rate, so this is ignored.
		//$this->assertEquals( $udt_arr[$date_epoch][4]['object_type_id'], 30 ); //Overtime
		//$this->assertEquals( $udt_arr[$date_epoch][4]['pay_code_id'], $policy_ids['pay_code'][1] );
		//$this->assertEquals( $udt_arr[$date_epoch][4]['total_time'], (1*3600) );
		//Overtime >8 - BiWeekly >84 is at 3.0x rate, so this is ignored.
		//$this->assertEquals( $udt_arr[$date_epoch][4]['object_type_id'], 30 ); //Overtime
		//$this->assertEquals( $udt_arr[$date_epoch][4]['pay_code_id'], $policy_ids['pay_code'][0] );
		//$this->assertEquals( $udt_arr[$date_epoch][4]['total_time'], (1*3600) );
		//Make sure no other hours
		$this->assertCount( 4, $udt_arr[$date_epoch] );

		return true;
	}

	/**
	 * @group OvertimePolicy_testAverageHourlyRateOverTimePolicyA
	 */
	function testAverageHourlyRateOverTimePolicyA() {
		if ( getTTProductEdition() == TT_PRODUCT_COMMUNITY ) {
			return true;
		}

		global $dd;

		$policy_ids['pay_formula_policy'][] = $this->createPayFormulaPolicy( $this->company_id, 1101 );                                                                                                                                                                                                                                                //Reg Alt Wage #1
		$policy_ids['pay_formula_policy'][] = $this->createPayFormulaPolicy( $this->company_id, 1102 );                                                                                                                                                                                                                                                //Reg Alt Wage #2
		$policy_ids['pay_formula_policy'][] = $this->createPayFormulaPolicy( $this->company_id, 1200 );                                                                                                                                                                                                                                                //OT1.5 AVGING
		$policy_ids['pay_formula_policy'][] = $this->createPayFormulaPolicy( $this->company_id, 1210 );                                                                                                                                                                                                                                                //OT2.0 AVGING
		$policy_ids['pay_formula_policy'][] = $this->createPayFormulaPolicy( $this->company_id, 1220 );                                                                                                                                                                                                                                                //OT2.5 AVGING

		//Regular
		$policy_ids['regular'][] = $this->createRegularTimePolicy( $this->company_id, 1010, $this->policy_ids['contributing_shift_policy'][10], $this->policy_ids['pay_code'][101] );                                                                                                                                                                  //Branch 1
		$policy_ids['regular'][] = $this->createRegularTimePolicy( $this->company_id, 1020, $this->policy_ids['contributing_shift_policy'][10], $this->policy_ids['pay_code'][102] );                                                                                                                                                                  //Branch 2

		//Daily
		$policy_ids['pay_code'][] = $this->createPayCode( $this->company_id, 100, $policy_ids['pay_formula_policy'][2] );
		$policy_ids['pay_code'][] = $this->createPayCode( $this->company_id, 110, $policy_ids['pay_formula_policy'][3] );
		$policy_ids['pay_code'][] = $this->createPayCode( $this->company_id, 120, $policy_ids['pay_formula_policy'][4] );

		//Weekly
		$policy_ids['pay_code'][] = $this->createPayCode( $this->company_id, 210, $policy_ids['pay_formula_policy'][2] );
		//$policy_ids['pay_code'][]  = $this->createPayCode( $this->company_id, 240, $policy_ids['pay_formula_policy'][1] );
		//$policy_ids['pay_code'][]  = $this->createPayCode( $this->company_id, 250, $policy_ids['pay_formula_policy'][2] );

		//Contributing Pay Codes
		$policy_ids['contributing_pay_code_policy'][] = $dd->createContributingPayCodePolicy( $this->company_id, 20, array_merge( [ $this->policy_ids['pay_code'][100], $this->policy_ids['pay_code'][101], $this->policy_ids['pay_code'][102], $this->policy_ids['pay_code'][190], $this->policy_ids['pay_code'][192] ], $policy_ids['pay_code'] ) ); //Regular+OT+Meal/Break

		//Contributing Shifts
		$policy_ids['contributing_shift_policy'][] = $dd->createContributingShiftPolicy( $this->company_id, 30, $policy_ids['contributing_pay_code_policy'][0] );                                                                                                                                                                                      //Regular+OT+Meal/Break

		$this->updatePayFormulaPolicy( $policy_ids['pay_formula_policy'][2], 0, $policy_ids['contributing_shift_policy'][0], $policy_ids['contributing_shift_policy'][0] );
		$this->updatePayFormulaPolicy( $policy_ids['pay_formula_policy'][3], 0, $policy_ids['contributing_shift_policy'][0], $policy_ids['contributing_shift_policy'][0] );
		$this->updatePayFormulaPolicy( $policy_ids['pay_formula_policy'][4], 0, $policy_ids['contributing_shift_policy'][0], $policy_ids['contributing_shift_policy'][0] );

		//$policy_ids['overtime'][] = $this->createOverTimePolicy( $this->company_id, 100, $this->policy_ids['contributing_shift_policy'][10], $policy_ids['pay_code'][0] );
		//$policy_ids['overtime'][] = $this->createOverTimePolicy( $this->company_id, 110, $this->policy_ids['contributing_shift_policy'][10], $policy_ids['pay_code'][1] );
		//$policy_ids['overtime'][] = $this->createOverTimePolicy( $this->company_id, 120, $this->policy_ids['contributing_shift_policy'][10], $policy_ids['pay_code'][2] );
		$policy_ids['overtime'][] = $this->createOverTimePolicy( $this->company_id, 210, $this->policy_ids['contributing_shift_policy'][10], $policy_ids['pay_code'][3] );

		//$policy_ids['overtime'][] = $this->createOverTimePolicy( $this->company_id, 100, $this->policy_ids['contributing_shift_policy'][12], $policy_ids['pay_code'][0] );
		//$policy_ids['overtime'][] = $this->createOverTimePolicy( $this->company_id, 1000, $this->policy_ids['contributing_shift_policy'][12], $policy_ids['pay_code'][1] );
		//$policy_ids['overtime'][] = $this->createOverTimePolicy( $this->company_id, 1001, $this->policy_ids['contributing_shift_policy'][12], $policy_ids['pay_code'][2] );
		//$policy_ids['overtime'][] = $this->createOverTimePolicy( $this->company_id, 230, $this->policy_ids['contributing_shift_policy'][12], $policy_ids['pay_code'][3] );

		//Create Policy Group
		$dd->createPolicyGroup( $this->company_id,
								null, //Meal
								null, //Exception
								null, //Holiday
								$policy_ids['overtime'], //OT
								null, //Premium
								null, //Round
								[ $this->user_id ], //Users
								null, //Break
								null, //Accrual
								null, //Expense
								null, //Absence
								array_merge( [ $this->policy_ids['regular'][12] ], $policy_ids['regular'] ) //Regular
		);


		$date_epoch = TTDate::getMiddleDayEpoch( TTDate::getBeginWeekEpoch( time() ) );
		$date_stamp = TTDate::getDate( 'DATE', $date_epoch );

		//
		//Day of Week: 1
		//
		$dd->createPunchPair( $this->user_id,
							  strtotime( $date_stamp . ' 8:00AM' ),
							  strtotime( $date_stamp . ' 4:00PM' ),
							  [
									  'in_type_id'    => 10,
									  'out_type_id'   => 10,
									  'branch_id'     => $this->branch_ids[0],
									  'department_id' => 0,
									  'job_id'        => 0,
									  'job_item_id'   => 0,
									  'punch_tag_id'  => []
							  ],
							  true
		);
		$dd->createPunchPair( $this->user_id,
							  strtotime( $date_stamp . ' 4:00PM' ),
							  strtotime( $date_stamp . ' 8:00PM' ),
							  [
									  'in_type_id'    => 10,
									  'out_type_id'   => 10,
									  'branch_id'     => $this->branch_ids[0],
									  'department_id' => 0,
									  'job_id'        => 0,
									  'job_item_id'   => 0,
									  'punch_tag_id'  => []
							  ],
							  true
		);

		$udt_arr = $this->getUserDateTotalArray( $date_epoch, $date_epoch );
		//print_r($udt_arr);
		//Total Time
		$this->assertEquals( 5, $udt_arr[$date_epoch][0]['object_type_id'] );                                                                                                                                                                                                                                                                          //5=System Total
		$this->assertEquals( $udt_arr[$date_epoch][0]['pay_code_id'], TTUUID::getZeroID() );
		$this->assertEquals( $udt_arr[$date_epoch][0]['total_time'], ( 12 * 3600 ) );
		$this->assertEquals( 0, $udt_arr[$date_epoch][0]['hourly_rate'] );
		$this->assertEquals( 0, $udt_arr[$date_epoch][0]['hourly_rate_with_burden'] );

		////Regular Time B1 -- This was compacted out with compactUserDateTotalDataBasedOnTimeStamps()
		//$this->assertEquals( 20, $udt_arr[$date_epoch][1]['object_type_id'] );                                                                                                                                                                                                                                                                         //Regular Time
		//$this->assertEquals( $udt_arr[$date_epoch][1]['pay_code_id'], $this->policy_ids['pay_code'][101] );                                                                                                                                                                                                                                            //Regular Time
		//$this->assertEquals( $udt_arr[$date_epoch][1]['total_time'], ( 4 * 3600 ) );
		//$this->assertEquals( $udt_arr[$date_epoch][1]['hourly_rate'], ( 1 * 10.00 ) );
		//$this->assertEquals( $udt_arr[$date_epoch][1]['hourly_rate_with_burden'], ( 1 * 10.00 * 1.135 ) );
		////Regular Time B2 -- This was compacted out with compactUserDateTotalDataBasedOnTimeStamps()
		//$this->assertEquals( 20, $udt_arr[$date_epoch][2]['object_type_id'] );                                                                                                                                                                                                                                                                         //Regular Time
		//$this->assertEquals( $udt_arr[$date_epoch][2]['pay_code_id'], $this->policy_ids['pay_code'][101] );                                                                                                                                                                                                                                            //Regular Time
		//$this->assertEquals( $udt_arr[$date_epoch][2]['total_time'], ( 8 * 3600 ) );
		//$this->assertEquals( $udt_arr[$date_epoch][2]['hourly_rate'], ( 1 * 10.00 ) );
		//$this->assertEquals( $udt_arr[$date_epoch][2]['hourly_rate_with_burden'], ( 1 * 10.00 * 1.135 ) );
		//Regular Time
		$this->assertEquals( 20, $udt_arr[$date_epoch][1]['object_type_id'] );                                                                                                                                                                                                                                                                         //Regular Time
		$this->assertEquals( $udt_arr[$date_epoch][1]['pay_code_id'], $this->policy_ids['pay_code'][101] );                                                                                                                                                                                                                                            //Regular Time
		$this->assertEquals( $udt_arr[$date_epoch][1]['total_time'], ( 12 * 3600 ) );
		$this->assertEquals( $udt_arr[$date_epoch][1]['hourly_rate'], ( 1 * 10.00 ) );
		$this->assertEquals( $udt_arr[$date_epoch][1]['hourly_rate_with_burden'], ( 1 * 10.00 * 1.135 ) );

		//Make sure no other hours
		$this->assertCount( 2, $udt_arr[$date_epoch] );

		//
		//Day of Week: 2
		//
		$date_epoch = TTDate::incrementDate( TTDate::getMiddleDayEpoch( TTDate::getBeginWeekEpoch( time() ) ), 1, 'day' );
		$date_stamp = TTDate::getDate( 'DATE', $date_epoch );

		$dd->createPunchPair( $this->user_id,
							  strtotime( $date_stamp . ' 8:00AM' ),
							  strtotime( $date_stamp . ' 4:00PM' ),
							  [
									  'in_type_id'    => 10,
									  'out_type_id'   => 10,
									  'branch_id'     => $this->branch_ids[0],
									  'department_id' => 0,
									  'job_id'        => 0,
									  'job_item_id'   => 0,
									  'punch_tag_id'  => []
							  ],
							  true
		);
		$dd->createPunchPair( $this->user_id,
							  strtotime( $date_stamp . ' 4:00PM' ),
							  strtotime( $date_stamp . ' 8:00PM' ),
							  [
									  'in_type_id'    => 10,
									  'out_type_id'   => 10,
									  'branch_id'     => $this->branch_ids[0],
									  'department_id' => 0,
									  'job_id'        => 0,
									  'job_item_id'   => 0,
									  'punch_tag_id'  => []
							  ],
							  true
		);

		$udt_arr = $this->getUserDateTotalArray( $date_epoch, $date_epoch );
		//print_r($udt_arr);
		//Total Time
		$this->assertEquals( 5, $udt_arr[$date_epoch][0]['object_type_id'] );                                                                                                                                                                                                                                                                          //5=System Total
		$this->assertEquals( $udt_arr[$date_epoch][0]['pay_code_id'], TTUUID::getZeroID() );
		$this->assertEquals( $udt_arr[$date_epoch][0]['total_time'], ( 12 * 3600 ) );
		////Regular Time B1 -- This was compacted out with compactUserDateTotalDataBasedOnTimeStamps()
		//$this->assertEquals( 20, $udt_arr[$date_epoch][1]['object_type_id'] );                                                                                                                                                                                                                                                                         //Regular Time
		//$this->assertEquals( $udt_arr[$date_epoch][1]['pay_code_id'], $this->policy_ids['pay_code'][101] );                                                                                                                                                                                                                                            //Regular Time
		//$this->assertEquals( $udt_arr[$date_epoch][1]['total_time'], ( 4 * 3600 ) );
		//$this->assertEquals( $udt_arr[$date_epoch][1]['hourly_rate'], ( 1 * 10.00 ) );
		////Regular Time B2-- This was compacted out with compactUserDateTotalDataBasedOnTimeStamps()
		//$this->assertEquals( 20, $udt_arr[$date_epoch][2]['object_type_id'] );                                                                                                                                                                                                                                                                         //Regular Time
		//$this->assertEquals( $udt_arr[$date_epoch][2]['pay_code_id'], $this->policy_ids['pay_code'][101] );                                                                                                                                                                                                                                            //Regular Time
		//$this->assertEquals( $udt_arr[$date_epoch][2]['total_time'], ( 8 * 3600 ) );
		//$this->assertEquals( $udt_arr[$date_epoch][2]['hourly_rate'], ( 1 * 10.00 ) );
		//Regular Time
		$this->assertEquals( 20, $udt_arr[$date_epoch][1]['object_type_id'] );                                                                                                                                                                                                                                                                         //Regular Time
		$this->assertEquals( $udt_arr[$date_epoch][1]['pay_code_id'], $this->policy_ids['pay_code'][101] );                                                                                                                                                                                                                                            //Regular Time
		$this->assertEquals( $udt_arr[$date_epoch][1]['total_time'], ( 12 * 3600 ) );
		$this->assertEquals( $udt_arr[$date_epoch][1]['hourly_rate'], ( 1 * 10.00 ) );
		//Make sure no other hours
		$this->assertCount( 2, $udt_arr[$date_epoch] );


		//
		//Day of Week: 3
		//
		$date_epoch = TTDate::incrementDate( TTDate::getMiddleDayEpoch( TTDate::getBeginWeekEpoch( time() ) ), 2, 'day' );
		$date_stamp = TTDate::getDate( 'DATE', $date_epoch );

		$dd->createPunchPair( $this->user_id,
							  strtotime( $date_stamp . ' 8:00AM' ),
							  strtotime( $date_stamp . ' 4:00PM' ),
							  [
									  'in_type_id'    => 10,
									  'out_type_id'   => 10,
									  'branch_id'     => $this->branch_ids[1],
									  'department_id' => 0,
									  'job_id'        => 0,
									  'job_item_id'   => 0,
									  'punch_tag_id'  => []
							  ],
							  true
		);
		$dd->createPunchPair( $this->user_id,
							  strtotime( $date_stamp . ' 4:00PM' ),
							  strtotime( $date_stamp . ' 8:00PM' ),
							  [
									  'in_type_id'    => 10,
									  'out_type_id'   => 10,
									  'branch_id'     => $this->branch_ids[1],
									  'department_id' => 0,
									  'job_id'        => 0,
									  'job_item_id'   => 0,
									  'punch_tag_id'  => []
							  ],
							  true
		);

		$udt_arr = $this->getUserDateTotalArray( $date_epoch, $date_epoch );
		//print_r($udt_arr);
		//Total Time
		$this->assertEquals( 5, $udt_arr[$date_epoch][0]['object_type_id'] );                                                                                                                                                                                                                                                                          //5=System Total
		$this->assertEquals( $udt_arr[$date_epoch][0]['pay_code_id'], TTUUID::getZeroID() );
		$this->assertEquals( $udt_arr[$date_epoch][0]['total_time'], ( 12 * 3600 ) );
		////Regular Time B1 -- This was compacted out with compactUserDateTotalDataBasedOnTimeStamps()
		//$this->assertEquals( 20, $udt_arr[$date_epoch][1]['object_type_id'] );                                                                                                                                                                                                                                                                         //Regular Time
		//$this->assertEquals( $udt_arr[$date_epoch][1]['pay_code_id'], $this->policy_ids['pay_code'][102] );                                                                                                                                                                                                                                            //Regular Time
		//$this->assertEquals( $udt_arr[$date_epoch][1]['total_time'], ( 4 * 3600 ) );
		//$this->assertEquals( $udt_arr[$date_epoch][1]['hourly_rate'], ( 1 * 20.00 ) );
		//$this->assertEquals( $udt_arr[$date_epoch][1]['hourly_rate_with_burden'], ( 1 * 20.00 * 1.135 ) );
		////Regular Time B2 -- This was compacted out with compactUserDateTotalDataBasedOnTimeStamps()
		//$this->assertEquals( 20, $udt_arr[$date_epoch][2]['object_type_id'] );                                                                                                                                                                                                                                                                         //Regular Time
		//$this->assertEquals( $udt_arr[$date_epoch][2]['pay_code_id'], $this->policy_ids['pay_code'][102] );                                                                                                                                                                                                                                            //Regular Time
		//$this->assertEquals( $udt_arr[$date_epoch][2]['total_time'], ( 8 * 3600 ) );
		//$this->assertEquals( $udt_arr[$date_epoch][2]['hourly_rate'], ( 1 * 20.00 ) );
		//$this->assertEquals( $udt_arr[$date_epoch][2]['hourly_rate_with_burden'], ( 1 * 20.00 * 1.135 ) );
		//Regular Time
		$this->assertEquals( 20, $udt_arr[$date_epoch][1]['object_type_id'] );                                                                                                                                                                                                                                                                         //Regular Time
		$this->assertEquals( $udt_arr[$date_epoch][1]['pay_code_id'], $this->policy_ids['pay_code'][102] );                                                                                                                                                                                                                                            //Regular Time
		$this->assertEquals( $udt_arr[$date_epoch][1]['total_time'], ( 12 * 3600 ) );
		$this->assertEquals( $udt_arr[$date_epoch][1]['hourly_rate'], ( 1 * 20.00 ) );
		$this->assertEquals( $udt_arr[$date_epoch][1]['hourly_rate_with_burden'], ( 1 * 20.00 * 1.135 ) );
		//Make sure no other hours
		$this->assertCount( 2, $udt_arr[$date_epoch] );


		//
		//Day of Week: 4
		//
		$date_epoch = TTDate::incrementDate( TTDate::getMiddleDayEpoch( TTDate::getBeginWeekEpoch( time() ) ), 3, 'day' );
		$date_stamp = TTDate::getDate( 'DATE', $date_epoch );

		$dd->createPunchPair( $this->user_id,
							  strtotime( $date_stamp . ' 8:00AM' ),
							  strtotime( $date_stamp . ' 4:00PM' ),
							  [
									  'in_type_id'    => 10,
									  'out_type_id'   => 10,
									  'branch_id'     => $this->branch_ids[1],
									  'department_id' => 0,
									  'job_id'        => 0,
									  'job_item_id'   => 0,
									  'punch_tag_id'  => []
							  ],
							  true
		);
		$dd->createPunchPair( $this->user_id,
							  strtotime( $date_stamp . ' 4:00PM' ),
							  strtotime( $date_stamp . ' 8:00PM' ),
							  [
									  'in_type_id'    => 10,
									  'out_type_id'   => 10,
									  'branch_id'     => $this->branch_ids[1],
									  'department_id' => 0,
									  'job_id'        => 0,
									  'job_item_id'   => 0,
									  'punch_tag_id'  => []
							  ],
							  true
		);

		$udt_arr = $this->getUserDateTotalArray( $date_epoch, $date_epoch );
		//print_r($udt_arr);
		//Total Time
		$this->assertEquals( 5, $udt_arr[$date_epoch][0]['object_type_id'] );                                                                                                                                                                                                                                                                          //5=System Total
		$this->assertEquals( $udt_arr[$date_epoch][0]['pay_code_id'], TTUUID::getZeroID() );
		$this->assertEquals( $udt_arr[$date_epoch][0]['total_time'], ( 12 * 3600 ) );
		////Regular Time B1 -- This was compacted out with compactUserDateTotalDataBasedOnTimeStamps()
		//$this->assertEquals( 20, $udt_arr[$date_epoch][1]['object_type_id'] );                                                                                                                                                                                                                                                                         //Regular Time
		//$this->assertEquals( $udt_arr[$date_epoch][1]['pay_code_id'], $this->policy_ids['pay_code'][102] );                                                                                                                                                                                                                                            //Regular Time
		//$this->assertEquals( $udt_arr[$date_epoch][1]['total_time'], ( 4 * 3600 ) );
		//$this->assertEquals( $udt_arr[$date_epoch][1]['hourly_rate'], ( 1 * 20.00 ) );
		////Regular Time B2 -- This was compacted out with compactUserDateTotalDataBasedOnTimeStamps()
		//$this->assertEquals( 20, $udt_arr[$date_epoch][2]['object_type_id'] );                                                                                                                                                                                                                                                                         //Regular Time
		//$this->assertEquals( $udt_arr[$date_epoch][2]['pay_code_id'], $this->policy_ids['pay_code'][102] );                                                                                                                                                                                                                                            //Regular Time
		//$this->assertEquals( $udt_arr[$date_epoch][2]['total_time'], ( 8 * 3600 ) );
		//$this->assertEquals( $udt_arr[$date_epoch][2]['hourly_rate'], ( 1 * 20.00 ) );
		//Regular Time
		$this->assertEquals( 20, $udt_arr[$date_epoch][1]['object_type_id'] );                                                                                                                                                                                                                                                                         //Regular Time
		$this->assertEquals( $udt_arr[$date_epoch][1]['pay_code_id'], $this->policy_ids['pay_code'][102] );                                                                                                                                                                                                                                            //Regular Time
		$this->assertEquals( $udt_arr[$date_epoch][1]['total_time'], ( 12 * 3600 ) );
		$this->assertEquals( $udt_arr[$date_epoch][1]['hourly_rate'], ( 1 * 20.00 ) );
		//Make sure no other hours
		$this->assertCount( 2, $udt_arr[$date_epoch] );

		//
		//Day of Week: 5
		//
		$date_epoch = TTDate::incrementDate( TTDate::getMiddleDayEpoch( TTDate::getBeginWeekEpoch( time() ) ), 4, 'day' );
		$date_stamp = TTDate::getDate( 'DATE', $date_epoch );

		$dd->createPunchPair( $this->user_id,
							  strtotime( $date_stamp . ' 8:00AM' ),
							  strtotime( $date_stamp . ' 4:00PM' ),
							  [
									  'in_type_id'    => 10,
									  'out_type_id'   => 10,
									  'branch_id'     => $this->branch_ids[1],
									  'department_id' => 0,
									  'job_id'        => 0,
									  'job_item_id'   => 0,
									  'punch_tag_id'  => []
							  ],
							  true
		);
		$dd->createPunchPair( $this->user_id,
							  strtotime( $date_stamp . ' 4:00PM' ),
							  strtotime( $date_stamp . ' 8:00PM' ),
							  [
									  'in_type_id'    => 10,
									  'out_type_id'   => 10,
									  'branch_id'     => $this->branch_ids[1],
									  'department_id' => 0,
									  'job_id'        => 0,
									  'job_item_id'   => 0,
									  'punch_tag_id'  => []
							  ],
							  true
		);

		$udt_arr = $this->getUserDateTotalArray( $date_epoch, $date_epoch );
		//print_r($udt_arr);
		//Total Time
		$this->assertEquals( 5, $udt_arr[$date_epoch][0]['object_type_id'] );                                                                                                                                                                                                                                                                          //5=System Total
		$this->assertEquals( $udt_arr[$date_epoch][0]['pay_code_id'], TTUUID::getZeroID() );
		$this->assertEquals( $udt_arr[$date_epoch][0]['total_time'], ( 12 * 3600 ) );
		////Regular Time B1
		//$this->assertEquals( 20, $udt_arr[$date_epoch][1]['object_type_id'] );                                                                                                                                                                                                                                                                         //Regular Time
		//$this->assertEquals( $udt_arr[$date_epoch][1]['pay_code_id'], $this->policy_ids['pay_code'][102] );                                                                                                                                                                                                                                            //Regular Time
		//$this->assertEquals( $udt_arr[$date_epoch][1]['total_time'], ( 3 * 3600 ) );
		//$this->assertEquals( $udt_arr[$date_epoch][1]['hourly_rate'], ( 1 * 20.00 ) );
		//$this->assertEquals( $udt_arr[$date_epoch][1]['hourly_rate_with_burden'], ( 1 * 20.00 * 1.135 ) );
		////Regular Time B2
		//$this->assertEquals( 20, $udt_arr[$date_epoch][2]['object_type_id'] );                                                                                                                                                                                                                                                                         //Regular Time
		//$this->assertEquals( $udt_arr[$date_epoch][2]['pay_code_id'], $this->policy_ids['pay_code'][102] );                                                                                                                                                                                                                                            //Regular Time
		//$this->assertEquals( $udt_arr[$date_epoch][2]['total_time'], ( 8 * 3600 ) );
		//$this->assertEquals( $udt_arr[$date_epoch][2]['hourly_rate'], ( 1 * 20.00 ) );
		//$this->assertEquals( $udt_arr[$date_epoch][2]['hourly_rate_with_burden'], ( 1 * 20.00 * 1.135 ) );
		//Regular Time
		$this->assertEquals( 20, $udt_arr[$date_epoch][1]['object_type_id'] );                                                                                                                                                                                                                                                                         //Regular Time
		$this->assertEquals( $udt_arr[$date_epoch][1]['pay_code_id'], $this->policy_ids['pay_code'][102] );                                                                                                                                                                                                                                            //Regular Time
		$this->assertEquals( $udt_arr[$date_epoch][1]['total_time'], ( 11 * 3600 ) );
		$this->assertEquals( $udt_arr[$date_epoch][1]['hourly_rate'], ( 1 * 20.00 ) );
		$this->assertEquals( $udt_arr[$date_epoch][1]['hourly_rate_with_burden'], ( 1 * 20.00 * 1.135 ) );
		//Overtime1
		$this->assertEquals( 30, $udt_arr[$date_epoch][2]['object_type_id'] );                                                                                                                                                                                                                                                                         //OverTime
		$this->assertEquals( $udt_arr[$date_epoch][2]['pay_code_id'], $policy_ids['pay_code'][3] );                                                                                                                                                                                                                                                    //Overtime1
		$this->assertEquals( $udt_arr[$date_epoch][2]['total_time'], ( 1 * 3600 ) );
		$this->assertEquals( $udt_arr[$date_epoch][2]['hourly_rate'], ( 1 * 24.00 ) );
		$this->assertEquals( $udt_arr[$date_epoch][2]['hourly_rate_with_burden'], Misc::MoneyRound( ( 1 * 24.00 * 1.135 ), 4 ) );
		/*
			OT AVGing formula:
			24hrs @ $10.00 = $240.00
			36hrs @ $20.00 = $720.00
			------------------------
			60hrs          = $960.00

			$960/60hrs = $16/hr avg regular time rate. $24 @ 1.5x
		*/

		//Make sure no other hours
		$this->assertCount( 3, $udt_arr[$date_epoch] );


		//
		//Day of Week: 6
		//
		$date_epoch = TTDate::incrementDate( TTDate::getMiddleDayEpoch( TTDate::getBeginWeekEpoch( time() ) ), 5, 'day' );
		$date_stamp = TTDate::getDate( 'DATE', $date_epoch );

		$dd->createPunchPair( $this->user_id,
							  strtotime( $date_stamp . ' 8:00AM' ),
							  strtotime( $date_stamp . ' 4:00PM' ),
							  [
									  'in_type_id'    => 10,
									  'out_type_id'   => 10,
									  'branch_id'     => $this->branch_ids[1],
									  'department_id' => 0,
									  'job_id'        => 0,
									  'job_item_id'   => 0,
									  'punch_tag_id'  => []
							  ],
							  true
		);
		$dd->createPunchPair( $this->user_id,
							  strtotime( $date_stamp . ' 4:00PM' ),
							  strtotime( $date_stamp . ' 8:00PM' ),
							  [
									  'in_type_id'    => 10,
									  'out_type_id'   => 10,
									  'branch_id'     => $this->branch_ids[1],
									  'department_id' => 0,
									  'job_id'        => 0,
									  'job_item_id'   => 0,
									  'punch_tag_id'  => []
							  ],
							  true
		);
		$udt_arr = $this->getUserDateTotalArray( $date_epoch, $date_epoch );
		//print_r($udt_arr);
		//Total Time
		$this->assertEquals( 5, $udt_arr[$date_epoch][0]['object_type_id'] );                                                                                                                                                                                                                                                                          //5=System Total
		$this->assertEquals( $udt_arr[$date_epoch][0]['pay_code_id'], TTUUID::getZeroID() );
		$this->assertEquals( $udt_arr[$date_epoch][0]['total_time'], ( 12 * 3600 ) );
		////Weekly Overtime1 B1 -- This was compacted out with compactUserDateTotalDataBasedOnTimeStamps()
		//$this->assertEquals( 30, $udt_arr[$date_epoch][1]['object_type_id'] );                                                                                                                                                                                                                                                                         //Overtime
		//$this->assertEquals( $udt_arr[$date_epoch][1]['pay_code_id'], $policy_ids['pay_code'][3] );
		//$this->assertEquals( $udt_arr[$date_epoch][1]['total_time'], ( 4 * 3600 ) );
		//$this->assertEquals( $udt_arr[$date_epoch][1]['hourly_rate'], ( 1 * 25.00 ) );
		//$this->assertEquals( $udt_arr[$date_epoch][1]['hourly_rate_with_burden'], ( 1 * 25.00 * 1.135 ) );
		////Weekly Overtime1 B2 -- This was compacted out with compactUserDateTotalDataBasedOnTimeStamps()
		//$this->assertEquals( 30, $udt_arr[$date_epoch][2]['object_type_id'] );                                                                                                                                                                                                                                                                         //Overtime
		//$this->assertEquals( $udt_arr[$date_epoch][2]['pay_code_id'], $policy_ids['pay_code'][3] );
		//$this->assertEquals( $udt_arr[$date_epoch][2]['total_time'], ( 8 * 3600 ) );
		//$this->assertEquals( $udt_arr[$date_epoch][2]['hourly_rate'], ( 1 * 25.00 ) );
		//$this->assertEquals( $udt_arr[$date_epoch][2]['hourly_rate_with_burden'], ( 1 * 25.00 * 1.135 ) );
		//Weekly Overtime1
		$this->assertEquals( 30, $udt_arr[$date_epoch][1]['object_type_id'] );                                                                                                                                                                                                                                                                         //Overtime
		$this->assertEquals( $udt_arr[$date_epoch][1]['pay_code_id'], $policy_ids['pay_code'][3] );
		$this->assertEquals( $udt_arr[$date_epoch][1]['total_time'], ( 12 * 3600 ) );
		$this->assertEquals( $udt_arr[$date_epoch][1]['hourly_rate'], ( 1 * 25.00 ) );
		$this->assertEquals( $udt_arr[$date_epoch][1]['hourly_rate_with_burden'], ( 1 * 25.00 * 1.135 ) );
		/*
			OT AVGing formula:
			24hrs @ $10.00 = $240.00
			48hrs @ $20.00 = $960.00
			------------------------
			72hrs          = $1200.00

			$1200/72hrs = $16.6667/hr avg regular time rate. $25 @ 1.5x
		*/
		//Make sure no other hours
		$this->assertCount( 2, $udt_arr[$date_epoch] );


		//
		//Since its averaging, make sure the hourly rate changed on all previous days as well.
		//


		//Day 1
		$date_epoch = TTDate::getMiddleDayEpoch( TTDate::getBeginWeekEpoch( time() ) );
		$udt_arr = $this->getUserDateTotalArray( $date_epoch, $date_epoch );
		//Total Time
		$this->assertEquals( 5, $udt_arr[$date_epoch][0]['object_type_id'] );                                                                                                                                                                                                                                                                          //5=System Total
		$this->assertEquals( $udt_arr[$date_epoch][0]['pay_code_id'], TTUUID::getZeroID() );
		$this->assertEquals( $udt_arr[$date_epoch][0]['total_time'], ( 12 * 3600 ) );
		////Regular Time B1 -- This was compacted out with compactUserDateTotalDataBasedOnTimeStamps()
		//$this->assertEquals( 20, $udt_arr[$date_epoch][1]['object_type_id'] );                                                                                                                                                                                                                                                                         //Regular Time
		//$this->assertEquals( $udt_arr[$date_epoch][1]['pay_code_id'], $this->policy_ids['pay_code'][101] );                                                                                                                                                                                                                                            //Regular Time
		//$this->assertEquals( $udt_arr[$date_epoch][1]['total_time'], ( 4 * 3600 ) );
		//$this->assertEquals( $udt_arr[$date_epoch][1]['hourly_rate'], ( 1 * 10.00 ) );
		////Regular Time B2 -- This was compacted out with compactUserDateTotalDataBasedOnTimeStamps()
		//$this->assertEquals( 20, $udt_arr[$date_epoch][2]['object_type_id'] );                                                                                                                                                                                                                                                                         //Regular Time
		//$this->assertEquals( $udt_arr[$date_epoch][2]['pay_code_id'], $this->policy_ids['pay_code'][101] );                                                                                                                                                                                                                                            //Regular Time
		//$this->assertEquals( $udt_arr[$date_epoch][2]['total_time'], ( 8 * 3600 ) );
		//$this->assertEquals( $udt_arr[$date_epoch][2]['hourly_rate'], ( 1 * 10.00 ) );
		//Regular Time
		$this->assertEquals( 20, $udt_arr[$date_epoch][1]['object_type_id'] );                                                                                                                                                                                                                                                                         //Regular Time
		$this->assertEquals( $udt_arr[$date_epoch][1]['pay_code_id'], $this->policy_ids['pay_code'][101] );                                                                                                                                                                                                                                            //Regular Time
		$this->assertEquals( $udt_arr[$date_epoch][1]['total_time'], ( 12 * 3600 ) );
		$this->assertEquals( $udt_arr[$date_epoch][1]['hourly_rate'], ( 1 * 10.00 ) );
		//Make sure no other hours
		$this->assertCount( 2, $udt_arr[$date_epoch] );

		//Day 2
		$date_epoch = TTDate::incrementDate( TTDate::getMiddleDayEpoch( TTDate::getBeginWeekEpoch( time() ) ), 1, 'day' );
		$udt_arr = $this->getUserDateTotalArray( $date_epoch, $date_epoch );
		//Total Time
		$this->assertEquals( 5, $udt_arr[$date_epoch][0]['object_type_id'] );                                                                                                                                                                                                                                                                          //5=System Total
		$this->assertEquals( $udt_arr[$date_epoch][0]['pay_code_id'], TTUUID::getZeroID() );
		$this->assertEquals( $udt_arr[$date_epoch][0]['total_time'], ( 12 * 3600 ) );
		////Regular Time B1 -- This was compacted out with compactUserDateTotalDataBasedOnTimeStamps()
		//$this->assertEquals( 20, $udt_arr[$date_epoch][1]['object_type_id'] );                                                                                                                                                                                                                                                                         //Regular Time
		//$this->assertEquals( $udt_arr[$date_epoch][1]['pay_code_id'], $this->policy_ids['pay_code'][101] );                                                                                                                                                                                                                                            //Regular Time
		//$this->assertEquals( $udt_arr[$date_epoch][1]['total_time'], ( 4 * 3600 ) );
		//$this->assertEquals( $udt_arr[$date_epoch][1]['hourly_rate'], ( 1 * 10.00 ) );
		////Regular Time B2 -- This was compacted out with compactUserDateTotalDataBasedOnTimeStamps()
		//$this->assertEquals( 20, $udt_arr[$date_epoch][2]['object_type_id'] );                                                                                                                                                                                                                                                                         //Regular Time
		//$this->assertEquals( $udt_arr[$date_epoch][2]['pay_code_id'], $this->policy_ids['pay_code'][101] );                                                                                                                                                                                                                                            //Regular Time
		//$this->assertEquals( $udt_arr[$date_epoch][2]['total_time'], ( 8 * 3600 ) );
		//$this->assertEquals( $udt_arr[$date_epoch][2]['hourly_rate'], ( 1 * 10.00 ) );
		//Regular Time
		$this->assertEquals( 20, $udt_arr[$date_epoch][1]['object_type_id'] );                                                                                                                                                                                                                                                                         //Regular Time
		$this->assertEquals( $udt_arr[$date_epoch][1]['pay_code_id'], $this->policy_ids['pay_code'][101] );                                                                                                                                                                                                                                            //Regular Time
		$this->assertEquals( $udt_arr[$date_epoch][1]['total_time'], ( 12 * 3600 ) );
		$this->assertEquals( $udt_arr[$date_epoch][1]['hourly_rate'], ( 1 * 10.00 ) );
		//Make sure no other hours
		$this->assertCount( 2, $udt_arr[$date_epoch] );

		//Day 3
		$date_epoch = TTDate::incrementDate( TTDate::getMiddleDayEpoch( TTDate::getBeginWeekEpoch( time() ) ), 2, 'day' );
		$udt_arr = $this->getUserDateTotalArray( $date_epoch, $date_epoch );
		//Total Time
		$this->assertEquals( 5, $udt_arr[$date_epoch][0]['object_type_id'] );                                                                                                                                                                                                                                                                          //5=System Total
		$this->assertEquals( $udt_arr[$date_epoch][0]['pay_code_id'], TTUUID::getZeroID() );
		$this->assertEquals( $udt_arr[$date_epoch][0]['total_time'], ( 12 * 3600 ) );
		////Regular Time B1 -- This was compacted out with compactUserDateTotalDataBasedOnTimeStamps()
		//$this->assertEquals( 20, $udt_arr[$date_epoch][1]['object_type_id'] );                                                                                                                                                                                                                                                                         //Regular Time
		//$this->assertEquals( $udt_arr[$date_epoch][1]['pay_code_id'], $this->policy_ids['pay_code'][102] );                                                                                                                                                                                                                                            //Regular Time
		//$this->assertEquals( $udt_arr[$date_epoch][1]['total_time'], ( 4 * 3600 ) );
		//$this->assertEquals( $udt_arr[$date_epoch][1]['hourly_rate'], ( 1 * 20.00 ) );
		////Regular Time B2 -- This was compacted out with compactUserDateTotalDataBasedOnTimeStamps()
		//$this->assertEquals( 20, $udt_arr[$date_epoch][2]['object_type_id'] );                                                                                                                                                                                                                                                                         //Regular Time
		//$this->assertEquals( $udt_arr[$date_epoch][2]['pay_code_id'], $this->policy_ids['pay_code'][102] );                                                                                                                                                                                                                                            //Regular Time
		//$this->assertEquals( $udt_arr[$date_epoch][2]['total_time'], ( 8 * 3600 ) );
		//$this->assertEquals( $udt_arr[$date_epoch][2]['hourly_rate'], ( 1 * 20.00 ) );
		//Regular Time
		$this->assertEquals( 20, $udt_arr[$date_epoch][1]['object_type_id'] );                                                                                                                                                                                                                                                                         //Regular Time
		$this->assertEquals( $udt_arr[$date_epoch][1]['pay_code_id'], $this->policy_ids['pay_code'][102] );                                                                                                                                                                                                                                            //Regular Time
		$this->assertEquals( $udt_arr[$date_epoch][1]['total_time'], ( 12 * 3600 ) );
		$this->assertEquals( $udt_arr[$date_epoch][1]['hourly_rate'], ( 1 * 20.00 ) );
		//Make sure no other hours
		$this->assertCount( 2, $udt_arr[$date_epoch] );

		//Day 4
		$date_epoch = TTDate::incrementDate( TTDate::getMiddleDayEpoch( TTDate::getBeginWeekEpoch( time() ) ), 3, 'day' );
		$udt_arr = $this->getUserDateTotalArray( $date_epoch, $date_epoch );
		//Total Time
		$this->assertEquals( 5, $udt_arr[$date_epoch][0]['object_type_id'] );                                                                                                                                                                                                                                                                          //5=System Total
		$this->assertEquals( $udt_arr[$date_epoch][0]['pay_code_id'], TTUUID::getZeroID() );
		$this->assertEquals( $udt_arr[$date_epoch][0]['total_time'], ( 12 * 3600 ) );
		////Regular Time B1 -- This was compacted out with compactUserDateTotalDataBasedOnTimeStamps()
		//$this->assertEquals( 20, $udt_arr[$date_epoch][1]['object_type_id'] );                                                                                                                                                                                                                                                                         //Regular Time
		//$this->assertEquals( $udt_arr[$date_epoch][1]['pay_code_id'], $this->policy_ids['pay_code'][102] );                                                                                                                                                                                                                                            //Regular Time
		//$this->assertEquals( $udt_arr[$date_epoch][1]['total_time'], ( 4 * 3600 ) );
		//$this->assertEquals( $udt_arr[$date_epoch][1]['hourly_rate'], ( 1 * 20.00 ) );
		////Regular Time B2 -- This was compacted out with compactUserDateTotalDataBasedOnTimeStamps()
		//$this->assertEquals( 20, $udt_arr[$date_epoch][2]['object_type_id'] );                                                                                                                                                                                                                                                                         //Regular Time
		//$this->assertEquals( $udt_arr[$date_epoch][2]['pay_code_id'], $this->policy_ids['pay_code'][102] );                                                                                                                                                                                                                                            //Regular Time
		//$this->assertEquals( $udt_arr[$date_epoch][2]['total_time'], ( 8 * 3600 ) );
		//$this->assertEquals( $udt_arr[$date_epoch][2]['hourly_rate'], ( 1 * 20.00 ) );
		//Regular Time
		$this->assertEquals( 20, $udt_arr[$date_epoch][1]['object_type_id'] );                                                                                                                                                                                                                                                                         //Regular Time
		$this->assertEquals( $udt_arr[$date_epoch][1]['pay_code_id'], $this->policy_ids['pay_code'][102] );                                                                                                                                                                                                                                            //Regular Time
		$this->assertEquals( $udt_arr[$date_epoch][1]['total_time'], ( 12 * 3600 ) );
		$this->assertEquals( $udt_arr[$date_epoch][1]['hourly_rate'], ( 1 * 20.00 ) );
		//Make sure no other hours
		$this->assertCount( 2, $udt_arr[$date_epoch] );

		//Day 5
		$date_epoch = TTDate::incrementDate( TTDate::getMiddleDayEpoch( TTDate::getBeginWeekEpoch( time() ) ), 4, 'day' );
		$udt_arr = $this->getUserDateTotalArray( $date_epoch, $date_epoch );
		//Total Time
		$this->assertEquals( 5, $udt_arr[$date_epoch][0]['object_type_id'] );                                                                                                                                                                                                                                                                          //5=System Total
		$this->assertEquals( $udt_arr[$date_epoch][0]['pay_code_id'], TTUUID::getZeroID() );
		$this->assertEquals( $udt_arr[$date_epoch][0]['total_time'], ( 12 * 3600 ) );
		////Regular Time B1 -- This was compacted out with compactUserDateTotalDataBasedOnTimeStamps()
		//$this->assertEquals( 20, $udt_arr[$date_epoch][1]['object_type_id'] );                                                                                                                                                                                                                                                                         //Regular Time
		//$this->assertEquals( $udt_arr[$date_epoch][1]['pay_code_id'], $this->policy_ids['pay_code'][102] );                                                                                                                                                                                                                                            //Regular Time
		//$this->assertEquals( $udt_arr[$date_epoch][1]['total_time'], ( 3 * 3600 ) );
		//$this->assertEquals( $udt_arr[$date_epoch][1]['hourly_rate'], ( 1 * 20.00 ) );
		//$this->assertEquals( $udt_arr[$date_epoch][1]['hourly_rate_with_burden'], ( 1 * 20.00 * 1.135 ) );
		////Regular Time B2 -- This was compacted out with compactUserDateTotalDataBasedOnTimeStamps()
		//$this->assertEquals( 20, $udt_arr[$date_epoch][2]['object_type_id'] );                                                                                                                                                                                                                                                                         //Regular Time
		//$this->assertEquals( $udt_arr[$date_epoch][2]['pay_code_id'], $this->policy_ids['pay_code'][102] );                                                                                                                                                                                                                                            //Regular Time
		//$this->assertEquals( $udt_arr[$date_epoch][2]['total_time'], ( 8 * 3600 ) );
		//$this->assertEquals( $udt_arr[$date_epoch][2]['hourly_rate'], ( 1 * 20.00 ) );
		//$this->assertEquals( $udt_arr[$date_epoch][2]['hourly_rate_with_burden'], ( 1 * 20.00 * 1.135 ) );
		//Regular Time
		$this->assertEquals( 20, $udt_arr[$date_epoch][1]['object_type_id'] );                                                                                                                                                                                                                                                                         //Regular Time
		$this->assertEquals( $udt_arr[$date_epoch][1]['pay_code_id'], $this->policy_ids['pay_code'][102] );                                                                                                                                                                                                                                            //Regular Time
		$this->assertEquals( $udt_arr[$date_epoch][1]['total_time'], ( 11 * 3600 ) );
		$this->assertEquals( $udt_arr[$date_epoch][1]['hourly_rate'], ( 1 * 20.00 ) );
		$this->assertEquals( $udt_arr[$date_epoch][1]['hourly_rate_with_burden'], ( 1 * 20.00 * 1.135 ) );
		//Overtime1
		$this->assertEquals( 30, $udt_arr[$date_epoch][2]['object_type_id'] );                                                                                                                                                                                                                                                                         //Regular Time
		$this->assertEquals( $udt_arr[$date_epoch][2]['pay_code_id'], $policy_ids['pay_code'][3] );                                                                                                                                                                                                                                                    //Overtime1
		$this->assertEquals( $udt_arr[$date_epoch][2]['total_time'], ( 1 * 3600 ) );
		$this->assertEquals( $udt_arr[$date_epoch][2]['hourly_rate'], ( 1 * 25.00 ) );
		$this->assertEquals( $udt_arr[$date_epoch][2]['hourly_rate_with_burden'], ( 1 * 25.00 * 1.135 ) );
		//Make sure no other hours
		$this->assertCount( 3, $udt_arr[$date_epoch] );

		return true;
	}


	/**
	 * @group OvertimePolicy_testBiWeeklyOverTimeWeekModifierA
	 */
	function testBiWeeklyOverTimeWeekModifierA() {
		$cp = TTnew( 'CalculatePolicy' ); /** @var CalculatePolicy $cp */

		/*
		 *
		 * Bi-Weekly Pay Period Start Dates:
		 06-Dec-15
		 20-Dec-15
		 03-Jan-16
		 17-Jan-16
		 31-Jan-16
		 */
		$start_date = $first_pay_period_start_date = TTDate::getMiddleDayEpoch( strtotime( '04-Jul-2010' ) ); //Sunday
		$end_date = TTDate::getMiddleDayEpoch( TTDate::getBeginWeekEpoch( time() ) + ( 365 * 86400 ) );
		while ( $start_date <= $end_date ) {
			$pp_start_date = $start_date;
			$pp_end_date = ( strtotime( 'next Sunday', strtotime( 'next Sunday', $start_date ) ) - 43200 ); //BiWeekly, so do this twice.
			Debug::text( 'PP Start Date: ' . TTDate::getDate( 'DATE', $pp_start_date ) . ' End Date: ' . TTDate::getDate( 'DATE', $pp_end_date ), __FILE__, __LINE__, __METHOD__, 10 );

			$x = 1;
			//for( $i = $pp_start_date; $i <= $pp_end_date; $i += 86400 ) {
			foreach ( TTDate::getDatePeriod( $pp_start_date, $pp_end_date, 'P1D' ) as $i ) {
				$i = TTDate::getMiddleDayEpoch( $i ); //Make sure DST doesn't make the date walk causing failures after 4-5years.

				if ( $x >= 8 && $x <= 14 ) {
					$is_second_week = true;
				} else {
					$is_second_week = false;
				}
				//$retval = $cp->isSecondBiWeeklyOverTimeWeek( $i, $first_pay_period_start_date, 0 ); //Start Week on Wed.
				$ot_period_dates = $cp->getOverTimePeriodDates( $i, 2, $first_pay_period_start_date, 0 );
				$retval = $ot_period_dates['is_last_week'];
				//Debug::text('  Test Date: '. TTDate::getDate('DATE', $i) .' Is Second Week: '. (int)$retval .' Assert: '. (int)$is_second_week, __FILE__, __LINE__, __METHOD__,10);

				$this->assertEquals( $retval, $is_second_week );

				$x++;
			}

			$start_date = TTDate::getBeginDayEpoch( $pp_end_date + 43400 );
		}
	}

	/**
	 * @group OvertimePolicy_testBiWeeklyOverTimeWeekModifierB
	 */
	function testBiWeeklyOverTimeWeekModifierB() {
		$cp = TTnew( 'CalculatePolicy' ); /** @var CalculatePolicy $cp */

		$start_date = $first_pay_period_start_date = TTDate::getMiddleDayEpoch( strtotime( '30-Jun-2010' ) ); //Wed - Must span at least 5yrs for a full test.
		$end_date = TTDate::getMiddleDayEpoch( TTDate::getBeginWeekEpoch( time() ) + ( 365 * 86400 ) );
		while ( $start_date <= $end_date ) {
			$pp_start_date = $start_date;
			$pp_end_date = ( strtotime( 'next Wednesday', strtotime( 'next Wednesday', $start_date ) ) - 43200 ); //BiWeekly, so do this twice.
			Debug::text( 'PP Start Date: ' . TTDate::getDate( 'DATE+TIME', $pp_start_date ) . ' End Date: ' . TTDate::getDate( 'DATE+TIME', $pp_end_date ), __FILE__, __LINE__, __METHOD__, 10 );

			$x = 1;
			//for( $i = $pp_start_date; $i <= $pp_end_date; $i += 86400 ) {
			foreach ( TTDate::getDatePeriod( $pp_start_date, $pp_end_date, 'P1D' ) as $i ) {
				$i = TTDate::getMiddleDayEpoch( $i ); //Make sure DST doesn't make the date walk causing failures after 4-5years.

				if ( $x >= 8 && $x <= 14 ) {
					$is_second_week = true;
				} else {
					$is_second_week = false;
				}
				//$retval = $cp->isSecondBiWeeklyOverTimeWeek( $i, $first_pay_period_start_date, 3 ); //Start Week on Wed.
				$ot_period_dates = $cp->getOverTimePeriodDates( $i, 2, $first_pay_period_start_date, 3 );
				$retval = $ot_period_dates['is_last_week'];
				Debug::text( '  X: ' . $x . ' Test Date: ' . TTDate::getDate( 'DATE+TIME', $i ) . ' Is Second Week: ' . (int)$retval . ' Assert: ' . (int)$is_second_week, __FILE__, __LINE__, __METHOD__, 10 );

				$this->assertEquals( $retval, $is_second_week );

				$x++;
			}

			$start_date = TTDate::getBeginDayEpoch( $pp_end_date + 43400 );
		}
	}

	/**
	 * @group OvertimePolicy_testManualTimeSheetDailyOverTimePolicyA
	 */
	function testManualTimeSheetDailyOverTimePolicyA() {
		global $dd;

		$policy_ids['pay_formula_policy'][] = $this->createPayFormulaPolicy( $this->company_id, 200 ); //OT1.5
		$policy_ids['pay_formula_policy'][] = $this->createPayFormulaPolicy( $this->company_id, 210 ); //OT2.0
		$policy_ids['pay_formula_policy'][] = $this->createPayFormulaPolicy( $this->company_id, 220 ); //OT2.5

		$policy_ids['pay_code'][] = $this->createPayCode( $this->company_id, 100, $policy_ids['pay_formula_policy'][0] );
		$policy_ids['pay_code'][] = $this->createPayCode( $this->company_id, 110, $policy_ids['pay_formula_policy'][1] );
		$policy_ids['pay_code'][] = $this->createPayCode( $this->company_id, 120, $policy_ids['pay_formula_policy'][2] );

		$policy_ids['overtime'][] = $this->createOverTimePolicy( $this->company_id, 100, $this->policy_ids['contributing_shift_policy'][12], $policy_ids['pay_code'][0] );
		$policy_ids['overtime'][] = $this->createOverTimePolicy( $this->company_id, 110, $this->policy_ids['contributing_shift_policy'][12], $policy_ids['pay_code'][1] );
		$policy_ids['overtime'][] = $this->createOverTimePolicy( $this->company_id, 120, $this->policy_ids['contributing_shift_policy'][12], $policy_ids['pay_code'][2] );

		//Create Policy Group
		$dd->createPolicyGroup( $this->company_id,
								null, //Meal
								null, //Exception
								null, //Holiday
								$policy_ids['overtime'], //OT
								null, //Premium
								null, //Round
								[ $this->user_id ], //Users
								null, //Break
								null, //Accrual
								null, //Expense
								null, //Absence
								[ $this->policy_ids['regular'][12] ] //Regular
		);


		$date_epoch = TTDate::getMiddleDayEpoch( TTDate::getBeginWeekEpoch( time(), 1 ) );                  //Start on Monday to avoid problems with Sunday and DST which over.
		$date_stamp = TTDate::getDate( 'DATE', $date_epoch );

		$dd->createUserDateTotal( $this->user_id, $date_epoch, ( 3600 * 12 ), $this->branch_ids[0] );

		$udt_arr = $this->getUserDateTotalArray( $date_epoch, $date_epoch );
		//print_r($udt_arr);

		//Total Time
		$this->assertEquals( 5, $udt_arr[$date_epoch][0]['object_type_id'] );                               //5=System Total
		$this->assertEquals( $udt_arr[$date_epoch][0]['pay_code_id'], TTUUID::getZeroID() );
		$this->assertEquals( $udt_arr[$date_epoch][0]['total_time'], ( 12 * 3600 ) );
		$this->assertEquals( false, $udt_arr[$date_epoch][0]['start_time_stamp'] );
		$this->assertEquals( false, $udt_arr[$date_epoch][0]['end_time_stamp'] );
		$this->assertEquals( 0, $udt_arr[$date_epoch][0]['hourly_rate'] );
		$this->assertEquals( 0, $udt_arr[$date_epoch][0]['hourly_rate_with_burden'] );
		//Regular Time
		$this->assertEquals( 20, $udt_arr[$date_epoch][1]['object_type_id'] );                              //Regular Time
		$this->assertEquals( $udt_arr[$date_epoch][1]['pay_code_id'], $this->policy_ids['pay_code'][100] ); //Regular Time
		$this->assertEquals( $udt_arr[$date_epoch][1]['total_time'], ( 8 * 3600 ) );
		$this->assertEquals( $udt_arr[$date_epoch][1]['start_time_stamp'], strtotime( $date_stamp . ' 12:00AM' ) );
		$this->assertEquals( $udt_arr[$date_epoch][1]['end_time_stamp'], strtotime( $date_stamp . ' 8:00AM' ) );
		$this->assertEquals( $udt_arr[$date_epoch][1]['hourly_rate'], ( 1 * 21.50 ) );
		$this->assertEquals( $udt_arr[$date_epoch][1]['hourly_rate_with_burden'], ( 1 * 21.50 * 1.135 ) ); //13.5%
		//Overtime 1
		$this->assertEquals( 30, $udt_arr[$date_epoch][4]['object_type_id'] );                             //OverTime
		$this->assertEquals( $udt_arr[$date_epoch][4]['pay_code_id'], $policy_ids['pay_code'][0] );
		$this->assertEquals( $udt_arr[$date_epoch][4]['total_time'], ( 1 * 3600 ) );
		$this->assertEquals( $udt_arr[$date_epoch][4]['start_time_stamp'], strtotime( $date_stamp . ' 8:00AM' ) );
		$this->assertEquals( $udt_arr[$date_epoch][4]['end_time_stamp'], strtotime( $date_stamp . ' 9:00AM' ) );
		$this->assertEquals( $udt_arr[$date_epoch][4]['hourly_rate'], ( 1.5 * 21.50 ) );
		$this->assertEquals( Misc::MoneyRound( $udt_arr[$date_epoch][4]['hourly_rate_with_burden'] ), Misc::MoneyRound( ( 1.5 * 21.50 * 1.135 ) ) ); //13.5%
		//Overtime 2
		$this->assertEquals( 30, $udt_arr[$date_epoch][3]['object_type_id'] );                                                                                       //OverTime
		$this->assertEquals( $udt_arr[$date_epoch][3]['pay_code_id'], $policy_ids['pay_code'][1] );
		$this->assertEquals( $udt_arr[$date_epoch][3]['total_time'], ( 1 * 3600 ) );
		$this->assertEquals( $udt_arr[$date_epoch][3]['start_time_stamp'], strtotime( $date_stamp . ' 9:00AM' ) );
		$this->assertEquals( $udt_arr[$date_epoch][3]['end_time_stamp'], strtotime( $date_stamp . ' 10:00AM' ) );
		$this->assertEquals( $udt_arr[$date_epoch][3]['hourly_rate'], ( 2.0 * 21.50 ) );
		$this->assertEquals( $udt_arr[$date_epoch][3]['hourly_rate_with_burden'], ( 2.0 * 21.50 * 1.135 ) ); //13.5%
		//Overtime 3
		$this->assertEquals( 30, $udt_arr[$date_epoch][2]['object_type_id'] );                               //OverTime
		$this->assertEquals( $udt_arr[$date_epoch][2]['pay_code_id'], $policy_ids['pay_code'][2] );
		$this->assertEquals( $udt_arr[$date_epoch][2]['total_time'], ( 2 * 3600 ) );
		$this->assertEquals( $udt_arr[$date_epoch][2]['start_time_stamp'], strtotime( $date_stamp . ' 10:00AM' ) );
		$this->assertEquals( $udt_arr[$date_epoch][2]['end_time_stamp'], strtotime( $date_stamp . ' 12:00PM' ) );
		$this->assertEquals( $udt_arr[$date_epoch][2]['hourly_rate'], ( 2.5 * 21.50 ) );
		$this->assertEquals( Misc::MoneyRound( $udt_arr[$date_epoch][2]['hourly_rate_with_burden'] ), Misc::MoneyRound( ( 2.5 * 21.50 * 1.135 ) ) ); //13.5%

		//Make sure no other hours
		$this->assertCount( 5, $udt_arr[$date_epoch] );

		return true;
	}

	/**
	 * @group OvertimePolicy_testManualTimeSheetDailyOverTimePolicyB
	 */
	function testManualTimeSheetDailyOverTimePolicyB() {
		global $dd;

		$policy_ids['pay_formula_policy'][] = $this->createPayFormulaPolicy( $this->company_id, 200 ); //OT1.5
		$policy_ids['pay_formula_policy'][] = $this->createPayFormulaPolicy( $this->company_id, 210 ); //OT2.0
		$policy_ids['pay_formula_policy'][] = $this->createPayFormulaPolicy( $this->company_id, 220 ); //OT2.5

		$policy_ids['pay_code'][] = $this->createPayCode( $this->company_id, 100, $policy_ids['pay_formula_policy'][0] );
		$policy_ids['pay_code'][] = $this->createPayCode( $this->company_id, 110, $policy_ids['pay_formula_policy'][1] );
		$policy_ids['pay_code'][] = $this->createPayCode( $this->company_id, 120, $policy_ids['pay_formula_policy'][2] );

		$policy_ids['overtime'][] = $this->createOverTimePolicy( $this->company_id, 100, $this->policy_ids['contributing_shift_policy'][12], $policy_ids['pay_code'][0] );
		$policy_ids['overtime'][] = $this->createOverTimePolicy( $this->company_id, 110, $this->policy_ids['contributing_shift_policy'][12], $policy_ids['pay_code'][1] );
		$policy_ids['overtime'][] = $this->createOverTimePolicy( $this->company_id, 120, $this->policy_ids['contributing_shift_policy'][12], $policy_ids['pay_code'][2] );

		//Create Policy Group
		$dd->createPolicyGroup( $this->company_id,
								null, //Meal
								null, //Exception
								null, //Holiday
								$policy_ids['overtime'], //OT
								null, //Premium
								null, //Round
								[ $this->user_id ], //Users
								null, //Break
								null, //Accrual
								null, //Expense
								null, //Absence
								[ $this->policy_ids['regular'][12] ] //Regular
		);


		$date_epoch = TTDate::getMiddleDayEpoch( TTDate::getBeginWeekEpoch( time(), 1 ) );                  //Start on Monday to avoid problems with Sunday and DST which over.
		$date_stamp = TTDate::getDate( 'DATE', $date_epoch );

		$dd->createUserDateTotal( $this->user_id, $date_epoch, ( 3600 * 2 ), $this->branch_ids[0] );
		$dd->createUserDateTotal( $this->user_id, $date_epoch, ( 3600 * 11 ), $this->branch_ids[1] );

		$udt_arr = $this->getUserDateTotalArray( $date_epoch, $date_epoch );
		//print_r($udt_arr);

		//Total Time
		$this->assertEquals( 5, $udt_arr[$date_epoch][0]['object_type_id'] );                               //5=System Total
		$this->assertEquals( $udt_arr[$date_epoch][0]['pay_code_id'], TTUUID::getZeroID() );
		$this->assertEquals( $udt_arr[$date_epoch][0]['total_time'], ( 13 * 3600 ) );
		$this->assertEquals( false, $udt_arr[$date_epoch][0]['start_time_stamp'] );
		$this->assertEquals( false, $udt_arr[$date_epoch][0]['end_time_stamp'] );
		$this->assertEquals( 0, $udt_arr[$date_epoch][0]['hourly_rate'] );
		$this->assertEquals( 0, $udt_arr[$date_epoch][0]['hourly_rate_with_burden'] );
		//Regular Time - Branch0
		$this->assertEquals( 20, $udt_arr[$date_epoch][1]['object_type_id'] );                              //Regular Time
		$this->assertEquals( $udt_arr[$date_epoch][1]['pay_code_id'], $this->policy_ids['pay_code'][100] ); //Regular Time
		$this->assertEquals( $udt_arr[$date_epoch][1]['total_time'], ( 2 * 3600 ) );
		$this->assertEquals( $udt_arr[$date_epoch][1]['start_time_stamp'], strtotime( $date_stamp . ' 12:00AM' ) );
		$this->assertEquals( $udt_arr[$date_epoch][1]['end_time_stamp'], strtotime( $date_stamp . ' 2:00AM' ) );
		$this->assertEquals( $udt_arr[$date_epoch][1]['hourly_rate'], ( 1 * 21.50 ) );
		$this->assertEquals( $udt_arr[$date_epoch][1]['hourly_rate_with_burden'], ( 1 * 21.50 * 1.135 ) );  //13.5%
		//Regular Time - Branch1
		$this->assertEquals( 20, $udt_arr[$date_epoch][2]['object_type_id'] );                              //Regular Time
		$this->assertEquals( $udt_arr[$date_epoch][2]['pay_code_id'], $this->policy_ids['pay_code'][100] ); //Regular Time
		$this->assertEquals( $udt_arr[$date_epoch][2]['total_time'], ( 6 * 3600 ) );
		$this->assertEquals( $udt_arr[$date_epoch][2]['start_time_stamp'], strtotime( $date_stamp . ' 2:00AM' ) );
		$this->assertEquals( $udt_arr[$date_epoch][2]['end_time_stamp'], strtotime( $date_stamp . ' 8:00AM' ) );
		$this->assertEquals( $udt_arr[$date_epoch][2]['hourly_rate'], ( 1 * 21.50 ) );
		$this->assertEquals( $udt_arr[$date_epoch][2]['hourly_rate_with_burden'], ( 1 * 21.50 * 1.135 ) ); //13.5%
		//Overtime 3 (>10)
		$this->assertEquals( 30, $udt_arr[$date_epoch][3]['object_type_id'] );                             //OverTime
		$this->assertEquals( $udt_arr[$date_epoch][3]['pay_code_id'], $policy_ids['pay_code'][2] );
		$this->assertEquals( $udt_arr[$date_epoch][3]['total_time'], ( 3 * 3600 ) );
		$this->assertEquals( $udt_arr[$date_epoch][3]['start_time_stamp'], strtotime( $date_stamp . ' 10:00AM' ) );
		$this->assertEquals( $udt_arr[$date_epoch][3]['end_time_stamp'], strtotime( $date_stamp . ' 1:00PM' ) );
		$this->assertEquals( $udt_arr[$date_epoch][3]['hourly_rate'], ( 2.5 * 21.50 ) );
		$this->assertEquals( Misc::MoneyRound( $udt_arr[$date_epoch][3]['hourly_rate_with_burden'] ), Misc::MoneyRound( ( 2.5 * 21.50 * 1.135 ) ) ); //13.5%
		//Overtime 2 (>9)
		$this->assertEquals( 30, $udt_arr[$date_epoch][4]['object_type_id'] );                                                                         //OverTime
		$this->assertEquals( $udt_arr[$date_epoch][4]['pay_code_id'], $policy_ids['pay_code'][1] );
		$this->assertEquals( $udt_arr[$date_epoch][4]['total_time'], ( 1 * 3600 ) );
		$this->assertEquals( $udt_arr[$date_epoch][4]['start_time_stamp'], strtotime( $date_stamp . ' 9:00AM' ) );
		$this->assertEquals( $udt_arr[$date_epoch][4]['end_time_stamp'], strtotime( $date_stamp . ' 10:00AM' ) );
		$this->assertEquals( $udt_arr[$date_epoch][4]['hourly_rate'], ( 2.0 * 21.50 ) );
		$this->assertEquals( $udt_arr[$date_epoch][4]['hourly_rate_with_burden'], ( 2.0 * 21.50 * 1.135 ) ); //13.5%
		//Overtime 1 (>8)
		$this->assertEquals( 30, $udt_arr[$date_epoch][5]['object_type_id'] );                               //OverTime
		$this->assertEquals( $udt_arr[$date_epoch][5]['pay_code_id'], $policy_ids['pay_code'][0] );
		$this->assertEquals( $udt_arr[$date_epoch][5]['total_time'], ( 1 * 3600 ) );
		$this->assertEquals( $udt_arr[$date_epoch][5]['start_time_stamp'], strtotime( $date_stamp . ' 8:00AM' ) );
		$this->assertEquals( $udt_arr[$date_epoch][5]['end_time_stamp'], strtotime( $date_stamp . ' 9:00AM' ) );
		$this->assertEquals( $udt_arr[$date_epoch][5]['hourly_rate'], ( 1.5 * 21.50 ) );
		$this->assertEquals( Misc::MoneyRound( $udt_arr[$date_epoch][5]['hourly_rate_with_burden'] ), Misc::MoneyRound( ( 1.5 * 21.50 * 1.135 ) ) ); //13.5%

		//Make sure no other hours
		$this->assertCount( 6, $udt_arr[$date_epoch] );

		return true;
	}

	/**
	 * @group OvertimePolicy_testManualTimeSheetDailyOverTimePolicyC
	 */
	function testManualTimeSheetDailyOverTimePolicyC() {
		global $dd;

		$policy_ids['pay_formula_policy'][] = $this->createPayFormulaPolicy( $this->company_id, 200 ); //OT1.5
		$policy_ids['pay_formula_policy'][] = $this->createPayFormulaPolicy( $this->company_id, 210 ); //OT2.0
		$policy_ids['pay_formula_policy'][] = $this->createPayFormulaPolicy( $this->company_id, 220 ); //OT2.5

		$policy_ids['pay_code'][] = $this->createPayCode( $this->company_id, 100, $policy_ids['pay_formula_policy'][0] );
		$policy_ids['pay_code'][] = $this->createPayCode( $this->company_id, 110, $policy_ids['pay_formula_policy'][1] );
		$policy_ids['pay_code'][] = $this->createPayCode( $this->company_id, 120, $policy_ids['pay_formula_policy'][2] );

		$policy_ids['overtime'][] = $this->createOverTimePolicy( $this->company_id, 100, $this->policy_ids['contributing_shift_policy'][12], $policy_ids['pay_code'][0] );
		$policy_ids['overtime'][] = $this->createOverTimePolicy( $this->company_id, 110, $this->policy_ids['contributing_shift_policy'][12], $policy_ids['pay_code'][1] );
		$policy_ids['overtime'][] = $this->createOverTimePolicy( $this->company_id, 120, $this->policy_ids['contributing_shift_policy'][12], $policy_ids['pay_code'][2] );

		//Create Policy Group
		$dd->createPolicyGroup( $this->company_id,
								null, //Meal
								null, //Exception
								null, //Holiday
								$policy_ids['overtime'], //OT
								null, //Premium
								null, //Round
								[ $this->user_id ], //Users
								null, //Break
								null, //Accrual
								null, //Expense
								null, //Absence
								[ $this->policy_ids['regular'][12] ] //Regular
		);


		$date_epoch = TTDate::getMiddleDayEpoch( TTDate::getBeginWeekEpoch( time() ) );
		$date_stamp = TTDate::getDate( 'DATE', $date_epoch );

		//$dd->createUserDateTotal( $this->user_id, $date_epoch, (3600 * 2), $this->branch_ids[0] );
		$dd->createPunchPair( $this->user_id,
							  strtotime( $date_stamp . ' 8:00AM' ),
							  strtotime( $date_stamp . ' 10:00AM' ),
							  [
									  'in_type_id'    => 10,
									  'out_type_id'   => 10,
									  'branch_id'     => $this->branch_ids[0],
									  'department_id' => 0,
									  'job_id'        => 0,
									  'job_item_id'   => 0,
									  'punch_tag_id'  => []
							  ],
							  true
		);

		$dd->createUserDateTotal( $this->user_id, $date_epoch, ( 3600 * 11 ), $this->branch_ids[1] );

		$udt_arr = $this->getUserDateTotalArray( $date_epoch, $date_epoch );
		//print_r($udt_arr);

		//Total Time
		$this->assertEquals( 5, $udt_arr[$date_epoch][0]['object_type_id'] );                          //5=System Total
		$this->assertEquals( $udt_arr[$date_epoch][0]['pay_code_id'], TTUUID::getZeroID() );
		$this->assertEquals( $udt_arr[$date_epoch][0]['total_time'], ( 13 * 3600 ) );
		$this->assertEquals( $udt_arr[$date_epoch][0]['start_time_stamp'], strtotime( $date_stamp . ' 8:00AM' ) ); //Punch Start time
		$this->assertEquals( $udt_arr[$date_epoch][0]['end_time_stamp'], strtotime( $date_stamp . ' 10:00AM' ) );  //Punch End Time
		$this->assertEquals( 0, $udt_arr[$date_epoch][0]['hourly_rate'] );
		$this->assertEquals( 0, $udt_arr[$date_epoch][0]['hourly_rate_with_burden'] );
		//Regular Time - Branch0
		$this->assertEquals( 20, $udt_arr[$date_epoch][1]['object_type_id'] );                                     //Regular Time
		$this->assertEquals( $udt_arr[$date_epoch][1]['pay_code_id'], $this->policy_ids['pay_code'][100] );        //Regular Time
		$this->assertEquals( $udt_arr[$date_epoch][1]['total_time'], ( 2 * 3600 ) );
		$this->assertEquals( $udt_arr[$date_epoch][1]['start_time_stamp'], strtotime( $date_stamp . ' 8:00AM' ) );
		$this->assertEquals( $udt_arr[$date_epoch][1]['end_time_stamp'], strtotime( $date_stamp . ' 10:00AM' ) );
		$this->assertEquals( $udt_arr[$date_epoch][1]['hourly_rate'], ( 1 * 21.50 ) );
		$this->assertEquals( $udt_arr[$date_epoch][1]['hourly_rate_with_burden'], ( 1 * 21.50 * 1.135 ) );  //13.5%
		//Regular Time - Branch1
		$this->assertEquals( 20, $udt_arr[$date_epoch][2]['object_type_id'] );                              //Regular Time
		$this->assertEquals( $udt_arr[$date_epoch][2]['pay_code_id'], $this->policy_ids['pay_code'][100] ); //Regular Time
		$this->assertEquals( $udt_arr[$date_epoch][2]['total_time'], ( 6 * 3600 ) );
		$this->assertEquals( $udt_arr[$date_epoch][2]['start_time_stamp'], strtotime( $date_stamp . ' 10:00AM' ) );
		$this->assertEquals( $udt_arr[$date_epoch][2]['end_time_stamp'], strtotime( $date_stamp . ' 4:00PM' ) );
		$this->assertEquals( $udt_arr[$date_epoch][2]['hourly_rate'], ( 1 * 21.50 ) );
		$this->assertEquals( $udt_arr[$date_epoch][2]['hourly_rate_with_burden'], ( 1 * 21.50 * 1.135 ) ); //13.5%

		//Overtime 3 (>10)
		$this->assertEquals( 30, $udt_arr[$date_epoch][3]['object_type_id'] );                             //OverTime
		$this->assertEquals( $udt_arr[$date_epoch][3]['pay_code_id'], $policy_ids['pay_code'][2] );
		$this->assertEquals( $udt_arr[$date_epoch][3]['total_time'], ( 3 * 3600 ) );
		$this->assertEquals( $udt_arr[$date_epoch][3]['start_time_stamp'], strtotime( $date_stamp . ' 6:00PM' ) );
		$this->assertEquals( $udt_arr[$date_epoch][3]['end_time_stamp'], strtotime( $date_stamp . ' 9:00PM' ) );
		$this->assertEquals( $udt_arr[$date_epoch][3]['hourly_rate'], ( 2.5 * 21.50 ) );
		$this->assertEquals( Misc::MoneyRound( $udt_arr[$date_epoch][3]['hourly_rate_with_burden'] ), Misc::MoneyRound( ( 2.5 * 21.50 * 1.135 ) ) ); //13.5%
		//Overtime 2 (>9)
		$this->assertEquals( 30, $udt_arr[$date_epoch][4]['object_type_id'] );                                                                         //OverTime
		$this->assertEquals( $udt_arr[$date_epoch][4]['pay_code_id'], $policy_ids['pay_code'][1] );
		$this->assertEquals( $udt_arr[$date_epoch][4]['total_time'], ( 1 * 3600 ) );
		$this->assertEquals( $udt_arr[$date_epoch][4]['start_time_stamp'], strtotime( $date_stamp . ' 5:00PM' ) );
		$this->assertEquals( $udt_arr[$date_epoch][4]['end_time_stamp'], strtotime( $date_stamp . ' 6:00PM' ) );
		$this->assertEquals( $udt_arr[$date_epoch][4]['hourly_rate'], ( 2.0 * 21.50 ) );
		$this->assertEquals( $udt_arr[$date_epoch][4]['hourly_rate_with_burden'], ( 2.0 * 21.50 * 1.135 ) ); //13.5%
		//Overtime 1 (>8)
		$this->assertEquals( 30, $udt_arr[$date_epoch][5]['object_type_id'] );                               //OverTime
		$this->assertEquals( $udt_arr[$date_epoch][5]['pay_code_id'], $policy_ids['pay_code'][0] );
		$this->assertEquals( $udt_arr[$date_epoch][5]['total_time'], ( 1 * 3600 ) );
		$this->assertEquals( $udt_arr[$date_epoch][5]['start_time_stamp'], strtotime( $date_stamp . ' 4:00PM' ) );
		$this->assertEquals( $udt_arr[$date_epoch][5]['end_time_stamp'], strtotime( $date_stamp . ' 5:00PM' ) );
		$this->assertEquals( $udt_arr[$date_epoch][5]['hourly_rate'], ( 1.5 * 21.50 ) );
		$this->assertEquals( Misc::MoneyRound( $udt_arr[$date_epoch][5]['hourly_rate_with_burden'] ), Misc::MoneyRound( ( 1.5 * 21.50 * 1.135 ) ) ); //13.5%

		//Make sure no other hours
		$this->assertCount( 6, $udt_arr[$date_epoch] );

		return true;
	}

	/**
	 * @group OvertimePolicy_testManualTimeSheetWeeklyOverTimePolicyA
	 */
	function testManualTimeSheetWeeklyOverTimePolicyA() {
		global $dd;

		$policy_ids['pay_formula_policy'][] = $this->createPayFormulaPolicy( $this->company_id, 200 );      //OT1.5
		$policy_ids['pay_formula_policy'][] = $this->createPayFormulaPolicy( $this->company_id, 210 );      //OT2.0
		$policy_ids['pay_formula_policy'][] = $this->createPayFormulaPolicy( $this->company_id, 220 );      //OT2.5

		$policy_ids['pay_code'][] = $this->createPayCode( $this->company_id, 200, $policy_ids['pay_formula_policy'][0] );
		$policy_ids['pay_code'][] = $this->createPayCode( $this->company_id, 210, $policy_ids['pay_formula_policy'][1] );
		$policy_ids['pay_code'][] = $this->createPayCode( $this->company_id, 220, $policy_ids['pay_formula_policy'][2] );

		$policy_ids['overtime'][] = $this->createOverTimePolicy( $this->company_id, 200, $this->policy_ids['contributing_shift_policy'][12], $policy_ids['pay_code'][0] );
		$policy_ids['overtime'][] = $this->createOverTimePolicy( $this->company_id, 210, $this->policy_ids['contributing_shift_policy'][12], $policy_ids['pay_code'][1] );
		$policy_ids['overtime'][] = $this->createOverTimePolicy( $this->company_id, 220, $this->policy_ids['contributing_shift_policy'][12], $policy_ids['pay_code'][2] );
		//print_r($policy_ids['overtime']);

		//Create Policy Group
		$dd->createPolicyGroup( $this->company_id,
								null, //Meal
								null, //Exception
								null, //Holiday
								$policy_ids['overtime'], //OT
								null, //Premium
								null, //Round
								[ $this->user_id ], //Users
								null, //Break
								null, //Accrual
								null, //Expense
								null, //Absence
								[ $this->policy_ids['regular'][12] ] //Regular
		);

		$date_epoch = TTDate::getMiddleDayEpoch( TTDate::getBeginWeekEpoch( time() ) );
		$date_stamp = TTDate::getDate( 'DATE', $date_epoch );

		//
		//Day of Week: 1
		//
		$dd->createUserDateTotal( $this->user_id, $date_epoch, ( 3600 * 12 ), 0 );

		$udt_arr = $this->getUserDateTotalArray( $date_epoch, $date_epoch );
		//print_r($udt_arr);
		//Total Time
		$this->assertEquals( 5, $udt_arr[$date_epoch][0]['object_type_id'] );                               //5=System Total
		$this->assertEquals( $udt_arr[$date_epoch][0]['pay_code_id'], TTUUID::getZeroID() );
		$this->assertEquals( $udt_arr[$date_epoch][0]['total_time'], ( 12 * 3600 ) );
		$this->assertEquals( false, $udt_arr[$date_epoch][0]['start_time_stamp'] );
		$this->assertEquals( false, $udt_arr[$date_epoch][0]['end_time_stamp'] );
		//Regular Time
		$this->assertEquals( 20, $udt_arr[$date_epoch][1]['object_type_id'] );                              //Regular Time
		$this->assertEquals( $udt_arr[$date_epoch][1]['pay_code_id'], $this->policy_ids['pay_code'][100] ); //Regular Time
		$this->assertEquals( $udt_arr[$date_epoch][1]['total_time'], ( 12 * 3600 ) );
		$this->assertEquals( $udt_arr[$date_epoch][1]['start_time_stamp'], strtotime( $date_stamp . ' 12:00AM' ) );                                                                                                      //Punch Start time
		$this->assertEquals( $udt_arr[$date_epoch][1]['end_time_stamp'], strtotime( $date_stamp . ' 12:00PM' ) + TTDate::getDSTOffset( strtotime( $date_stamp . ' 12:00AM' ), strtotime( $date_stamp . ' 12:00PM' ) ) ); //Punch End Time - Account for DST change as well.
		//Make sure no other hours
		$this->assertCount( 2, $udt_arr[$date_epoch] );

		//
		//Day of Week: 2
		//
		$date_epoch = TTDate::incrementDate( TTDate::getMiddleDayEpoch( TTDate::getBeginWeekEpoch( time() ) ), 1, 'day' );
		$date_stamp = TTDate::getDate( 'DATE', $date_epoch );

		$dd->createUserDateTotal( $this->user_id, $date_epoch, ( 3600 * 12 ), 0 );

		$udt_arr = $this->getUserDateTotalArray( $date_epoch, $date_epoch );
		//Total Time
		$this->assertEquals( 5, $udt_arr[$date_epoch][0]['object_type_id'] );                                                                                                                                            //5=System Total
		$this->assertEquals( $udt_arr[$date_epoch][0]['pay_code_id'], TTUUID::getZeroID() );
		$this->assertEquals( $udt_arr[$date_epoch][0]['total_time'], ( 12 * 3600 ) );
		$this->assertEquals( false, $udt_arr[$date_epoch][0]['start_time_stamp'] );
		$this->assertEquals( false, $udt_arr[$date_epoch][0]['end_time_stamp'] );
		//Regular Time
		$this->assertEquals( 20, $udt_arr[$date_epoch][1]['object_type_id'] );                                                                                                                                           //Regular Time
		$this->assertEquals( $udt_arr[$date_epoch][1]['pay_code_id'], $this->policy_ids['pay_code'][100] );                                                                                                              //Regular Time
		$this->assertEquals( $udt_arr[$date_epoch][1]['total_time'], ( 12 * 3600 ) );
		$this->assertEquals( $udt_arr[$date_epoch][1]['start_time_stamp'], strtotime( $date_stamp . ' 12:00AM' ) ); //Punch Start time
		$this->assertEquals( $udt_arr[$date_epoch][1]['end_time_stamp'], strtotime( $date_stamp . ' 12:00PM' ) );   //Punch End Time
		//Make sure no other hours
		$this->assertCount( 2, $udt_arr[$date_epoch] );

		//
		//Day of Week: 3
		//
		$date_epoch = TTDate::incrementDate( TTDate::getMiddleDayEpoch( TTDate::getBeginWeekEpoch( time() ) ), 2, 'day' );
		$date_stamp = TTDate::getDate( 'DATE', $date_epoch );

		$dd->createUserDateTotal( $this->user_id, $date_epoch, ( 3600 * 12 ), 0 );

		$udt_arr = $this->getUserDateTotalArray( $date_epoch, $date_epoch );
		//Total Time
		$this->assertEquals( 5, $udt_arr[$date_epoch][0]['object_type_id'] );                                       //5=System Total
		$this->assertEquals( $udt_arr[$date_epoch][0]['pay_code_id'], TTUUID::getZeroID() );
		$this->assertEquals( $udt_arr[$date_epoch][0]['total_time'], ( 12 * 3600 ) );
		$this->assertEquals( false, $udt_arr[$date_epoch][0]['start_time_stamp'] );
		$this->assertEquals( false, $udt_arr[$date_epoch][0]['end_time_stamp'] );
		//Regular Time
		$this->assertEquals( 20, $udt_arr[$date_epoch][1]['object_type_id'] );                                      //Regular Time
		$this->assertEquals( $udt_arr[$date_epoch][1]['pay_code_id'], $this->policy_ids['pay_code'][100] );         //Regular Time
		$this->assertEquals( $udt_arr[$date_epoch][1]['total_time'], ( 12 * 3600 ) );
		$this->assertEquals( $udt_arr[$date_epoch][1]['start_time_stamp'], strtotime( $date_stamp . ' 12:00AM' ) ); //Punch Start time
		$this->assertEquals( $udt_arr[$date_epoch][1]['end_time_stamp'], strtotime( $date_stamp . ' 12:00PM' ) );   //Punch End Time
		//Make sure no other hours
		$this->assertCount( 2, $udt_arr[$date_epoch] );

		//
		//Day of Week: 4
		//
		$date_epoch = TTDate::incrementDate( TTDate::getMiddleDayEpoch( TTDate::getBeginWeekEpoch( time() ) ), 3, 'day' );
		$date_stamp = TTDate::getDate( 'DATE', $date_epoch );

		$dd->createUserDateTotal( $this->user_id, $date_epoch, ( 3600 * 12 ), 0 );

		$udt_arr = $this->getUserDateTotalArray( $date_epoch, $date_epoch );
		//print_r($udt_arr);
		//Total Time
		$this->assertEquals( 5, $udt_arr[$date_epoch][0]['object_type_id'] );                                       //5=System Total
		$this->assertEquals( $udt_arr[$date_epoch][0]['pay_code_id'], TTUUID::getZeroID() );
		$this->assertEquals( $udt_arr[$date_epoch][0]['total_time'], ( 12 * 3600 ) );
		$this->assertEquals( false, $udt_arr[$date_epoch][0]['start_time_stamp'] );
		$this->assertEquals( false, $udt_arr[$date_epoch][0]['end_time_stamp'] );
		//Regular Time
		$this->assertEquals( 20, $udt_arr[$date_epoch][1]['object_type_id'] );                                      //Regular Time
		$this->assertEquals( $udt_arr[$date_epoch][1]['pay_code_id'], $this->policy_ids['pay_code'][100] );         //Regular Time
		$this->assertEquals( $udt_arr[$date_epoch][1]['total_time'], ( 11 * 3600 ) );
		$this->assertEquals( $udt_arr[$date_epoch][1]['start_time_stamp'], strtotime( $date_stamp . ' 12:00AM' ) ); //Punch Start time
		$this->assertEquals( $udt_arr[$date_epoch][1]['end_time_stamp'], strtotime( $date_stamp . ' 11:00AM' ) );   //Punch End Time
		//Overtime 1
		$this->assertEquals( 30, $udt_arr[$date_epoch][2]['object_type_id'] );                                      //OverTime
		$this->assertEquals( $udt_arr[$date_epoch][2]['pay_code_id'], $policy_ids['pay_code'][0] );
		$this->assertEquals( $udt_arr[$date_epoch][2]['total_time'], ( 1 * 3600 ) );
		$this->assertEquals( $udt_arr[$date_epoch][2]['start_time_stamp'], strtotime( $date_stamp . ' 11:00AM' ) ); //Punch Start time
		$this->assertEquals( $udt_arr[$date_epoch][2]['end_time_stamp'], strtotime( $date_stamp . ' 12:00PM' ) );   //Punch End Time
		//Make sure no other hours
		$this->assertCount( 3, $udt_arr[$date_epoch] );

		//
		//Day of Week: 5
		//
		$date_epoch = TTDate::incrementDate( TTDate::getMiddleDayEpoch( TTDate::getBeginWeekEpoch( time() ) ), 4, 'day' );
		$date_stamp = TTDate::getDate( 'DATE', $date_epoch );

		$dd->createUserDateTotal( $this->user_id, $date_epoch, ( 3600 * 12 ), 0 );

		$udt_arr = $this->getUserDateTotalArray( $date_epoch, $date_epoch );
		//print_r($udt_arr);
		//Total Time
		$this->assertEquals( 5, $udt_arr[$date_epoch][0]['object_type_id'] );                                       //5=System Total
		$this->assertEquals( $udt_arr[$date_epoch][0]['pay_code_id'], TTUUID::getZeroID() );
		$this->assertEquals( $udt_arr[$date_epoch][0]['total_time'], ( 12 * 3600 ) );
		$this->assertEquals( false, $udt_arr[$date_epoch][0]['start_time_stamp'] );
		$this->assertEquals( false, $udt_arr[$date_epoch][0]['end_time_stamp'] );
		//Overtime 1
		$this->assertEquals( 30, $udt_arr[$date_epoch][2]['object_type_id'] );                                      //OverTime
		$this->assertEquals( $udt_arr[$date_epoch][2]['pay_code_id'], $policy_ids['pay_code'][0] );
		$this->assertEquals( $udt_arr[$date_epoch][2]['total_time'], ( 11 * 3600 ) );
		$this->assertEquals( $udt_arr[$date_epoch][2]['start_time_stamp'], strtotime( $date_stamp . ' 12:00AM' ) ); //Punch Start time
		$this->assertEquals( $udt_arr[$date_epoch][2]['end_time_stamp'], strtotime( $date_stamp . ' 11:00AM' ) );   //Punch End Time
		//Overtime 2
		$this->assertEquals( 30, $udt_arr[$date_epoch][1]['object_type_id'] );                                      //OverTime
		$this->assertEquals( $udt_arr[$date_epoch][1]['pay_code_id'], $policy_ids['pay_code'][1] );
		$this->assertEquals( $udt_arr[$date_epoch][1]['total_time'], ( 1 * 3600 ) );
		$this->assertEquals( $udt_arr[$date_epoch][1]['start_time_stamp'], strtotime( $date_stamp . ' 11:00AM' ) ); //Punch Start time
		$this->assertEquals( $udt_arr[$date_epoch][1]['end_time_stamp'], strtotime( $date_stamp . ' 12:00PM' ) );   //Punch End Time

		//Make sure no other hours
		$this->assertCount( 3, $udt_arr[$date_epoch] );

		//
		//Day of Week: 6
		//
		$date_epoch = TTDate::incrementDate( TTDate::getMiddleDayEpoch( TTDate::getBeginWeekEpoch( time() ) ), 5, 'day' );
		$date_stamp = TTDate::getDate( 'DATE', $date_epoch );

		$dd->createUserDateTotal( $this->user_id, $date_epoch, ( 3600 * 12 ), 0 );

		$udt_arr = $this->getUserDateTotalArray( $date_epoch, $date_epoch );
		//print_r($udt_arr);
		//Total Time
		$this->assertEquals( 5, $udt_arr[$date_epoch][0]['object_type_id'] );                                       //5=System Total
		$this->assertEquals( $udt_arr[$date_epoch][0]['pay_code_id'], TTUUID::getZeroID() );
		$this->assertEquals( $udt_arr[$date_epoch][0]['total_time'], ( 12 * 3600 ) );
		$this->assertEquals( false, $udt_arr[$date_epoch][0]['start_time_stamp'] );
		$this->assertEquals( false, $udt_arr[$date_epoch][0]['end_time_stamp'] );
		//Overtime 1
		$this->assertEquals( 30, $udt_arr[$date_epoch][2]['object_type_id'] );                                      //OverTime
		$this->assertEquals( $udt_arr[$date_epoch][2]['pay_code_id'], $policy_ids['pay_code'][1] );
		$this->assertEquals( $udt_arr[$date_epoch][2]['total_time'], ( 11 * 3600 ) );
		$this->assertEquals( $udt_arr[$date_epoch][2]['start_time_stamp'], strtotime( $date_stamp . ' 12:00AM' ) ); //Punch Start time
		$this->assertEquals( $udt_arr[$date_epoch][2]['end_time_stamp'], strtotime( $date_stamp . ' 11:00AM' ) );   //Punch End Time
		//Overtime 2
		$this->assertEquals( 30, $udt_arr[$date_epoch][1]['object_type_id'] );                                      //OverTime
		$this->assertEquals( $udt_arr[$date_epoch][1]['pay_code_id'], $policy_ids['pay_code'][2] );
		$this->assertEquals( $udt_arr[$date_epoch][1]['total_time'], ( 1 * 3600 ) );
		$this->assertEquals( $udt_arr[$date_epoch][1]['start_time_stamp'], strtotime( $date_stamp . ' 11:00AM' ) ); //Punch Start time
		$this->assertEquals( $udt_arr[$date_epoch][1]['end_time_stamp'], strtotime( $date_stamp . ' 12:00PM' ) ); //Punch End Time
		//Make sure no other hours
		$this->assertCount( 3, $udt_arr[$date_epoch] );

		return true;
	}

	/**
	 * @group OvertimePolicy_testManualTimeSheetWeeklyOverTimePolicyB
	 */
	function testManualTimeSheetWeeklyOverTimePolicyB() {
		global $dd;

		$policy_ids['pay_formula_policy'][] = $this->createPayFormulaPolicy( $this->company_id, 200 ); //OT1.5
		$policy_ids['pay_formula_policy'][] = $this->createPayFormulaPolicy( $this->company_id, 210 ); //OT2.0
		$policy_ids['pay_formula_policy'][] = $this->createPayFormulaPolicy( $this->company_id, 220 ); //OT2.5

		$policy_ids['pay_code'][] = $this->createPayCode( $this->company_id, 200, $policy_ids['pay_formula_policy'][0] );
		$policy_ids['pay_code'][] = $this->createPayCode( $this->company_id, 210, $policy_ids['pay_formula_policy'][1] );
		$policy_ids['pay_code'][] = $this->createPayCode( $this->company_id, 220, $policy_ids['pay_formula_policy'][2] );

		$policy_ids['overtime'][] = $this->createOverTimePolicy( $this->company_id, 200, $this->policy_ids['contributing_shift_policy'][12], $policy_ids['pay_code'][0] );
		$policy_ids['overtime'][] = $this->createOverTimePolicy( $this->company_id, 210, $this->policy_ids['contributing_shift_policy'][12], $policy_ids['pay_code'][1] );
		$policy_ids['overtime'][] = $this->createOverTimePolicy( $this->company_id, 220, $this->policy_ids['contributing_shift_policy'][12], $policy_ids['pay_code'][2] );
		//print_r($policy_ids['overtime']);

		//Create Policy Group
		$dd->createPolicyGroup( $this->company_id,
								null, //Meal
								null, //Exception
								null, //Holiday
								$policy_ids['overtime'], //OT
								null, //Premium
								null, //Round
								[ $this->user_id ], //Users
								null, //Break
								null, //Accrual
								null, //Expense
								null, //Absence
								[ $this->policy_ids['regular'][12] ] //Regular
		);

		$date_epoch = TTDate::getMiddleDayEpoch( TTDate::getBeginWeekEpoch( time() ) );
		$date_stamp = TTDate::getDate( 'DATE', $date_epoch );

		//
		//Day of Week: 1
		//
		$dd->createPunchPair( $this->user_id,
							  strtotime( $date_stamp . ' 8:00AM' ),
							  strtotime( $date_stamp . ' 8:00PM' ),
							  [
									  'in_type_id'    => 10,
									  'out_type_id'   => 10,
									  'branch_id'     => 0,
									  'department_id' => 0,
									  'job_id'        => 0,
									  'job_item_id'   => 0,
									  'punch_tag_id'  => []
							  ],
							  true
		);
		$dd->createUserDateTotal( $this->user_id, $date_epoch, ( 3600 * 0 ), 0 ); //Create 0 hour manual timesheet entries.

		$udt_arr = $this->getUserDateTotalArray( $date_epoch, $date_epoch );
		//print_r($udt_arr);
		//Total Time
		$this->assertEquals( 5, $udt_arr[$date_epoch][0]['object_type_id'] );     //5=System Total
		$this->assertEquals( $udt_arr[$date_epoch][0]['pay_code_id'], TTUUID::getZeroID() );
		$this->assertEquals( $udt_arr[$date_epoch][0]['total_time'], ( 12 * 3600 ) );
		$this->assertEquals( $udt_arr[$date_epoch][0]['start_time_stamp'], strtotime( $date_stamp . ' 8:00AM' ) ); //Punch Start time
		$this->assertEquals( $udt_arr[$date_epoch][0]['end_time_stamp'], strtotime( $date_stamp . ' 8:00PM' ) );   //Punch End Time
		//Regular Time
		$this->assertEquals( 20, $udt_arr[$date_epoch][1]['object_type_id'] );                                     //Regular Time
		$this->assertEquals( $udt_arr[$date_epoch][1]['pay_code_id'], $this->policy_ids['pay_code'][100] );        //Regular Time
		$this->assertEquals( $udt_arr[$date_epoch][1]['total_time'], ( 12 * 3600 ) );
		$this->assertEquals( $udt_arr[$date_epoch][1]['start_time_stamp'], strtotime( $date_stamp . ' 8:00AM' ) ); //Punch Start time
		$this->assertEquals( $udt_arr[$date_epoch][1]['end_time_stamp'], strtotime( $date_stamp . ' 8:00PM' ) ); //Punch End Time
		//Make sure no other hours
		$this->assertCount( 2, $udt_arr[$date_epoch] );
		//
		//Day of Week: 2
		//
		$date_epoch = TTDate::incrementDate( TTDate::getMiddleDayEpoch( TTDate::getBeginWeekEpoch( time() ) ), 1, 'day' );
		$date_stamp = TTDate::getDate( 'DATE', $date_epoch );

		$dd->createPunchPair( $this->user_id,
							  strtotime( $date_stamp . ' 8:00AM' ),
							  strtotime( $date_stamp . ' 8:00PM' ),
							  [
									  'in_type_id'    => 10,
									  'out_type_id'   => 10,
									  'branch_id'     => 0,
									  'department_id' => 0,
									  'job_id'        => 0,
									  'job_item_id'   => 0,
									  'punch_tag_id'  => []
							  ],
							  true
		);
		$dd->createUserDateTotal( $this->user_id, $date_epoch, ( 3600 * 0 ), 0 ); //Create 0 hour manual timesheet entries.

		$udt_arr = $this->getUserDateTotalArray( $date_epoch, $date_epoch );
		//Total Time
		$this->assertEquals( 5, $udt_arr[$date_epoch][0]['object_type_id'] );     //5=System Total
		$this->assertEquals( $udt_arr[$date_epoch][0]['pay_code_id'], TTUUID::getZeroID() );
		$this->assertEquals( $udt_arr[$date_epoch][0]['total_time'], ( 12 * 3600 ) );
		$this->assertEquals( $udt_arr[$date_epoch][0]['start_time_stamp'], strtotime( $date_stamp . ' 8:00AM' ) ); //Punch Start time
		$this->assertEquals( $udt_arr[$date_epoch][0]['end_time_stamp'], strtotime( $date_stamp . ' 8:00PM' ) );   //Punch End Time
		//Regular Time
		$this->assertEquals( 20, $udt_arr[$date_epoch][1]['object_type_id'] );                                     //Regular Time
		$this->assertEquals( $udt_arr[$date_epoch][1]['pay_code_id'], $this->policy_ids['pay_code'][100] );        //Regular Time
		$this->assertEquals( $udt_arr[$date_epoch][1]['total_time'], ( 12 * 3600 ) );
		$this->assertEquals( $udt_arr[$date_epoch][1]['start_time_stamp'], strtotime( $date_stamp . ' 8:00AM' ) ); //Punch Start time
		$this->assertEquals( $udt_arr[$date_epoch][1]['end_time_stamp'], strtotime( $date_stamp . ' 8:00PM' ) ); //Punch End Time
		//Make sure no other hours
		$this->assertCount( 2, $udt_arr[$date_epoch] );

		//
		//Day of Week: 3
		//
		$date_epoch = TTDate::incrementDate( TTDate::getMiddleDayEpoch( TTDate::getBeginWeekEpoch( time() ) ), 2, 'day' );
		$date_stamp = TTDate::getDate( 'DATE', $date_epoch );

		$dd->createPunchPair( $this->user_id,
							  strtotime( $date_stamp . ' 8:00AM' ),
							  strtotime( $date_stamp . ' 8:00PM' ),
							  [
									  'in_type_id'    => 10,
									  'out_type_id'   => 10,
									  'branch_id'     => 0,
									  'department_id' => 0,
									  'job_id'        => 0,
									  'job_item_id'   => 0,
									  'punch_tag_id'  => []
							  ],
							  true
		);
		$dd->createUserDateTotal( $this->user_id, $date_epoch, ( 3600 * 0 ), 0 ); //Create 0 hour manual timesheet entries.

		$udt_arr = $this->getUserDateTotalArray( $date_epoch, $date_epoch );
		//Total Time
		$this->assertEquals( 5, $udt_arr[$date_epoch][0]['object_type_id'] );     //5=System Total
		$this->assertEquals( $udt_arr[$date_epoch][0]['pay_code_id'], TTUUID::getZeroID() );
		$this->assertEquals( $udt_arr[$date_epoch][0]['total_time'], ( 12 * 3600 ) );
		$this->assertEquals( $udt_arr[$date_epoch][0]['start_time_stamp'], strtotime( $date_stamp . ' 8:00AM' ) ); //Punch Start time
		$this->assertEquals( $udt_arr[$date_epoch][0]['end_time_stamp'], strtotime( $date_stamp . ' 8:00PM' ) );   //Punch End Time
		//Regular Time
		$this->assertEquals( 20, $udt_arr[$date_epoch][1]['object_type_id'] );                                     //Regular Time
		$this->assertEquals( $udt_arr[$date_epoch][1]['pay_code_id'], $this->policy_ids['pay_code'][100] );        //Regular Time
		$this->assertEquals( $udt_arr[$date_epoch][1]['total_time'], ( 12 * 3600 ) );
		$this->assertEquals( $udt_arr[$date_epoch][1]['start_time_stamp'], strtotime( $date_stamp . ' 8:00AM' ) ); //Punch Start time
		$this->assertEquals( $udt_arr[$date_epoch][1]['end_time_stamp'], strtotime( $date_stamp . ' 8:00PM' ) ); //Punch End Time
		//Make sure no other hours
		$this->assertCount( 2, $udt_arr[$date_epoch] );

		//
		//Day of Week: 4
		//
		$date_epoch = TTDate::incrementDate( TTDate::getMiddleDayEpoch( TTDate::getBeginWeekEpoch( time() ) ), 3, 'day' );
		$date_stamp = TTDate::getDate( 'DATE', $date_epoch );

		$dd->createPunchPair( $this->user_id,
							  strtotime( $date_stamp . ' 8:00AM' ),
							  strtotime( $date_stamp . ' 8:00PM' ),
							  [
									  'in_type_id'    => 10,
									  'out_type_id'   => 10,
									  'branch_id'     => 0,
									  'department_id' => 0,
									  'job_id'        => 0,
									  'job_item_id'   => 0,
									  'punch_tag_id'  => []
							  ],
							  true
		);
		$dd->createUserDateTotal( $this->user_id, $date_epoch, ( 3600 * 0 ), 0 ); //Create 0 hour manual timesheet entries.

		$udt_arr = $this->getUserDateTotalArray( $date_epoch, $date_epoch );
		//print_r($udt_arr);
		//Total Time
		$this->assertEquals( 5, $udt_arr[$date_epoch][0]['object_type_id'] );     //5=System Total
		$this->assertEquals( $udt_arr[$date_epoch][0]['pay_code_id'], TTUUID::getZeroID() );
		$this->assertEquals( $udt_arr[$date_epoch][0]['total_time'], ( 12 * 3600 ) );
		$this->assertEquals( $udt_arr[$date_epoch][0]['start_time_stamp'], strtotime( $date_stamp . ' 8:00AM' ) ); //Punch Start time
		$this->assertEquals( $udt_arr[$date_epoch][0]['end_time_stamp'], strtotime( $date_stamp . ' 8:00PM' ) );   //Punch End Time
		//Regular Time
		$this->assertEquals( 20, $udt_arr[$date_epoch][1]['object_type_id'] );                                     //Regular Time
		$this->assertEquals( $udt_arr[$date_epoch][1]['pay_code_id'], $this->policy_ids['pay_code'][100] );        //Regular Time
		$this->assertEquals( $udt_arr[$date_epoch][1]['total_time'], ( 11 * 3600 ) );
		$this->assertEquals( $udt_arr[$date_epoch][1]['start_time_stamp'], strtotime( $date_stamp . ' 8:00AM' ) ); //Punch Start time
		$this->assertEquals( $udt_arr[$date_epoch][1]['end_time_stamp'], strtotime( $date_stamp . ' 7:00PM' ) );   //Punch End Time
		//Overtime 1
		$this->assertEquals( 30, $udt_arr[$date_epoch][2]['object_type_id'] );                                     //OverTime
		$this->assertEquals( $udt_arr[$date_epoch][2]['pay_code_id'], $policy_ids['pay_code'][0] );
		$this->assertEquals( $udt_arr[$date_epoch][2]['total_time'], ( 1 * 3600 ) );
		$this->assertEquals( $udt_arr[$date_epoch][2]['start_time_stamp'], strtotime( $date_stamp . ' 7:00PM' ) ); //Punch Start time
		$this->assertEquals( $udt_arr[$date_epoch][2]['end_time_stamp'], strtotime( $date_stamp . ' 8:00PM' ) ); //Punch End Time
		//Make sure no other hours
		$this->assertCount( 3, $udt_arr[$date_epoch] );

		//
		//Day of Week: 5
		//
		$date_epoch = TTDate::incrementDate( TTDate::getMiddleDayEpoch( TTDate::getBeginWeekEpoch( time() ) ), 4, 'day' );
		$date_stamp = TTDate::getDate( 'DATE', $date_epoch );

		$dd->createPunchPair( $this->user_id,
							  strtotime( $date_stamp . ' 8:00AM' ),
							  strtotime( $date_stamp . ' 8:00PM' ),
							  [
									  'in_type_id'    => 10,
									  'out_type_id'   => 10,
									  'branch_id'     => 0,
									  'department_id' => 0,
									  'job_id'        => 0,
									  'job_item_id'   => 0,
									  'punch_tag_id'  => []
							  ],
							  true
		);
		$dd->createUserDateTotal( $this->user_id, $date_epoch, ( 3600 * 0 ), 0 ); //Create 0 hour manual timesheet entries.

		$udt_arr = $this->getUserDateTotalArray( $date_epoch, $date_epoch );
		//print_r($udt_arr);
		//Total Time
		$this->assertEquals( 5, $udt_arr[$date_epoch][0]['object_type_id'] );     //5=System Total
		$this->assertEquals( $udt_arr[$date_epoch][0]['pay_code_id'], TTUUID::getZeroID() );
		$this->assertEquals( $udt_arr[$date_epoch][0]['total_time'], ( 12 * 3600 ) );
		$this->assertEquals( $udt_arr[$date_epoch][0]['start_time_stamp'], strtotime( $date_stamp . ' 8:00AM' ) ); //Punch Start time
		$this->assertEquals( $udt_arr[$date_epoch][0]['end_time_stamp'], strtotime( $date_stamp . ' 8:00PM' ) );   //Punch End Time
		//Overtime 1
		$this->assertEquals( 30, $udt_arr[$date_epoch][2]['object_type_id'] );                                     //OverTime
		$this->assertEquals( $udt_arr[$date_epoch][2]['pay_code_id'], $policy_ids['pay_code'][0] );
		$this->assertEquals( $udt_arr[$date_epoch][2]['total_time'], ( 11 * 3600 ) );
		$this->assertEquals( $udt_arr[$date_epoch][2]['start_time_stamp'], strtotime( $date_stamp . ' 8:00AM' ) ); //Punch Start tie
		$this->assertEquals( $udt_arr[$date_epoch][2]['end_time_stamp'], strtotime( $date_stamp . ' 7:00PM' ) );   //Punch End Time
		//Overtime 2
		$this->assertEquals( 30, $udt_arr[$date_epoch][1]['object_type_id'] );                                     //OverTime
		$this->assertEquals( $udt_arr[$date_epoch][1]['pay_code_id'], $policy_ids['pay_code'][1] );
		$this->assertEquals( $udt_arr[$date_epoch][1]['total_time'], ( 1 * 3600 ) );
		$this->assertEquals( $udt_arr[$date_epoch][1]['start_time_stamp'], strtotime( $date_stamp . ' 7:00PM' ) ); //Punch Start time
		$this->assertEquals( $udt_arr[$date_epoch][1]['end_time_stamp'], strtotime( $date_stamp . ' 8:00PM' ) ); //Punch End Time
		//Make sure no other hours
		$this->assertCount( 3, $udt_arr[$date_epoch] );

		//
		//Day of Week: 6
		//
		$date_epoch = TTDate::incrementDate( TTDate::getMiddleDayEpoch( TTDate::getBeginWeekEpoch( time() ) ), 5, 'day' );
		$date_stamp = TTDate::getDate( 'DATE', $date_epoch );

		$dd->createPunchPair( $this->user_id,
							  strtotime( $date_stamp . ' 8:00AM' ),
							  strtotime( $date_stamp . ' 8:00PM' ),
							  [
									  'in_type_id'    => 10,
									  'out_type_id'   => 10,
									  'branch_id'     => 0,
									  'department_id' => 0,
									  'job_id'        => 0,
									  'job_item_id'   => 0,
									  'punch_tag_id'  => []
							  ],
							  true
		);
		$dd->createUserDateTotal( $this->user_id, $date_epoch, ( 3600 * 0 ), 0 ); //Create 0 hour manual timesheet entries.

		$udt_arr = $this->getUserDateTotalArray( $date_epoch, $date_epoch );
		//print_r($udt_arr);
		//Total Time
		$this->assertEquals( 5, $udt_arr[$date_epoch][0]['object_type_id'] );     //5=System Total
		$this->assertEquals( $udt_arr[$date_epoch][0]['pay_code_id'], TTUUID::getZeroID() );
		$this->assertEquals( $udt_arr[$date_epoch][0]['total_time'], ( 12 * 3600 ) );
		$this->assertEquals( $udt_arr[$date_epoch][0]['start_time_stamp'], strtotime( $date_stamp . ' 8:00AM' ) ); //Punch Start time
		$this->assertEquals( $udt_arr[$date_epoch][0]['end_time_stamp'], strtotime( $date_stamp . ' 8:00PM' ) );   //Punch End Time
		//Overtime 1
		$this->assertEquals( 30, $udt_arr[$date_epoch][2]['object_type_id'] );                                     //OverTime
		$this->assertEquals( $udt_arr[$date_epoch][2]['pay_code_id'], $policy_ids['pay_code'][1] );
		$this->assertEquals( $udt_arr[$date_epoch][2]['total_time'], ( 11 * 3600 ) );
		$this->assertEquals( $udt_arr[$date_epoch][2]['start_time_stamp'], strtotime( $date_stamp . ' 8:00AM' ) ); //Punch Start tie
		$this->assertEquals( $udt_arr[$date_epoch][2]['end_time_stamp'], strtotime( $date_stamp . ' 7:00PM' ) );   //Punch End Time
		//Overtime 2
		$this->assertEquals( 30, $udt_arr[$date_epoch][1]['object_type_id'] );                                     //OverTime
		$this->assertEquals( $udt_arr[$date_epoch][1]['pay_code_id'], $policy_ids['pay_code'][2] );
		$this->assertEquals( $udt_arr[$date_epoch][1]['total_time'], ( 1 * 3600 ) );
		$this->assertEquals( $udt_arr[$date_epoch][1]['start_time_stamp'], strtotime( $date_stamp . ' 7:00PM' ) ); //Punch Start time
		$this->assertEquals( $udt_arr[$date_epoch][1]['end_time_stamp'], strtotime( $date_stamp . ' 8:00PM' ) );   //Punch End Time
		//Make sure no other hours
		$this->assertCount( 3, $udt_arr[$date_epoch] );

		//
		//Recalculate timesheet and recheck all start/end timestamps now.
		//
		$ulf = TTNew( 'UserListFactory' ); /** @var UserListFactory $ulf */
		$ulf->getById( $this->user_id );
		if ( $ulf->getRecordCount() > 0 ) {
			UserDateTotalFactory::reCalculateDay( $ulf->getCurrent(), TTDate::getDateArray( TTDate::getBeginWeekEpoch( time() ), TTDate::getEndWeekEpoch( $date_epoch ) ) );
		} else {
			$this->assertTrue( false );
		}

		$date_epoch = TTDate::getMiddleDayEpoch( TTDate::getBeginWeekEpoch( time() ) );
		$date_stamp = TTDate::getDate( 'DATE', $date_epoch );

		//
		//Day of Week: 1
		//
		$udt_arr = $this->getUserDateTotalArray( $date_epoch, $date_epoch );
		//print_r($udt_arr);
		//Total Time
		$this->assertEquals( 5, $udt_arr[$date_epoch][0]['object_type_id'] );                                      //5=System Total
		$this->assertEquals( $udt_arr[$date_epoch][0]['pay_code_id'], TTUUID::getZeroID() );
		$this->assertEquals( $udt_arr[$date_epoch][0]['total_time'], ( 12 * 3600 ) );
		$this->assertEquals( $udt_arr[$date_epoch][0]['start_time_stamp'], strtotime( $date_stamp . ' 8:00AM' ) ); //Punch Start time
		$this->assertEquals( $udt_arr[$date_epoch][0]['end_time_stamp'], strtotime( $date_stamp . ' 8:00PM' ) );   //Punch End Time
		//Regular Time
		$this->assertEquals( 20, $udt_arr[$date_epoch][1]['object_type_id'] );                                     //Regular Time
		$this->assertEquals( $udt_arr[$date_epoch][1]['pay_code_id'], $this->policy_ids['pay_code'][100] );        //Regular Time
		$this->assertEquals( $udt_arr[$date_epoch][1]['total_time'], ( 12 * 3600 ) );
		$this->assertEquals( $udt_arr[$date_epoch][1]['start_time_stamp'], strtotime( $date_stamp . ' 8:00AM' ) ); //Punch Start time
		$this->assertEquals( $udt_arr[$date_epoch][1]['end_time_stamp'], strtotime( $date_stamp . ' 8:00PM' ) );   //Punch End Time
		//Make sure no other hours
		$this->assertCount( 2, $udt_arr[$date_epoch] );
		//
		//Day of Week: 2
		//
		$date_epoch = TTDate::incrementDate( TTDate::getMiddleDayEpoch( TTDate::getBeginWeekEpoch( time() ) ), 1, 'day' );
		$date_stamp = TTDate::getDate( 'DATE', $date_epoch );

		$udt_arr = $this->getUserDateTotalArray( $date_epoch, $date_epoch );
		//Total Time
		$this->assertEquals( 5, $udt_arr[$date_epoch][0]['object_type_id'] );                                      //5=System Total
		$this->assertEquals( $udt_arr[$date_epoch][0]['pay_code_id'], TTUUID::getZeroID() );
		$this->assertEquals( $udt_arr[$date_epoch][0]['total_time'], ( 12 * 3600 ) );
		$this->assertEquals( $udt_arr[$date_epoch][0]['start_time_stamp'], strtotime( $date_stamp . ' 8:00AM' ) ); //Punch Start time
		$this->assertEquals( $udt_arr[$date_epoch][0]['end_time_stamp'], strtotime( $date_stamp . ' 8:00PM' ) );   //Punch End Time
		//Regular Time
		$this->assertEquals( 20, $udt_arr[$date_epoch][1]['object_type_id'] );                                     //Regular Time
		$this->assertEquals( $udt_arr[$date_epoch][1]['pay_code_id'], $this->policy_ids['pay_code'][100] );        //Regular Time
		$this->assertEquals( $udt_arr[$date_epoch][1]['total_time'], ( 12 * 3600 ) );
		$this->assertEquals( $udt_arr[$date_epoch][1]['start_time_stamp'], strtotime( $date_stamp . ' 8:00AM' ) ); //Punch Start time
		$this->assertEquals( $udt_arr[$date_epoch][1]['end_time_stamp'], strtotime( $date_stamp . ' 8:00PM' ) );   //Punch End Time
		//Make sure no other hours
		$this->assertCount( 2, $udt_arr[$date_epoch] );

		//
		//Day of Week: 3
		//
		$date_epoch = TTDate::incrementDate( TTDate::getMiddleDayEpoch( TTDate::getBeginWeekEpoch( time() ) ), 2, 'day' );
		$date_stamp = TTDate::getDate( 'DATE', $date_epoch );

		$udt_arr = $this->getUserDateTotalArray( $date_epoch, $date_epoch );
		//Total Time
		$this->assertEquals( 5, $udt_arr[$date_epoch][0]['object_type_id'] );                                      //5=System Total
		$this->assertEquals( $udt_arr[$date_epoch][0]['pay_code_id'], TTUUID::getZeroID() );
		$this->assertEquals( $udt_arr[$date_epoch][0]['total_time'], ( 12 * 3600 ) );
		$this->assertEquals( $udt_arr[$date_epoch][0]['start_time_stamp'], strtotime( $date_stamp . ' 8:00AM' ) ); //Punch Start time
		$this->assertEquals( $udt_arr[$date_epoch][0]['end_time_stamp'], strtotime( $date_stamp . ' 8:00PM' ) );   //Punch End Time
		//Regular Time
		$this->assertEquals( 20, $udt_arr[$date_epoch][1]['object_type_id'] );                                     //Regular Time
		$this->assertEquals( $udt_arr[$date_epoch][1]['pay_code_id'], $this->policy_ids['pay_code'][100] );        //Regular Time
		$this->assertEquals( $udt_arr[$date_epoch][1]['total_time'], ( 12 * 3600 ) );
		$this->assertEquals( $udt_arr[$date_epoch][1]['start_time_stamp'], strtotime( $date_stamp . ' 8:00AM' ) ); //Punch Start time
		$this->assertEquals( $udt_arr[$date_epoch][1]['end_time_stamp'], strtotime( $date_stamp . ' 8:00PM' ) );   //Punch End Time
		//Make sure no other hours
		$this->assertCount( 2, $udt_arr[$date_epoch] );

		//
		//Day of Week: 4
		//
		$date_epoch = TTDate::incrementDate( TTDate::getMiddleDayEpoch( TTDate::getBeginWeekEpoch( time() ) ), 3, 'day' );
		$date_stamp = TTDate::getDate( 'DATE', $date_epoch );

		$udt_arr = $this->getUserDateTotalArray( $date_epoch, $date_epoch );
		//print_r($udt_arr);
		//Total Time
		$this->assertEquals( 5, $udt_arr[$date_epoch][0]['object_type_id'] );                                      //5=System Total
		$this->assertEquals( $udt_arr[$date_epoch][0]['pay_code_id'], TTUUID::getZeroID() );
		$this->assertEquals( $udt_arr[$date_epoch][0]['total_time'], ( 12 * 3600 ) );
		$this->assertEquals( $udt_arr[$date_epoch][0]['start_time_stamp'], strtotime( $date_stamp . ' 8:00AM' ) ); //Punch Start time
		$this->assertEquals( $udt_arr[$date_epoch][0]['end_time_stamp'], strtotime( $date_stamp . ' 8:00PM' ) );   //Punch End Time
		//Regular Time
		$this->assertEquals( 20, $udt_arr[$date_epoch][1]['object_type_id'] );                                     //Regular Time
		$this->assertEquals( $udt_arr[$date_epoch][1]['pay_code_id'], $this->policy_ids['pay_code'][100] );        //Regular Time
		$this->assertEquals( $udt_arr[$date_epoch][1]['total_time'], ( 11 * 3600 ) );
		$this->assertEquals( $udt_arr[$date_epoch][1]['start_time_stamp'], strtotime( $date_stamp . ' 8:00AM' ) ); //Punch Start time
		$this->assertEquals( $udt_arr[$date_epoch][1]['end_time_stamp'], strtotime( $date_stamp . ' 7:00PM' ) );   //Punch End Time
		//Overtime 1
		$this->assertEquals( 30, $udt_arr[$date_epoch][2]['object_type_id'] );                                     //OverTime
		$this->assertEquals( $udt_arr[$date_epoch][2]['pay_code_id'], $policy_ids['pay_code'][0] );
		$this->assertEquals( $udt_arr[$date_epoch][2]['total_time'], ( 1 * 3600 ) );
		$this->assertEquals( $udt_arr[$date_epoch][2]['start_time_stamp'], strtotime( $date_stamp . ' 7:00PM' ) ); //Punch Start time
		$this->assertEquals( $udt_arr[$date_epoch][2]['end_time_stamp'], strtotime( $date_stamp . ' 8:00PM' ) );   //Punch End Time
		//Make sure no other hours
		$this->assertCount( 3, $udt_arr[$date_epoch] );

		//
		//Day of Week: 5
		//
		$date_epoch = TTDate::incrementDate( TTDate::getMiddleDayEpoch( TTDate::getBeginWeekEpoch( time() ) ), 4, 'day' );
		$date_stamp = TTDate::getDate( 'DATE', $date_epoch );

		$udt_arr = $this->getUserDateTotalArray( $date_epoch, $date_epoch );
		//print_r($udt_arr);
		//Total Time
		$this->assertEquals( 5, $udt_arr[$date_epoch][0]['object_type_id'] );                                      //5=System Total
		$this->assertEquals( $udt_arr[$date_epoch][0]['pay_code_id'], TTUUID::getZeroID() );
		$this->assertEquals( $udt_arr[$date_epoch][0]['total_time'], ( 12 * 3600 ) );
		$this->assertEquals( $udt_arr[$date_epoch][0]['start_time_stamp'], strtotime( $date_stamp . ' 8:00AM' ) ); //Punch Start time
		$this->assertEquals( $udt_arr[$date_epoch][0]['end_time_stamp'], strtotime( $date_stamp . ' 8:00PM' ) );   //Punch End Time
		//Overtime 1
		$this->assertEquals( 30, $udt_arr[$date_epoch][2]['object_type_id'] );                                     //OverTime
		$this->assertEquals( $udt_arr[$date_epoch][2]['pay_code_id'], $policy_ids['pay_code'][0] );
		$this->assertEquals( $udt_arr[$date_epoch][2]['total_time'], ( 11 * 3600 ) );
		$this->assertEquals( $udt_arr[$date_epoch][2]['start_time_stamp'], strtotime( $date_stamp . ' 8:00AM' ) ); //Punch Start tie
		$this->assertEquals( $udt_arr[$date_epoch][2]['end_time_stamp'], strtotime( $date_stamp . ' 7:00PM' ) );   //Punch End Time
		//Overtime 2
		$this->assertEquals( 30, $udt_arr[$date_epoch][1]['object_type_id'] );                                     //OverTime
		$this->assertEquals( $udt_arr[$date_epoch][1]['pay_code_id'], $policy_ids['pay_code'][1] );
		$this->assertEquals( $udt_arr[$date_epoch][1]['total_time'], ( 1 * 3600 ) );
		$this->assertEquals( $udt_arr[$date_epoch][1]['start_time_stamp'], strtotime( $date_stamp . ' 7:00PM' ) ); //Punch Start time
		$this->assertEquals( $udt_arr[$date_epoch][1]['end_time_stamp'], strtotime( $date_stamp . ' 8:00PM' ) );   //Punch End Time
		//Make sure no other hours
		$this->assertCount( 3, $udt_arr[$date_epoch] );

		//
		//Day of Week: 6
		//
		$date_epoch = TTDate::incrementDate( TTDate::getMiddleDayEpoch( TTDate::getBeginWeekEpoch( time() ) ), 5, 'day' );
		$date_stamp = TTDate::getDate( 'DATE', $date_epoch );

		$udt_arr = $this->getUserDateTotalArray( $date_epoch, $date_epoch );
		//print_r($udt_arr);
		//Total Time
		$this->assertEquals( 5, $udt_arr[$date_epoch][0]['object_type_id'] );                                      //5=System Total
		$this->assertEquals( $udt_arr[$date_epoch][0]['pay_code_id'], TTUUID::getZeroID() );
		$this->assertEquals( $udt_arr[$date_epoch][0]['total_time'], ( 12 * 3600 ) );
		$this->assertEquals( $udt_arr[$date_epoch][0]['start_time_stamp'], strtotime( $date_stamp . ' 8:00AM' ) ); //Punch Start time
		$this->assertEquals( $udt_arr[$date_epoch][0]['end_time_stamp'], strtotime( $date_stamp . ' 8:00PM' ) );   //Punch End Time
		//Overtime 1
		$this->assertEquals( 30, $udt_arr[$date_epoch][2]['object_type_id'] );                                     //OverTime
		$this->assertEquals( $udt_arr[$date_epoch][2]['pay_code_id'], $policy_ids['pay_code'][1] );
		$this->assertEquals( $udt_arr[$date_epoch][2]['total_time'], ( 11 * 3600 ) );
		$this->assertEquals( $udt_arr[$date_epoch][2]['start_time_stamp'], strtotime( $date_stamp . ' 8:00AM' ) ); //Punch Start tie
		$this->assertEquals( $udt_arr[$date_epoch][2]['end_time_stamp'], strtotime( $date_stamp . ' 7:00PM' ) );   //Punch End Time
		//Overtime 2
		$this->assertEquals( 30, $udt_arr[$date_epoch][1]['object_type_id'] );                                     //OverTime
		$this->assertEquals( $udt_arr[$date_epoch][1]['pay_code_id'], $policy_ids['pay_code'][2] );
		$this->assertEquals( $udt_arr[$date_epoch][1]['total_time'], ( 1 * 3600 ) );
		$this->assertEquals( $udt_arr[$date_epoch][1]['start_time_stamp'], strtotime( $date_stamp . ' 7:00PM' ) ); //Punch Start time
		$this->assertEquals( $udt_arr[$date_epoch][1]['end_time_stamp'], strtotime( $date_stamp . ' 8:00PM' ) ); //Punch End Time
		//Make sure no other hours
		$this->assertCount( 3, $udt_arr[$date_epoch] );


		return true;
	}


	/**
	 * @group OvertimePolicy_test2ConsecutiveDaysPerWeekOverTimePolicyA
	 */
	function test2ConsecutiveDaysPerWeekOverTimePolicyA() {
		global $dd;

		$policy_ids['pay_formula_policy'][] = $this->createPayFormulaPolicy( $this->company_id, 200 );      //OT1.5
		$policy_ids['pay_formula_policy'][] = $this->createPayFormulaPolicy( $this->company_id, 210 );      //OT2.0
		$policy_ids['pay_formula_policy'][] = $this->createPayFormulaPolicy( $this->company_id, 220 );      //OT2.5

		$policy_ids['pay_code'][] = $this->createPayCode( $this->company_id, 200, $policy_ids['pay_formula_policy'][0] );
		$policy_ids['pay_code'][] = $this->createPayCode( $this->company_id, 210, $policy_ids['pay_formula_policy'][1] );
		$policy_ids['pay_code'][] = $this->createPayCode( $this->company_id, 220, $policy_ids['pay_formula_policy'][2] );

		$policy_ids['overtime'][] = $this->createOverTimePolicy( $this->company_id, 2150, $this->policy_ids['contributing_shift_policy'][12], $policy_ids['pay_code'][0] );
		//$policy_ids['overtime'][] = $this->createOverTimePolicy( $this->company_id, 210, $this->policy_ids['contributing_shift_policy'][12], $policy_ids['pay_code'][1] );
		//$policy_ids['overtime'][] = $this->createOverTimePolicy( $this->company_id, 220, $this->policy_ids['contributing_shift_policy'][12], $policy_ids['pay_code'][2] );
		//print_r($policy_ids['overtime']);

		//Create Policy Group
		$dd->createPolicyGroup( $this->company_id,
								null, //Meal
								null, //Exception
								null, //Holiday
								$policy_ids['overtime'], //OT
								null, //Premium
								null, //Round
								[ $this->user_id ], //Users
								null, //Break
								null, //Accrual
								null, //Expense
								null, //Absence
								[ $this->policy_ids['regular'][12] ] //Regular
		);

		$date_epoch = TTDate::getMiddleDayEpoch( TTDate::getBeginWeekEpoch( time() ) );
		$date_stamp = TTDate::getDate( 'DATE', $date_epoch );

		//
		//Day of Week: 1
		//
		$dd->createPunchPair( $this->user_id,
							  strtotime( $date_stamp . ' 8:00AM' ),
							  strtotime( $date_stamp . ' 8:00PM' ),
							  [
									  'in_type_id'    => 10,
									  'out_type_id'   => 10,
									  'branch_id'     => 0,
									  'department_id' => 0,
									  'job_id'        => 0,
									  'job_item_id'   => 0,
									  'punch_tag_id'  => []
							  ],
							  true
		);

		$udt_arr = $this->getUserDateTotalArray( $date_epoch, $date_epoch );
		//print_r($udt_arr);
		//Total Time
		$this->assertEquals( 5, $udt_arr[$date_epoch][0]['object_type_id'] );                               //5=System Total
		$this->assertEquals( $udt_arr[$date_epoch][0]['pay_code_id'], TTUUID::getZeroID() );
		$this->assertEquals( $udt_arr[$date_epoch][0]['total_time'], ( 12 * 3600 ) );
		//Regular Time
		$this->assertEquals( 20, $udt_arr[$date_epoch][1]['object_type_id'] );                              //Regular Time
		$this->assertEquals( $udt_arr[$date_epoch][1]['pay_code_id'], $this->policy_ids['pay_code'][100] ); //Regular Time
		$this->assertEquals( $udt_arr[$date_epoch][1]['total_time'], ( 12 * 3600 ) );
		//Make sure no other hours
		$this->assertCount( 2, $udt_arr[$date_epoch] );

		//
		//Day of Week: 2
		//
		$date_epoch = TTDate::incrementDate( TTDate::getMiddleDayEpoch( TTDate::getBeginWeekEpoch( time() ) ), 1, 'day' );
		$date_stamp = TTDate::getDate( 'DATE', $date_epoch );

		$dd->createPunchPair( $this->user_id,
							  strtotime( $date_stamp . ' 8:00AM' ),
							  strtotime( $date_stamp . ' 8:00PM' ),
							  [
									  'in_type_id'    => 10,
									  'out_type_id'   => 10,
									  'branch_id'     => 0,
									  'department_id' => 0,
									  'job_id'        => 0,
									  'job_item_id'   => 0,
									  'punch_tag_id'  => []
							  ],
							  true
		);

		$udt_arr = $this->getUserDateTotalArray( $date_epoch, $date_epoch );
		//Total Time
		$this->assertEquals( 5, $udt_arr[$date_epoch][0]['object_type_id'] );                               //5=System Total
		$this->assertEquals( $udt_arr[$date_epoch][0]['pay_code_id'], TTUUID::getZeroID() );
		$this->assertEquals( $udt_arr[$date_epoch][0]['total_time'], ( 12 * 3600 ) );
		//Overtime 1
		$this->assertEquals( 30, $udt_arr[$date_epoch][1]['object_type_id'] );                              //OverTime
		$this->assertEquals( $udt_arr[$date_epoch][1]['pay_code_id'], $policy_ids['pay_code'][0] );
		$this->assertEquals( $udt_arr[$date_epoch][1]['total_time'], ( 12 * 3600 ) );
		//Make sure no other hours
		$this->assertCount( 2, $udt_arr[$date_epoch] );

		//
		//Day of Week: 3
		//
		$date_epoch = TTDate::incrementDate( TTDate::getMiddleDayEpoch( TTDate::getBeginWeekEpoch( time() ) ), 2, 'day' );
		$date_stamp = TTDate::getDate( 'DATE', $date_epoch );

		$dd->createPunchPair( $this->user_id,
							  strtotime( $date_stamp . ' 8:00AM' ),
							  strtotime( $date_stamp . ' 8:00PM' ),
							  [
									  'in_type_id'    => 10,
									  'out_type_id'   => 10,
									  'branch_id'     => 0,
									  'department_id' => 0,
									  'job_id'        => 0,
									  'job_item_id'   => 0,
									  'punch_tag_id'  => []
							  ],
							  true
		);

		$udt_arr = $this->getUserDateTotalArray( $date_epoch, $date_epoch );
		//Total Time
		$this->assertEquals( 5, $udt_arr[$date_epoch][0]['object_type_id'] );                               //5=System Total
		$this->assertEquals( $udt_arr[$date_epoch][0]['pay_code_id'], TTUUID::getZeroID() );
		$this->assertEquals( $udt_arr[$date_epoch][0]['total_time'], ( 12 * 3600 ) );
		//Overtime 1
		$this->assertEquals( 30, $udt_arr[$date_epoch][1]['object_type_id'] );                              //OverTime
		$this->assertEquals( $udt_arr[$date_epoch][1]['pay_code_id'], $policy_ids['pay_code'][0] );
		$this->assertEquals( $udt_arr[$date_epoch][1]['total_time'], ( 12 * 3600 ) );
		//Make sure no other hours
		$this->assertCount( 2, $udt_arr[$date_epoch] );

		//
		//Day of Week: 4
		//
		$date_epoch = TTDate::incrementDate( TTDate::getMiddleDayEpoch( TTDate::getBeginWeekEpoch( time() ) ), 3, 'day' );
		$date_stamp = TTDate::getDate( 'DATE', $date_epoch );

		$dd->createPunchPair( $this->user_id,
							  strtotime( $date_stamp . ' 8:00AM' ),
							  strtotime( $date_stamp . ' 8:00PM' ),
							  [
									  'in_type_id'    => 10,
									  'out_type_id'   => 10,
									  'branch_id'     => 0,
									  'department_id' => 0,
									  'job_id'        => 0,
									  'job_item_id'   => 0,
									  'punch_tag_id'  => []
							  ],
							  true
		);

		$udt_arr = $this->getUserDateTotalArray( $date_epoch, $date_epoch );
		//print_r($udt_arr);
		//Total Time
		$this->assertEquals( 5, $udt_arr[$date_epoch][0]['object_type_id'] );                               //5=System Total
		$this->assertEquals( $udt_arr[$date_epoch][0]['pay_code_id'], TTUUID::getZeroID() );
		$this->assertEquals( $udt_arr[$date_epoch][0]['total_time'], ( 12 * 3600 ) );
		//Overtime 1
		$this->assertEquals( 30, $udt_arr[$date_epoch][1]['object_type_id'] );                              //OverTime
		$this->assertEquals( $udt_arr[$date_epoch][1]['pay_code_id'], $policy_ids['pay_code'][0] );
		$this->assertEquals( $udt_arr[$date_epoch][1]['total_time'], ( 12 * 3600 ) );
		//Make sure no other hours
		$this->assertCount( 2, $udt_arr[$date_epoch] );

		//
		//Day of Week: 5
		//
		$date_epoch = TTDate::incrementDate( TTDate::getMiddleDayEpoch( TTDate::getBeginWeekEpoch( time() ) ), 4, 'day' );
		$date_stamp = TTDate::getDate( 'DATE', $date_epoch );

		$dd->createPunchPair( $this->user_id,
							  strtotime( $date_stamp . ' 8:00AM' ),
							  strtotime( $date_stamp . ' 8:00PM' ),
							  [
									  'in_type_id'    => 10,
									  'out_type_id'   => 10,
									  'branch_id'     => 0,
									  'department_id' => 0,
									  'job_id'        => 0,
									  'job_item_id'   => 0,
									  'punch_tag_id'  => []
							  ],
							  true
		);

		$udt_arr = $this->getUserDateTotalArray( $date_epoch, $date_epoch );
		//print_r($udt_arr);
		//Total Time
		$this->assertEquals( 5, $udt_arr[$date_epoch][0]['object_type_id'] );                               //5=System Total
		$this->assertEquals( $udt_arr[$date_epoch][0]['pay_code_id'], TTUUID::getZeroID() );
		$this->assertEquals( $udt_arr[$date_epoch][0]['total_time'], ( 12 * 3600 ) );
		//Overtime 1
		$this->assertEquals( 30, $udt_arr[$date_epoch][1]['object_type_id'] );                              //OverTime
		$this->assertEquals( $udt_arr[$date_epoch][1]['pay_code_id'], $policy_ids['pay_code'][0] );
		$this->assertEquals( $udt_arr[$date_epoch][1]['total_time'], ( 12 * 3600 ) );
		//Make sure no other hours
		$this->assertCount( 2, $udt_arr[$date_epoch] );

		//
		//Day of Week: 6
		//
		$date_epoch = TTDate::incrementDate( TTDate::getMiddleDayEpoch( TTDate::getBeginWeekEpoch( time() ) ), 5, 'day' );
		$date_stamp = TTDate::getDate( 'DATE', $date_epoch );

		$dd->createPunchPair( $this->user_id,
							  strtotime( $date_stamp . ' 8:00AM' ),
							  strtotime( $date_stamp . ' 8:00PM' ),
							  [
									  'in_type_id'    => 10,
									  'out_type_id'   => 10,
									  'branch_id'     => 0,
									  'department_id' => 0,
									  'job_id'        => 0,
									  'job_item_id'   => 0,
									  'punch_tag_id'  => []
							  ],
							  true
		);

		$udt_arr = $this->getUserDateTotalArray( $date_epoch, $date_epoch );
		//print_r($udt_arr);
		//Total Time
		$this->assertEquals( 5, $udt_arr[$date_epoch][0]['object_type_id'] );                               //5=System Total
		$this->assertEquals( $udt_arr[$date_epoch][0]['pay_code_id'], TTUUID::getZeroID() );
		$this->assertEquals( $udt_arr[$date_epoch][0]['total_time'], ( 12 * 3600 ) );
		//Overtime 1
		$this->assertEquals( 30, $udt_arr[$date_epoch][1]['object_type_id'] );                              //OverTime
		$this->assertEquals( $udt_arr[$date_epoch][1]['pay_code_id'], $policy_ids['pay_code'][0] );
		$this->assertEquals( $udt_arr[$date_epoch][1]['total_time'], ( 12 * 3600 ) );
		//Make sure no other hours
		$this->assertCount( 2, $udt_arr[$date_epoch] );

		//
		//Day of Week: 7
		//
		$date_epoch = TTDate::incrementDate( TTDate::getMiddleDayEpoch( TTDate::getBeginWeekEpoch( time() ) ), 6, 'day' );
		$date_stamp = TTDate::getDate( 'DATE', $date_epoch );

		$dd->createPunchPair( $this->user_id,
							  strtotime( $date_stamp . ' 8:00AM' ),
							  strtotime( $date_stamp . ' 8:00PM' ),
							  [
									  'in_type_id'    => 10,
									  'out_type_id'   => 10,
									  'branch_id'     => 0,
									  'department_id' => 0,
									  'job_id'        => 0,
									  'job_item_id'   => 0,
									  'punch_tag_id'  => []
							  ],
							  true
		);

		$udt_arr = $this->getUserDateTotalArray( $date_epoch, $date_epoch );
		//print_r($udt_arr);
		//Total Time
		$this->assertEquals( 5, $udt_arr[$date_epoch][0]['object_type_id'] );                               //5=System Total
		$this->assertEquals( $udt_arr[$date_epoch][0]['pay_code_id'], TTUUID::getZeroID() );
		$this->assertEquals( $udt_arr[$date_epoch][0]['total_time'], ( 12 * 3600 ) );
		//Overtime 1
		$this->assertEquals( 30, $udt_arr[$date_epoch][1]['object_type_id'] );                              //OverTime
		$this->assertEquals( $udt_arr[$date_epoch][1]['pay_code_id'], $policy_ids['pay_code'][0] );
		$this->assertEquals( $udt_arr[$date_epoch][1]['total_time'], ( 12 * 3600 ) );
		//Make sure no other hours
		$this->assertCount( 2, $udt_arr[$date_epoch] );

		//
		//Day of Week: 8
		//
		$date_epoch = TTDate::incrementDate( TTDate::getMiddleDayEpoch( TTDate::getBeginWeekEpoch( time() ) ), 7, 'day' );
		$date_stamp = TTDate::getDate( 'DATE', $date_epoch );

		$dd->createPunchPair( $this->user_id,
							  strtotime( $date_stamp . ' 8:00AM' ),
							  strtotime( $date_stamp . ' 8:00PM' ),
							  [
									  'in_type_id'    => 10,
									  'out_type_id'   => 10,
									  'branch_id'     => 0,
									  'department_id' => 0,
									  'job_id'        => 0,
									  'job_item_id'   => 0,
									  'punch_tag_id'  => []
							  ],
							  true
		);

		$udt_arr = $this->getUserDateTotalArray( $date_epoch, $date_epoch );
		//print_r($udt_arr);
		//Total Time
		$this->assertEquals( 5, $udt_arr[$date_epoch][0]['object_type_id'] );                               //5=System Total
		$this->assertEquals( $udt_arr[$date_epoch][0]['pay_code_id'], TTUUID::getZeroID() );
		$this->assertEquals( $udt_arr[$date_epoch][0]['total_time'], ( 12 * 3600 ) );
		//Regular Time
		$this->assertEquals( 20, $udt_arr[$date_epoch][1]['object_type_id'] );                              //Regular Time
		$this->assertEquals( $udt_arr[$date_epoch][1]['pay_code_id'], $this->policy_ids['pay_code'][100] ); //Regular Time
		$this->assertEquals( $udt_arr[$date_epoch][1]['total_time'], ( 12 * 3600 ) );
		//Make sure no other hours
		$this->assertCount( 2, $udt_arr[$date_epoch] );

		return true;
	}

	/**
	 * @group OvertimePolicy_test7ConsecutiveDaysPerWeekOverTimePolicyA
	 */
	function test7ConsecutiveDaysPerWeekOverTimePolicyA() {
		global $dd;

		$policy_ids['pay_formula_policy'][] = $this->createPayFormulaPolicy( $this->company_id, 200 );      //OT1.5
		$policy_ids['pay_formula_policy'][] = $this->createPayFormulaPolicy( $this->company_id, 210 );      //OT2.0
		$policy_ids['pay_formula_policy'][] = $this->createPayFormulaPolicy( $this->company_id, 220 );      //OT2.5

		$policy_ids['pay_code'][] = $this->createPayCode( $this->company_id, 200, $policy_ids['pay_formula_policy'][0] );
		$policy_ids['pay_code'][] = $this->createPayCode( $this->company_id, 210, $policy_ids['pay_formula_policy'][1] );
		$policy_ids['pay_code'][] = $this->createPayCode( $this->company_id, 220, $policy_ids['pay_formula_policy'][2] );

		$policy_ids['overtime'][] = $this->createOverTimePolicy( $this->company_id, 2155, $this->policy_ids['contributing_shift_policy'][12], $policy_ids['pay_code'][0] );
		//$policy_ids['overtime'][] = $this->createOverTimePolicy( $this->company_id, 210, $this->policy_ids['contributing_shift_policy'][12], $policy_ids['pay_code'][1] );
		//$policy_ids['overtime'][] = $this->createOverTimePolicy( $this->company_id, 220, $this->policy_ids['contributing_shift_policy'][12], $policy_ids['pay_code'][2] );
		//print_r($policy_ids['overtime']);

		//Create Policy Group
		$dd->createPolicyGroup( $this->company_id,
								null, //Meal
								null, //Exception
								null, //Holiday
								$policy_ids['overtime'], //OT
								null, //Premium
								null, //Round
								[ $this->user_id ], //Users
								null, //Break
								null, //Accrual
								null, //Expense
								null, //Absence
								[ $this->policy_ids['regular'][12] ] //Regular
		);

		$date_epoch = TTDate::getMiddleDayEpoch( TTDate::getBeginWeekEpoch( time() ) );
		$date_stamp = TTDate::getDate( 'DATE', $date_epoch );

		//
		//Day of Week: 1
		//
		$dd->createPunchPair( $this->user_id,
							  strtotime( $date_stamp . ' 8:00AM' ),
							  strtotime( $date_stamp . ' 8:00PM' ),
							  [
									  'in_type_id'    => 10,
									  'out_type_id'   => 10,
									  'branch_id'     => 0,
									  'department_id' => 0,
									  'job_id'        => 0,
									  'job_item_id'   => 0,
									  'punch_tag_id'  => []
							  ],
							  true
		);

		$udt_arr = $this->getUserDateTotalArray( $date_epoch, $date_epoch );
		//print_r($udt_arr);
		//Total Time
		$this->assertEquals( 5, $udt_arr[$date_epoch][0]['object_type_id'] );                               //5=System Total
		$this->assertEquals( $udt_arr[$date_epoch][0]['pay_code_id'], TTUUID::getZeroID() );
		$this->assertEquals( $udt_arr[$date_epoch][0]['total_time'], ( 12 * 3600 ) );
		//Regular Time
		$this->assertEquals( 20, $udt_arr[$date_epoch][1]['object_type_id'] );                              //Regular Time
		$this->assertEquals( $udt_arr[$date_epoch][1]['pay_code_id'], $this->policy_ids['pay_code'][100] ); //Regular Time
		$this->assertEquals( $udt_arr[$date_epoch][1]['total_time'], ( 12 * 3600 ) );
		//Make sure no other hours
		$this->assertCount( 2, $udt_arr[$date_epoch] );

		//
		//Day of Week: 2
		//
		$date_epoch = TTDate::incrementDate( TTDate::getMiddleDayEpoch( TTDate::getBeginWeekEpoch( time() ) ), 1, 'day' );
		$date_stamp = TTDate::getDate( 'DATE', $date_epoch );

		$dd->createPunchPair( $this->user_id,
							  strtotime( $date_stamp . ' 8:00AM' ),
							  strtotime( $date_stamp . ' 8:00PM' ),
							  [
									  'in_type_id'    => 10,
									  'out_type_id'   => 10,
									  'branch_id'     => 0,
									  'department_id' => 0,
									  'job_id'        => 0,
									  'job_item_id'   => 0,
									  'punch_tag_id'  => []
							  ],
							  true
		);

		$udt_arr = $this->getUserDateTotalArray( $date_epoch, $date_epoch );
		//Total Time
		$this->assertEquals( 5, $udt_arr[$date_epoch][0]['object_type_id'] );                               //5=System Total
		$this->assertEquals( $udt_arr[$date_epoch][0]['pay_code_id'], TTUUID::getZeroID() );
		$this->assertEquals( $udt_arr[$date_epoch][0]['total_time'], ( 12 * 3600 ) );
		//Regular Time
		$this->assertEquals( 20, $udt_arr[$date_epoch][1]['object_type_id'] );                              //Regular Time
		$this->assertEquals( $udt_arr[$date_epoch][1]['pay_code_id'], $this->policy_ids['pay_code'][100] ); //Regular Time
		$this->assertEquals( $udt_arr[$date_epoch][1]['total_time'], ( 12 * 3600 ) );
		//Make sure no other hours
		$this->assertCount( 2, $udt_arr[$date_epoch] );

		//
		//Day of Week: 3
		//
		$date_epoch = TTDate::incrementDate( TTDate::getMiddleDayEpoch( TTDate::getBeginWeekEpoch( time() ) ), 2, 'day' );
		$date_stamp = TTDate::getDate( 'DATE', $date_epoch );

		$dd->createPunchPair( $this->user_id,
							  strtotime( $date_stamp . ' 8:00AM' ),
							  strtotime( $date_stamp . ' 8:00PM' ),
							  [
									  'in_type_id'    => 10,
									  'out_type_id'   => 10,
									  'branch_id'     => 0,
									  'department_id' => 0,
									  'job_id'        => 0,
									  'job_item_id'   => 0,
									  'punch_tag_id'  => []
							  ],
							  true
		);

		$udt_arr = $this->getUserDateTotalArray( $date_epoch, $date_epoch );
		//Total Time
		$this->assertEquals( 5, $udt_arr[$date_epoch][0]['object_type_id'] );                               //5=System Total
		$this->assertEquals( $udt_arr[$date_epoch][0]['pay_code_id'], TTUUID::getZeroID() );
		$this->assertEquals( $udt_arr[$date_epoch][0]['total_time'], ( 12 * 3600 ) );
		//Regular Time
		$this->assertEquals( 20, $udt_arr[$date_epoch][1]['object_type_id'] );                              //Regular Time
		$this->assertEquals( $udt_arr[$date_epoch][1]['pay_code_id'], $this->policy_ids['pay_code'][100] ); //Regular Time
		$this->assertEquals( $udt_arr[$date_epoch][1]['total_time'], ( 12 * 3600 ) );
		//Make sure no other hours
		$this->assertCount( 2, $udt_arr[$date_epoch] );

		//
		//Day of Week: 4
		//
		$date_epoch = TTDate::incrementDate( TTDate::getMiddleDayEpoch( TTDate::getBeginWeekEpoch( time() ) ), 3, 'day' );
		$date_stamp = TTDate::getDate( 'DATE', $date_epoch );

		$dd->createPunchPair( $this->user_id,
							  strtotime( $date_stamp . ' 8:00AM' ),
							  strtotime( $date_stamp . ' 8:00PM' ),
							  [
									  'in_type_id'    => 10,
									  'out_type_id'   => 10,
									  'branch_id'     => 0,
									  'department_id' => 0,
									  'job_id'        => 0,
									  'job_item_id'   => 0,
									  'punch_tag_id'  => []
							  ],
							  true
		);

		$udt_arr = $this->getUserDateTotalArray( $date_epoch, $date_epoch );
		//print_r($udt_arr);
		//Total Time
		$this->assertEquals( 5, $udt_arr[$date_epoch][0]['object_type_id'] );                               //5=System Total
		$this->assertEquals( $udt_arr[$date_epoch][0]['pay_code_id'], TTUUID::getZeroID() );
		$this->assertEquals( $udt_arr[$date_epoch][0]['total_time'], ( 12 * 3600 ) );
		//Regular Time
		$this->assertEquals( 20, $udt_arr[$date_epoch][1]['object_type_id'] );                              //Regular Time
		$this->assertEquals( $udt_arr[$date_epoch][1]['pay_code_id'], $this->policy_ids['pay_code'][100] ); //Regular Time
		$this->assertEquals( $udt_arr[$date_epoch][1]['total_time'], ( 12 * 3600 ) );
		//Make sure no other hours
		$this->assertCount( 2, $udt_arr[$date_epoch] );

		//
		//Day of Week: 5
		//
		$date_epoch = TTDate::incrementDate( TTDate::getMiddleDayEpoch( TTDate::getBeginWeekEpoch( time() ) ), 4, 'day' );
		$date_stamp = TTDate::getDate( 'DATE', $date_epoch );

		$dd->createPunchPair( $this->user_id,
							  strtotime( $date_stamp . ' 8:00AM' ),
							  strtotime( $date_stamp . ' 8:00PM' ),
							  [
									  'in_type_id'    => 10,
									  'out_type_id'   => 10,
									  'branch_id'     => 0,
									  'department_id' => 0,
									  'job_id'        => 0,
									  'job_item_id'   => 0,
									  'punch_tag_id'  => []
							  ],
							  true
		);

		$udt_arr = $this->getUserDateTotalArray( $date_epoch, $date_epoch );
		//print_r($udt_arr);
		//Total Time
		$this->assertEquals( 5, $udt_arr[$date_epoch][0]['object_type_id'] );                               //5=System Total
		$this->assertEquals( $udt_arr[$date_epoch][0]['pay_code_id'], TTUUID::getZeroID() );
		$this->assertEquals( $udt_arr[$date_epoch][0]['total_time'], ( 12 * 3600 ) );
		//Regular Time
		$this->assertEquals( 20, $udt_arr[$date_epoch][1]['object_type_id'] );                              //Regular Time
		$this->assertEquals( $udt_arr[$date_epoch][1]['pay_code_id'], $this->policy_ids['pay_code'][100] ); //Regular Time
		$this->assertEquals( $udt_arr[$date_epoch][1]['total_time'], ( 12 * 3600 ) );
		//Make sure no other hours
		$this->assertCount( 2, $udt_arr[$date_epoch] );

		//
		//Day of Week: 6
		//
		$date_epoch = TTDate::incrementDate( TTDate::getMiddleDayEpoch( TTDate::getBeginWeekEpoch( time() ) ), 5, 'day' );
		$date_stamp = TTDate::getDate( 'DATE', $date_epoch );

		$dd->createPunchPair( $this->user_id,
							  strtotime( $date_stamp . ' 8:00AM' ),
							  strtotime( $date_stamp . ' 8:00PM' ),
							  [
									  'in_type_id'    => 10,
									  'out_type_id'   => 10,
									  'branch_id'     => 0,
									  'department_id' => 0,
									  'job_id'        => 0,
									  'job_item_id'   => 0,
									  'punch_tag_id'  => []
							  ],
							  true
		);

		$udt_arr = $this->getUserDateTotalArray( $date_epoch, $date_epoch );
		//print_r($udt_arr);
		//Total Time
		$this->assertEquals( 5, $udt_arr[$date_epoch][0]['object_type_id'] );                               //5=System Total
		$this->assertEquals( $udt_arr[$date_epoch][0]['pay_code_id'], TTUUID::getZeroID() );
		$this->assertEquals( $udt_arr[$date_epoch][0]['total_time'], ( 12 * 3600 ) );
		//Regular Time
		$this->assertEquals( 20, $udt_arr[$date_epoch][1]['object_type_id'] );                              //Regular Time
		$this->assertEquals( $udt_arr[$date_epoch][1]['pay_code_id'], $this->policy_ids['pay_code'][100] ); //Regular Time
		$this->assertEquals( $udt_arr[$date_epoch][1]['total_time'], ( 12 * 3600 ) );
		//Make sure no other hours
		$this->assertCount( 2, $udt_arr[$date_epoch] );

		//
		//Day of Week: 7
		//
		$date_epoch = TTDate::incrementDate( TTDate::getMiddleDayEpoch( TTDate::getBeginWeekEpoch( time() ) ), 6, 'day' );
		$date_stamp = TTDate::getDate( 'DATE', $date_epoch );

		$dd->createPunchPair( $this->user_id,
							  strtotime( $date_stamp . ' 8:00AM' ),
							  strtotime( $date_stamp . ' 8:00PM' ),
							  [
									  'in_type_id'    => 10,
									  'out_type_id'   => 10,
									  'branch_id'     => 0,
									  'department_id' => 0,
									  'job_id'        => 0,
									  'job_item_id'   => 0,
									  'punch_tag_id'  => []
							  ],
							  true
		);

		$udt_arr = $this->getUserDateTotalArray( $date_epoch, $date_epoch );
		//print_r($udt_arr);
		//Total Time
		$this->assertEquals( 5, $udt_arr[$date_epoch][0]['object_type_id'] );                               //5=System Total
		$this->assertEquals( $udt_arr[$date_epoch][0]['pay_code_id'], TTUUID::getZeroID() );
		$this->assertEquals( $udt_arr[$date_epoch][0]['total_time'], ( 12 * 3600 ) );
		//Overtime 1
		$this->assertEquals( 30, $udt_arr[$date_epoch][1]['object_type_id'] );                              //OverTime
		$this->assertEquals( $udt_arr[$date_epoch][1]['pay_code_id'], $policy_ids['pay_code'][0] );
		$this->assertEquals( $udt_arr[$date_epoch][1]['total_time'], ( 12 * 3600 ) );
		//Make sure no other hours
		$this->assertCount( 2, $udt_arr[$date_epoch] );

		//
		//Day of Week: 8
		//
		$date_epoch = TTDate::incrementDate( TTDate::getMiddleDayEpoch( TTDate::getBeginWeekEpoch( time() ) ), 7, 'day' );
		$date_stamp = TTDate::getDate( 'DATE', $date_epoch );

		$dd->createPunchPair( $this->user_id,
							  strtotime( $date_stamp . ' 8:00AM' ),
							  strtotime( $date_stamp . ' 8:00PM' ),
							  [
									  'in_type_id'    => 10,
									  'out_type_id'   => 10,
									  'branch_id'     => 0,
									  'department_id' => 0,
									  'job_id'        => 0,
									  'job_item_id'   => 0,
									  'punch_tag_id'  => []
							  ],
							  true
		);

		$udt_arr = $this->getUserDateTotalArray( $date_epoch, $date_epoch );
		//print_r($udt_arr);
		//Total Time
		$this->assertEquals( 5, $udt_arr[$date_epoch][0]['object_type_id'] );                               //5=System Total
		$this->assertEquals( $udt_arr[$date_epoch][0]['pay_code_id'], TTUUID::getZeroID() );
		$this->assertEquals( $udt_arr[$date_epoch][0]['total_time'], ( 12 * 3600 ) );
		//Regular Time
		$this->assertEquals( 20, $udt_arr[$date_epoch][1]['object_type_id'] );                              //Regular Time
		$this->assertEquals( $udt_arr[$date_epoch][1]['pay_code_id'], $this->policy_ids['pay_code'][100] ); //Regular Time
		$this->assertEquals( $udt_arr[$date_epoch][1]['total_time'], ( 12 * 3600 ) );
		//Make sure no other hours
		$this->assertCount( 2, $udt_arr[$date_epoch] );

		return true;
	}

	/**
	 * @group OvertimePolicy_test2ConsecutiveDaysOverTimePolicyA
	 */
	function test2ConsecutiveDaysOverTimePolicyA() {
		global $dd;

		$policy_ids['pay_formula_policy'][] = $this->createPayFormulaPolicy( $this->company_id, 200 );      //OT1.5
		$policy_ids['pay_formula_policy'][] = $this->createPayFormulaPolicy( $this->company_id, 210 );      //OT2.0
		$policy_ids['pay_formula_policy'][] = $this->createPayFormulaPolicy( $this->company_id, 220 );      //OT2.5

		$policy_ids['pay_code'][] = $this->createPayCode( $this->company_id, 200, $policy_ids['pay_formula_policy'][0] );
		$policy_ids['pay_code'][] = $this->createPayCode( $this->company_id, 210, $policy_ids['pay_formula_policy'][1] );
		$policy_ids['pay_code'][] = $this->createPayCode( $this->company_id, 220, $policy_ids['pay_formula_policy'][2] );

		$policy_ids['overtime'][] = $this->createOverTimePolicy( $this->company_id, 2300, $this->policy_ids['contributing_shift_policy'][12], $policy_ids['pay_code'][0] );
		//$policy_ids['overtime'][] = $this->createOverTimePolicy( $this->company_id, 210, $this->policy_ids['contributing_shift_policy'][12], $policy_ids['pay_code'][1] );
		//$policy_ids['overtime'][] = $this->createOverTimePolicy( $this->company_id, 220, $this->policy_ids['contributing_shift_policy'][12], $policy_ids['pay_code'][2] );
		//print_r($policy_ids['overtime']);

		//Create Policy Group
		$dd->createPolicyGroup( $this->company_id,
								null, //Meal
								null, //Exception
								null, //Holiday
								$policy_ids['overtime'], //OT
								null, //Premium
								null, //Round
								[ $this->user_id ], //Users
								null, //Break
								null, //Accrual
								null, //Expense
								null, //Absence
								[ $this->policy_ids['regular'][12] ] //Regular
		);

		$date_epoch = TTDate::getMiddleDayEpoch( TTDate::getBeginWeekEpoch( time() ) );
		$date_stamp = TTDate::getDate( 'DATE', $date_epoch );

		//
		//Day of Week: 1
		//
		$dd->createPunchPair( $this->user_id,
							  strtotime( $date_stamp . ' 8:00AM' ),
							  strtotime( $date_stamp . ' 8:00PM' ),
							  [
									  'in_type_id'    => 10,
									  'out_type_id'   => 10,
									  'branch_id'     => 0,
									  'department_id' => 0,
									  'job_id'        => 0,
									  'job_item_id'   => 0,
									  'punch_tag_id'  => []
							  ],
							  true
		);

		$udt_arr = $this->getUserDateTotalArray( $date_epoch, $date_epoch );
		//print_r($udt_arr);
		//Total Time
		$this->assertEquals( 5, $udt_arr[$date_epoch][0]['object_type_id'] );                               //5=System Total
		$this->assertEquals( $udt_arr[$date_epoch][0]['pay_code_id'], TTUUID::getZeroID() );
		$this->assertEquals( $udt_arr[$date_epoch][0]['total_time'], ( 12 * 3600 ) );
		//Regular Time
		$this->assertEquals( 20, $udt_arr[$date_epoch][1]['object_type_id'] );                              //Regular Time
		$this->assertEquals( $udt_arr[$date_epoch][1]['pay_code_id'], $this->policy_ids['pay_code'][100] ); //Regular Time
		$this->assertEquals( $udt_arr[$date_epoch][1]['total_time'], ( 12 * 3600 ) );
		//Make sure no other hours
		$this->assertCount( 2, $udt_arr[$date_epoch] );

		//
		//Day of Week: 2
		//
		$date_epoch = TTDate::incrementDate( TTDate::getMiddleDayEpoch( TTDate::getBeginWeekEpoch( time() ) ), 1, 'day' );
		$date_stamp = TTDate::getDate( 'DATE', $date_epoch );

		$dd->createPunchPair( $this->user_id,
							  strtotime( $date_stamp . ' 8:00AM' ),
							  strtotime( $date_stamp . ' 8:00PM' ),
							  [
									  'in_type_id'    => 10,
									  'out_type_id'   => 10,
									  'branch_id'     => 0,
									  'department_id' => 0,
									  'job_id'        => 0,
									  'job_item_id'   => 0,
									  'punch_tag_id'  => []
							  ],
							  true
		);

		$udt_arr = $this->getUserDateTotalArray( $date_epoch, $date_epoch );
		//Total Time
		$this->assertEquals( 5, $udt_arr[$date_epoch][0]['object_type_id'] );                               //5=System Total
		$this->assertEquals( $udt_arr[$date_epoch][0]['pay_code_id'], TTUUID::getZeroID() );
		$this->assertEquals( $udt_arr[$date_epoch][0]['total_time'], ( 12 * 3600 ) );
		//Overtime 1
		$this->assertEquals( 30, $udt_arr[$date_epoch][1]['object_type_id'] );                              //OverTime
		$this->assertEquals( $udt_arr[$date_epoch][1]['pay_code_id'], $policy_ids['pay_code'][0] );
		$this->assertEquals( $udt_arr[$date_epoch][1]['total_time'], ( 12 * 3600 ) );
		//Make sure no other hours
		$this->assertCount( 2, $udt_arr[$date_epoch] );

		//
		//Day of Week: 3
		//
		$date_epoch = TTDate::incrementDate( TTDate::getMiddleDayEpoch( TTDate::getBeginWeekEpoch( time() ) ), 2, 'day' );
		$date_stamp = TTDate::getDate( 'DATE', $date_epoch );

		$dd->createPunchPair( $this->user_id,
							  strtotime( $date_stamp . ' 8:00AM' ),
							  strtotime( $date_stamp . ' 8:00PM' ),
							  [
									  'in_type_id'    => 10,
									  'out_type_id'   => 10,
									  'branch_id'     => 0,
									  'department_id' => 0,
									  'job_id'        => 0,
									  'job_item_id'   => 0,
									  'punch_tag_id'  => []
							  ],
							  true
		);

		$udt_arr = $this->getUserDateTotalArray( $date_epoch, $date_epoch );
		//Total Time
		$this->assertEquals( 5, $udt_arr[$date_epoch][0]['object_type_id'] );                               //5=System Total
		$this->assertEquals( $udt_arr[$date_epoch][0]['pay_code_id'], TTUUID::getZeroID() );
		$this->assertEquals( $udt_arr[$date_epoch][0]['total_time'], ( 12 * 3600 ) );
		//Overtime 1
		$this->assertEquals( 30, $udt_arr[$date_epoch][1]['object_type_id'] );                              //OverTime
		$this->assertEquals( $udt_arr[$date_epoch][1]['pay_code_id'], $policy_ids['pay_code'][0] );
		$this->assertEquals( $udt_arr[$date_epoch][1]['total_time'], ( 12 * 3600 ) );
		//Make sure no other hours
		$this->assertCount( 2, $udt_arr[$date_epoch] );

		//
		//Day of Week: 4
		//
		$date_epoch = TTDate::incrementDate( TTDate::getMiddleDayEpoch( TTDate::getBeginWeekEpoch( time() ) ), 3, 'day' );
		$date_stamp = TTDate::getDate( 'DATE', $date_epoch );

		$dd->createPunchPair( $this->user_id,
							  strtotime( $date_stamp . ' 8:00AM' ),
							  strtotime( $date_stamp . ' 8:00PM' ),
							  [
									  'in_type_id'    => 10,
									  'out_type_id'   => 10,
									  'branch_id'     => 0,
									  'department_id' => 0,
									  'job_id'        => 0,
									  'job_item_id'   => 0,
									  'punch_tag_id'  => []
							  ],
							  true
		);

		$udt_arr = $this->getUserDateTotalArray( $date_epoch, $date_epoch );
		//print_r($udt_arr);
		//Total Time
		$this->assertEquals( 5, $udt_arr[$date_epoch][0]['object_type_id'] );                               //5=System Total
		$this->assertEquals( $udt_arr[$date_epoch][0]['pay_code_id'], TTUUID::getZeroID() );
		$this->assertEquals( $udt_arr[$date_epoch][0]['total_time'], ( 12 * 3600 ) );
		//Overtime 1
		$this->assertEquals( 30, $udt_arr[$date_epoch][1]['object_type_id'] );                              //OverTime
		$this->assertEquals( $udt_arr[$date_epoch][1]['pay_code_id'], $policy_ids['pay_code'][0] );
		$this->assertEquals( $udt_arr[$date_epoch][1]['total_time'], ( 12 * 3600 ) );
		//Make sure no other hours
		$this->assertCount( 2, $udt_arr[$date_epoch] );

		//
		//Day of Week: 5
		//
		$date_epoch = TTDate::incrementDate( TTDate::getMiddleDayEpoch( TTDate::getBeginWeekEpoch( time() ) ), 4, 'day' );
		$date_stamp = TTDate::getDate( 'DATE', $date_epoch );

		$dd->createPunchPair( $this->user_id,
							  strtotime( $date_stamp . ' 8:00AM' ),
							  strtotime( $date_stamp . ' 8:00PM' ),
							  [
									  'in_type_id'    => 10,
									  'out_type_id'   => 10,
									  'branch_id'     => 0,
									  'department_id' => 0,
									  'job_id'        => 0,
									  'job_item_id'   => 0,
									  'punch_tag_id'  => []
							  ],
							  true
		);

		$udt_arr = $this->getUserDateTotalArray( $date_epoch, $date_epoch );
		//print_r($udt_arr);
		//Total Time
		$this->assertEquals( 5, $udt_arr[$date_epoch][0]['object_type_id'] );                               //5=System Total
		$this->assertEquals( $udt_arr[$date_epoch][0]['pay_code_id'], TTUUID::getZeroID() );
		$this->assertEquals( $udt_arr[$date_epoch][0]['total_time'], ( 12 * 3600 ) );
		//Overtime 1
		$this->assertEquals( 30, $udt_arr[$date_epoch][1]['object_type_id'] );                              //OverTime
		$this->assertEquals( $udt_arr[$date_epoch][1]['pay_code_id'], $policy_ids['pay_code'][0] );
		$this->assertEquals( $udt_arr[$date_epoch][1]['total_time'], ( 12 * 3600 ) );
		//Make sure no other hours
		$this->assertCount( 2, $udt_arr[$date_epoch] );

		//
		//Day of Week: 6
		//
		$date_epoch = TTDate::incrementDate( TTDate::getMiddleDayEpoch( TTDate::getBeginWeekEpoch( time() ) ), 5, 'day' );
		$date_stamp = TTDate::getDate( 'DATE', $date_epoch );

		$dd->createPunchPair( $this->user_id,
							  strtotime( $date_stamp . ' 8:00AM' ),
							  strtotime( $date_stamp . ' 8:00PM' ),
							  [
									  'in_type_id'    => 10,
									  'out_type_id'   => 10,
									  'branch_id'     => 0,
									  'department_id' => 0,
									  'job_id'        => 0,
									  'job_item_id'   => 0,
									  'punch_tag_id'  => []
							  ],
							  true
		);

		$udt_arr = $this->getUserDateTotalArray( $date_epoch, $date_epoch );
		//print_r($udt_arr);
		//Total Time
		$this->assertEquals( 5, $udt_arr[$date_epoch][0]['object_type_id'] );                               //5=System Total
		$this->assertEquals( $udt_arr[$date_epoch][0]['pay_code_id'], TTUUID::getZeroID() );
		$this->assertEquals( $udt_arr[$date_epoch][0]['total_time'], ( 12 * 3600 ) );
		//Overtime 1
		$this->assertEquals( 30, $udt_arr[$date_epoch][1]['object_type_id'] );                              //OverTime
		$this->assertEquals( $udt_arr[$date_epoch][1]['pay_code_id'], $policy_ids['pay_code'][0] );
		$this->assertEquals( $udt_arr[$date_epoch][1]['total_time'], ( 12 * 3600 ) );
		//Make sure no other hours
		$this->assertCount( 2, $udt_arr[$date_epoch] );

		//
		//Day of Week: 7
		//
		$date_epoch = TTDate::incrementDate( TTDate::getMiddleDayEpoch( TTDate::getBeginWeekEpoch( time() ) ), 6, 'day' );
		$date_stamp = TTDate::getDate( 'DATE', $date_epoch );

		$dd->createPunchPair( $this->user_id,
							  strtotime( $date_stamp . ' 8:00AM' ),
							  strtotime( $date_stamp . ' 8:00PM' ),
							  [
									  'in_type_id'    => 10,
									  'out_type_id'   => 10,
									  'branch_id'     => 0,
									  'department_id' => 0,
									  'job_id'        => 0,
									  'job_item_id'   => 0,
									  'punch_tag_id'  => []
							  ],
							  true
		);

		$udt_arr = $this->getUserDateTotalArray( $date_epoch, $date_epoch );
		//print_r($udt_arr);
		//Total Time
		$this->assertEquals( 5, $udt_arr[$date_epoch][0]['object_type_id'] );                               //5=System Total
		$this->assertEquals( $udt_arr[$date_epoch][0]['pay_code_id'], TTUUID::getZeroID() );
		$this->assertEquals( $udt_arr[$date_epoch][0]['total_time'], ( 12 * 3600 ) );
		//Overtime 1
		$this->assertEquals( 30, $udt_arr[$date_epoch][1]['object_type_id'] );                              //OverTime
		$this->assertEquals( $udt_arr[$date_epoch][1]['pay_code_id'], $policy_ids['pay_code'][0] );
		$this->assertEquals( $udt_arr[$date_epoch][1]['total_time'], ( 12 * 3600 ) );
		//Make sure no other hours
		$this->assertCount( 2, $udt_arr[$date_epoch] );

		//
		//Day of Week: 8
		//
		$date_epoch = TTDate::incrementDate( TTDate::getMiddleDayEpoch( TTDate::getBeginWeekEpoch( time() ) ), 7, 'day' );
		$date_stamp = TTDate::getDate( 'DATE', $date_epoch );

		$dd->createPunchPair( $this->user_id,
							  strtotime( $date_stamp . ' 8:00AM' ),
							  strtotime( $date_stamp . ' 8:00PM' ),
							  [
									  'in_type_id'    => 10,
									  'out_type_id'   => 10,
									  'branch_id'     => 0,
									  'department_id' => 0,
									  'job_id'        => 0,
									  'job_item_id'   => 0,
									  'punch_tag_id'  => []
							  ],
							  true
		);

		$udt_arr = $this->getUserDateTotalArray( $date_epoch, $date_epoch );
		//print_r($udt_arr);
		//Total Time
		$this->assertEquals( 5, $udt_arr[$date_epoch][0]['object_type_id'] );                               //5=System Total
		$this->assertEquals( $udt_arr[$date_epoch][0]['pay_code_id'], TTUUID::getZeroID() );
		$this->assertEquals( $udt_arr[$date_epoch][0]['total_time'], ( 12 * 3600 ) );
		//Overtime 1
		$this->assertEquals( 30, $udt_arr[$date_epoch][1]['object_type_id'] );                              //OverTime
		$this->assertEquals( $udt_arr[$date_epoch][1]['pay_code_id'], $policy_ids['pay_code'][0] );
		$this->assertEquals( $udt_arr[$date_epoch][1]['total_time'], ( 12 * 3600 ) );
		//Make sure no other hours
		$this->assertCount( 2, $udt_arr[$date_epoch] );

		return true;
	}

	/**
	 * @group OvertimePolicy_test7ConsecutiveDaysOverTimePolicyA
	 */
	function test7ConsecutiveDaysOverTimePolicyA() {
		global $dd;

		$policy_ids['pay_formula_policy'][] = $this->createPayFormulaPolicy( $this->company_id, 200 );      //OT1.5
		$policy_ids['pay_formula_policy'][] = $this->createPayFormulaPolicy( $this->company_id, 210 );      //OT2.0
		$policy_ids['pay_formula_policy'][] = $this->createPayFormulaPolicy( $this->company_id, 220 );      //OT2.5

		$policy_ids['pay_code'][] = $this->createPayCode( $this->company_id, 200, $policy_ids['pay_formula_policy'][0] );
		$policy_ids['pay_code'][] = $this->createPayCode( $this->company_id, 210, $policy_ids['pay_formula_policy'][1] );
		$policy_ids['pay_code'][] = $this->createPayCode( $this->company_id, 220, $policy_ids['pay_formula_policy'][2] );

		$policy_ids['overtime'][] = $this->createOverTimePolicy( $this->company_id, 2305, $this->policy_ids['contributing_shift_policy'][12], $policy_ids['pay_code'][0] );
		//$policy_ids['overtime'][] = $this->createOverTimePolicy( $this->company_id, 210, $this->policy_ids['contributing_shift_policy'][12], $policy_ids['pay_code'][1] );
		//$policy_ids['overtime'][] = $this->createOverTimePolicy( $this->company_id, 220, $this->policy_ids['contributing_shift_policy'][12], $policy_ids['pay_code'][2] );
		//print_r($policy_ids['overtime']);

		//Create Policy Group
		$dd->createPolicyGroup( $this->company_id,
								null, //Meal
								null, //Exception
								null, //Holiday
								$policy_ids['overtime'], //OT
								null, //Premium
								null, //Round
								[ $this->user_id ], //Users
								null, //Break
								null, //Accrual
								null, //Expense
								null, //Absence
								[ $this->policy_ids['regular'][12] ] //Regular
		);

		$date_epoch = TTDate::getMiddleDayEpoch( TTDate::getBeginWeekEpoch( time() ) );
		$date_stamp = TTDate::getDate( 'DATE', $date_epoch );

		//
		//Day of Week: 1
		//
		$dd->createPunchPair( $this->user_id,
							  strtotime( $date_stamp . ' 8:00AM' ),
							  strtotime( $date_stamp . ' 8:00PM' ),
							  [
									  'in_type_id'    => 10,
									  'out_type_id'   => 10,
									  'branch_id'     => 0,
									  'department_id' => 0,
									  'job_id'        => 0,
									  'job_item_id'   => 0,
									  'punch_tag_id'  => []
							  ],
							  true
		);

		$udt_arr = $this->getUserDateTotalArray( $date_epoch, $date_epoch );
		//print_r($udt_arr);
		//Total Time
		$this->assertEquals( 5, $udt_arr[$date_epoch][0]['object_type_id'] );                               //5=System Total
		$this->assertEquals( $udt_arr[$date_epoch][0]['pay_code_id'], TTUUID::getZeroID() );
		$this->assertEquals( $udt_arr[$date_epoch][0]['total_time'], ( 12 * 3600 ) );
		//Regular Time
		$this->assertEquals( 20, $udt_arr[$date_epoch][1]['object_type_id'] );                              //Regular Time
		$this->assertEquals( $udt_arr[$date_epoch][1]['pay_code_id'], $this->policy_ids['pay_code'][100] ); //Regular Time
		$this->assertEquals( $udt_arr[$date_epoch][1]['total_time'], ( 12 * 3600 ) );
		//Make sure no other hours
		$this->assertCount( 2, $udt_arr[$date_epoch] );

		//
		//Day of Week: 2
		//
		$date_epoch = TTDate::incrementDate( TTDate::getMiddleDayEpoch( TTDate::getBeginWeekEpoch( time() ) ), 1, 'day' );
		$date_stamp = TTDate::getDate( 'DATE', $date_epoch );

		$dd->createPunchPair( $this->user_id,
							  strtotime( $date_stamp . ' 8:00AM' ),
							  strtotime( $date_stamp . ' 8:00PM' ),
							  [
									  'in_type_id'    => 10,
									  'out_type_id'   => 10,
									  'branch_id'     => 0,
									  'department_id' => 0,
									  'job_id'        => 0,
									  'job_item_id'   => 0,
									  'punch_tag_id'  => []
							  ],
							  true
		);

		$udt_arr = $this->getUserDateTotalArray( $date_epoch, $date_epoch );
		//Total Time
		$this->assertEquals( 5, $udt_arr[$date_epoch][0]['object_type_id'] );                               //5=System Total
		$this->assertEquals( $udt_arr[$date_epoch][0]['pay_code_id'], TTUUID::getZeroID() );
		$this->assertEquals( $udt_arr[$date_epoch][0]['total_time'], ( 12 * 3600 ) );
		//Regular Time
		$this->assertEquals( 20, $udt_arr[$date_epoch][1]['object_type_id'] );                              //Regular Time
		$this->assertEquals( $udt_arr[$date_epoch][1]['pay_code_id'], $this->policy_ids['pay_code'][100] ); //Regular Time
		$this->assertEquals( $udt_arr[$date_epoch][1]['total_time'], ( 12 * 3600 ) );
		//Make sure no other hours
		$this->assertCount( 2, $udt_arr[$date_epoch] );

		//
		//Day of Week: 3
		//
		$date_epoch = TTDate::incrementDate( TTDate::getMiddleDayEpoch( TTDate::getBeginWeekEpoch( time() ) ), 2, 'day' );
		$date_stamp = TTDate::getDate( 'DATE', $date_epoch );

		$dd->createPunchPair( $this->user_id,
							  strtotime( $date_stamp . ' 8:00AM' ),
							  strtotime( $date_stamp . ' 8:00PM' ),
							  [
									  'in_type_id'    => 10,
									  'out_type_id'   => 10,
									  'branch_id'     => 0,
									  'department_id' => 0,
									  'job_id'        => 0,
									  'job_item_id'   => 0,
									  'punch_tag_id'  => []
							  ],
							  true
		);

		$udt_arr = $this->getUserDateTotalArray( $date_epoch, $date_epoch );
		//Total Time
		$this->assertEquals( 5, $udt_arr[$date_epoch][0]['object_type_id'] );                               //5=System Total
		$this->assertEquals( $udt_arr[$date_epoch][0]['pay_code_id'], TTUUID::getZeroID() );
		$this->assertEquals( $udt_arr[$date_epoch][0]['total_time'], ( 12 * 3600 ) );
		//Regular Time
		$this->assertEquals( 20, $udt_arr[$date_epoch][1]['object_type_id'] );                              //Regular Time
		$this->assertEquals( $udt_arr[$date_epoch][1]['pay_code_id'], $this->policy_ids['pay_code'][100] ); //Regular Time
		$this->assertEquals( $udt_arr[$date_epoch][1]['total_time'], ( 12 * 3600 ) );
		//Make sure no other hours
		$this->assertCount( 2, $udt_arr[$date_epoch] );

		//
		//Day of Week: 4
		//
		$date_epoch = TTDate::incrementDate( TTDate::getMiddleDayEpoch( TTDate::getBeginWeekEpoch( time() ) ), 3, 'day' );
		$date_stamp = TTDate::getDate( 'DATE', $date_epoch );

		$dd->createPunchPair( $this->user_id,
							  strtotime( $date_stamp . ' 8:00AM' ),
							  strtotime( $date_stamp . ' 8:00PM' ),
							  [
									  'in_type_id'    => 10,
									  'out_type_id'   => 10,
									  'branch_id'     => 0,
									  'department_id' => 0,
									  'job_id'        => 0,
									  'job_item_id'   => 0,
									  'punch_tag_id'  => []
							  ],
							  true
		);

		$udt_arr = $this->getUserDateTotalArray( $date_epoch, $date_epoch );
		//print_r($udt_arr);
		//Total Time
		$this->assertEquals( 5, $udt_arr[$date_epoch][0]['object_type_id'] );                               //5=System Total
		$this->assertEquals( $udt_arr[$date_epoch][0]['pay_code_id'], TTUUID::getZeroID() );
		$this->assertEquals( $udt_arr[$date_epoch][0]['total_time'], ( 12 * 3600 ) );
		//Regular Time
		$this->assertEquals( 20, $udt_arr[$date_epoch][1]['object_type_id'] );                              //Regular Time
		$this->assertEquals( $udt_arr[$date_epoch][1]['pay_code_id'], $this->policy_ids['pay_code'][100] ); //Regular Time
		$this->assertEquals( $udt_arr[$date_epoch][1]['total_time'], ( 12 * 3600 ) );
		//Make sure no other hours
		$this->assertCount( 2, $udt_arr[$date_epoch] );

		//
		//Day of Week: 5
		//
		$date_epoch = TTDate::incrementDate( TTDate::getMiddleDayEpoch( TTDate::getBeginWeekEpoch( time() ) ), 4, 'day' );
		$date_stamp = TTDate::getDate( 'DATE', $date_epoch );

		$dd->createPunchPair( $this->user_id,
							  strtotime( $date_stamp . ' 8:00AM' ),
							  strtotime( $date_stamp . ' 8:00PM' ),
							  [
									  'in_type_id'    => 10,
									  'out_type_id'   => 10,
									  'branch_id'     => 0,
									  'department_id' => 0,
									  'job_id'        => 0,
									  'job_item_id'   => 0,
									  'punch_tag_id'  => []
							  ],
							  true
		);

		$udt_arr = $this->getUserDateTotalArray( $date_epoch, $date_epoch );
		//print_r($udt_arr);
		//Total Time
		$this->assertEquals( 5, $udt_arr[$date_epoch][0]['object_type_id'] );                               //5=System Total
		$this->assertEquals( $udt_arr[$date_epoch][0]['pay_code_id'], TTUUID::getZeroID() );
		$this->assertEquals( $udt_arr[$date_epoch][0]['total_time'], ( 12 * 3600 ) );
		//Regular Time
		$this->assertEquals( 20, $udt_arr[$date_epoch][1]['object_type_id'] );                              //Regular Time
		$this->assertEquals( $udt_arr[$date_epoch][1]['pay_code_id'], $this->policy_ids['pay_code'][100] ); //Regular Time
		$this->assertEquals( $udt_arr[$date_epoch][1]['total_time'], ( 12 * 3600 ) );
		//Make sure no other hours
		$this->assertCount( 2, $udt_arr[$date_epoch] );

		//
		//Day of Week: 6
		//
		$date_epoch = TTDate::incrementDate( TTDate::getMiddleDayEpoch( TTDate::getBeginWeekEpoch( time() ) ), 5, 'day' );
		$date_stamp = TTDate::getDate( 'DATE', $date_epoch );

		$dd->createPunchPair( $this->user_id,
							  strtotime( $date_stamp . ' 8:00AM' ),
							  strtotime( $date_stamp . ' 8:00PM' ),
							  [
									  'in_type_id'    => 10,
									  'out_type_id'   => 10,
									  'branch_id'     => 0,
									  'department_id' => 0,
									  'job_id'        => 0,
									  'job_item_id'   => 0,
									  'punch_tag_id'  => []
							  ],
							  true
		);

		$udt_arr = $this->getUserDateTotalArray( $date_epoch, $date_epoch );
		//print_r($udt_arr);
		//Total Time
		$this->assertEquals( 5, $udt_arr[$date_epoch][0]['object_type_id'] );                               //5=System Total
		$this->assertEquals( $udt_arr[$date_epoch][0]['pay_code_id'], TTUUID::getZeroID() );
		$this->assertEquals( $udt_arr[$date_epoch][0]['total_time'], ( 12 * 3600 ) );
		//Regular Time
		$this->assertEquals( 20, $udt_arr[$date_epoch][1]['object_type_id'] );                              //Regular Time
		$this->assertEquals( $udt_arr[$date_epoch][1]['pay_code_id'], $this->policy_ids['pay_code'][100] ); //Regular Time
		$this->assertEquals( $udt_arr[$date_epoch][1]['total_time'], ( 12 * 3600 ) );
		//Make sure no other hours
		$this->assertCount( 2, $udt_arr[$date_epoch] );

		//
		//Day of Week: 7
		//
		$date_epoch = TTDate::incrementDate( TTDate::getMiddleDayEpoch( TTDate::getBeginWeekEpoch( time() ) ), 6, 'day' );
		$date_stamp = TTDate::getDate( 'DATE', $date_epoch );

		$dd->createPunchPair( $this->user_id,
							  strtotime( $date_stamp . ' 8:00AM' ),
							  strtotime( $date_stamp . ' 8:00PM' ),
							  [
									  'in_type_id'    => 10,
									  'out_type_id'   => 10,
									  'branch_id'     => 0,
									  'department_id' => 0,
									  'job_id'        => 0,
									  'job_item_id'   => 0,
									  'punch_tag_id'  => []
							  ],
							  true
		);

		$udt_arr = $this->getUserDateTotalArray( $date_epoch, $date_epoch );
		//print_r($udt_arr);
		//Total Time
		$this->assertEquals( 5, $udt_arr[$date_epoch][0]['object_type_id'] );                               //5=System Total
		$this->assertEquals( $udt_arr[$date_epoch][0]['pay_code_id'], TTUUID::getZeroID() );
		$this->assertEquals( $udt_arr[$date_epoch][0]['total_time'], ( 12 * 3600 ) );
		//Overtime 1
		$this->assertEquals( 30, $udt_arr[$date_epoch][1]['object_type_id'] );                              //OverTime
		$this->assertEquals( $udt_arr[$date_epoch][1]['pay_code_id'], $policy_ids['pay_code'][0] );
		$this->assertEquals( $udt_arr[$date_epoch][1]['total_time'], ( 12 * 3600 ) );
		//Make sure no other hours
		$this->assertCount( 2, $udt_arr[$date_epoch] );

		//
		//Day of Week: 8
		//
		$date_epoch = TTDate::incrementDate( TTDate::getMiddleDayEpoch( TTDate::getBeginWeekEpoch( time() ) ), 7, 'day' );
		$date_stamp = TTDate::getDate( 'DATE', $date_epoch );

		$dd->createPunchPair( $this->user_id,
							  strtotime( $date_stamp . ' 8:00AM' ),
							  strtotime( $date_stamp . ' 8:00PM' ),
							  [
									  'in_type_id'    => 10,
									  'out_type_id'   => 10,
									  'branch_id'     => 0,
									  'department_id' => 0,
									  'job_id'        => 0,
									  'job_item_id'   => 0,
									  'punch_tag_id'  => []
							  ],
							  true
		);

		$udt_arr = $this->getUserDateTotalArray( $date_epoch, $date_epoch );
		//print_r($udt_arr);
		//Total Time
		$this->assertEquals( 5, $udt_arr[$date_epoch][0]['object_type_id'] );                               //5=System Total
		$this->assertEquals( $udt_arr[$date_epoch][0]['pay_code_id'], TTUUID::getZeroID() );
		$this->assertEquals( $udt_arr[$date_epoch][0]['total_time'], ( 12 * 3600 ) );
		//Overtime 1
		$this->assertEquals( 30, $udt_arr[$date_epoch][1]['object_type_id'] );                              //OverTime
		$this->assertEquals( $udt_arr[$date_epoch][1]['pay_code_id'], $policy_ids['pay_code'][0] );
		$this->assertEquals( $udt_arr[$date_epoch][1]['total_time'], ( 12 * 3600 ) );
		//Make sure no other hours
		$this->assertCount( 2, $udt_arr[$date_epoch] );

		return true;
	}


	/**
	 * @group OvertimePolicy_test2DaysPerWeekOverTimePolicyA
	 */
	function test2DaysPerWeekOverTimePolicyA() {
		global $dd;

		$policy_ids['pay_formula_policy'][] = $this->createPayFormulaPolicy( $this->company_id, 200 );      //OT1.5
		$policy_ids['pay_formula_policy'][] = $this->createPayFormulaPolicy( $this->company_id, 210 );      //OT2.0
		$policy_ids['pay_formula_policy'][] = $this->createPayFormulaPolicy( $this->company_id, 220 );      //OT2.5

		$policy_ids['pay_code'][] = $this->createPayCode( $this->company_id, 200, $policy_ids['pay_formula_policy'][0] );
		$policy_ids['pay_code'][] = $this->createPayCode( $this->company_id, 210, $policy_ids['pay_formula_policy'][1] );
		$policy_ids['pay_code'][] = $this->createPayCode( $this->company_id, 220, $policy_ids['pay_formula_policy'][2] );

		$policy_ids['overtime'][] = $this->createOverTimePolicy( $this->company_id, 2400, $this->policy_ids['contributing_shift_policy'][12], $policy_ids['pay_code'][0] );
		//$policy_ids['overtime'][] = $this->createOverTimePolicy( $this->company_id, 210, $this->policy_ids['contributing_shift_policy'][12], $policy_ids['pay_code'][1] );
		//$policy_ids['overtime'][] = $this->createOverTimePolicy( $this->company_id, 220, $this->policy_ids['contributing_shift_policy'][12], $policy_ids['pay_code'][2] );
		//print_r($policy_ids['overtime']);

		//Create Policy Group
		$dd->createPolicyGroup( $this->company_id,
								null, //Meal
								null, //Exception
								null, //Holiday
								$policy_ids['overtime'], //OT
								null, //Premium
								null, //Round
								[ $this->user_id ], //Users
								null, //Break
								null, //Accrual
								null, //Expense
								null, //Absence
								[ $this->policy_ids['regular'][12] ] //Regular
		);

		$date_epoch = TTDate::getMiddleDayEpoch( TTDate::getBeginWeekEpoch( time() ) );
		$date_stamp = TTDate::getDate( 'DATE', $date_epoch );

		//
		//Day of Week: 1
		//
		$dd->createPunchPair( $this->user_id,
							  strtotime( $date_stamp . ' 8:00AM' ),
							  strtotime( $date_stamp . ' 8:00PM' ),
							  [
									  'in_type_id'    => 10,
									  'out_type_id'   => 10,
									  'branch_id'     => 0,
									  'department_id' => 0,
									  'job_id'        => 0,
									  'job_item_id'   => 0,
									  'punch_tag_id'  => []
							  ],
							  true
		);

		$udt_arr = $this->getUserDateTotalArray( $date_epoch, $date_epoch );
		//print_r($udt_arr);
		//Total Time
		$this->assertEquals( 5, $udt_arr[$date_epoch][0]['object_type_id'] );                               //5=System Total
		$this->assertEquals( $udt_arr[$date_epoch][0]['pay_code_id'], TTUUID::getZeroID() );
		$this->assertEquals( $udt_arr[$date_epoch][0]['total_time'], ( 12 * 3600 ) );
		//Regular Time
		$this->assertEquals( 20, $udt_arr[$date_epoch][1]['object_type_id'] );                              //Regular Time
		$this->assertEquals( $udt_arr[$date_epoch][1]['pay_code_id'], $this->policy_ids['pay_code'][100] ); //Regular Time
		$this->assertEquals( $udt_arr[$date_epoch][1]['total_time'], ( 12 * 3600 ) );
		//Make sure no other hours
		$this->assertCount( 2, $udt_arr[$date_epoch] );

		//
		//Day of Week: 2
		//
//		$date_epoch = TTDate::incrementDate( TTDate::getMiddleDayEpoch( TTDate::getBeginWeekEpoch( time() ) ), 1, 'day' );
//		$date_stamp = TTDate::getDate('DATE', $date_epoch );
//
//		$dd->createPunchPair( 	$this->user_id,
//								 strtotime($date_stamp.' 8:00AM'),
//								 strtotime($date_stamp.' 8:00PM'),
//								 array(
//										 'in_type_id' => 10,
//										 'out_type_id' => 10,
//										 'branch_id' => 0,
//										 'department_id' => 0,
//										 'job_id' => 0,
//										 'job_item_id' => 0,
//								 ),
//								 TRUE
//		);
//
//		$udt_arr = $this->getUserDateTotalArray( $date_epoch, $date_epoch );
//		//Total Time
//		$this->assertEquals( $udt_arr[$date_epoch][0]['object_type_id'], 5 ); //5=System Total
//		$this->assertEquals( $udt_arr[$date_epoch][0]['pay_code_id'], TTUUID::getZeroID() );
//		$this->assertEquals( $udt_arr[$date_epoch][0]['total_time'], (12 * 3600) );
//		//Regular Time
//		$this->assertEquals( $udt_arr[$date_epoch][1]['object_type_id'], 20 ); //Regular Time
//		$this->assertEquals( $udt_arr[$date_epoch][1]['pay_code_id'], $this->policy_ids['pay_code'][100] ); //Regular Time
//		$this->assertEquals( $udt_arr[$date_epoch][1]['total_time'], (12 * 3600) );
//		//Make sure no other hours
//		$this->assertEquals( count($udt_arr[$date_epoch]), 2 );

		//
		//Day of Week: 3
		//
		$date_epoch = TTDate::incrementDate( TTDate::getMiddleDayEpoch( TTDate::getBeginWeekEpoch( time() ) ), 2, 'day' );
		$date_stamp = TTDate::getDate( 'DATE', $date_epoch );

		$dd->createPunchPair( $this->user_id,
							  strtotime( $date_stamp . ' 8:00AM' ),
							  strtotime( $date_stamp . ' 8:00PM' ),
							  [
									  'in_type_id'    => 10,
									  'out_type_id'   => 10,
									  'branch_id'     => 0,
									  'department_id' => 0,
									  'job_id'        => 0,
									  'job_item_id'   => 0,
									  'punch_tag_id'  => []
							  ],
							  true
		);

		$udt_arr = $this->getUserDateTotalArray( $date_epoch, $date_epoch );
		//Total Time
		$this->assertEquals( 5, $udt_arr[$date_epoch][0]['object_type_id'] );                               //5=System Total
		$this->assertEquals( $udt_arr[$date_epoch][0]['pay_code_id'], TTUUID::getZeroID() );
		$this->assertEquals( $udt_arr[$date_epoch][0]['total_time'], ( 12 * 3600 ) );
		//Overtime 1
		$this->assertEquals( 30, $udt_arr[$date_epoch][1]['object_type_id'] );                              //OverTime
		$this->assertEquals( $udt_arr[$date_epoch][1]['pay_code_id'], $policy_ids['pay_code'][0] );
		$this->assertEquals( $udt_arr[$date_epoch][1]['total_time'], ( 12 * 3600 ) );
		//Make sure no other hours
		$this->assertCount( 2, $udt_arr[$date_epoch] );

		//
		//Day of Week: 4
		//
		$date_epoch = TTDate::incrementDate( TTDate::getMiddleDayEpoch( TTDate::getBeginWeekEpoch( time() ) ), 3, 'day' );
		$date_stamp = TTDate::getDate( 'DATE', $date_epoch );

		$dd->createPunchPair( $this->user_id,
							  strtotime( $date_stamp . ' 8:00AM' ),
							  strtotime( $date_stamp . ' 8:00PM' ),
							  [
									  'in_type_id'    => 10,
									  'out_type_id'   => 10,
									  'branch_id'     => 0,
									  'department_id' => 0,
									  'job_id'        => 0,
									  'job_item_id'   => 0,
									  'punch_tag_id'  => []
							  ],
							  true
		);

		$udt_arr = $this->getUserDateTotalArray( $date_epoch, $date_epoch );
		//print_r($udt_arr);
		//Total Time
		$this->assertEquals( 5, $udt_arr[$date_epoch][0]['object_type_id'] );                               //5=System Total
		$this->assertEquals( $udt_arr[$date_epoch][0]['pay_code_id'], TTUUID::getZeroID() );
		$this->assertEquals( $udt_arr[$date_epoch][0]['total_time'], ( 12 * 3600 ) );
		//Overtime 1
		$this->assertEquals( 30, $udt_arr[$date_epoch][1]['object_type_id'] );                              //OverTime
		$this->assertEquals( $udt_arr[$date_epoch][1]['pay_code_id'], $policy_ids['pay_code'][0] );
		$this->assertEquals( $udt_arr[$date_epoch][1]['total_time'], ( 12 * 3600 ) );
		//Make sure no other hours
		$this->assertCount( 2, $udt_arr[$date_epoch] );

		//
		//Day of Week: 5
		//
		$date_epoch = TTDate::incrementDate( TTDate::getMiddleDayEpoch( TTDate::getBeginWeekEpoch( time() ) ), 4, 'day' );
		$date_stamp = TTDate::getDate( 'DATE', $date_epoch );

		$dd->createPunchPair( $this->user_id,
							  strtotime( $date_stamp . ' 8:00AM' ),
							  strtotime( $date_stamp . ' 8:00PM' ),
							  [
									  'in_type_id'    => 10,
									  'out_type_id'   => 10,
									  'branch_id'     => 0,
									  'department_id' => 0,
									  'job_id'        => 0,
									  'job_item_id'   => 0,
									  'punch_tag_id'  => []
							  ],
							  true
		);

		$udt_arr = $this->getUserDateTotalArray( $date_epoch, $date_epoch );
		//print_r($udt_arr);
		//Total Time
		$this->assertEquals( 5, $udt_arr[$date_epoch][0]['object_type_id'] );                               //5=System Total
		$this->assertEquals( $udt_arr[$date_epoch][0]['pay_code_id'], TTUUID::getZeroID() );
		$this->assertEquals( $udt_arr[$date_epoch][0]['total_time'], ( 12 * 3600 ) );
		//Overtime 1
		$this->assertEquals( 30, $udt_arr[$date_epoch][1]['object_type_id'] );                              //OverTime
		$this->assertEquals( $udt_arr[$date_epoch][1]['pay_code_id'], $policy_ids['pay_code'][0] );
		$this->assertEquals( $udt_arr[$date_epoch][1]['total_time'], ( 12 * 3600 ) );
		//Make sure no other hours
		$this->assertCount( 2, $udt_arr[$date_epoch] );

		//
		//Day of Week: 6
		//
		$date_epoch = TTDate::incrementDate( TTDate::getMiddleDayEpoch( TTDate::getBeginWeekEpoch( time() ) ), 5, 'day' );
		$date_stamp = TTDate::getDate( 'DATE', $date_epoch );

		$dd->createPunchPair( $this->user_id,
							  strtotime( $date_stamp . ' 8:00AM' ),
							  strtotime( $date_stamp . ' 8:00PM' ),
							  [
									  'in_type_id'    => 10,
									  'out_type_id'   => 10,
									  'branch_id'     => 0,
									  'department_id' => 0,
									  'job_id'        => 0,
									  'job_item_id'   => 0,
									  'punch_tag_id'  => []
							  ],
							  true
		);

		$udt_arr = $this->getUserDateTotalArray( $date_epoch, $date_epoch );
		//print_r($udt_arr);
		//Total Time
		$this->assertEquals( 5, $udt_arr[$date_epoch][0]['object_type_id'] );                               //5=System Total
		$this->assertEquals( $udt_arr[$date_epoch][0]['pay_code_id'], TTUUID::getZeroID() );
		$this->assertEquals( $udt_arr[$date_epoch][0]['total_time'], ( 12 * 3600 ) );
		//Overtime 1
		$this->assertEquals( 30, $udt_arr[$date_epoch][1]['object_type_id'] );                              //OverTime
		$this->assertEquals( $udt_arr[$date_epoch][1]['pay_code_id'], $policy_ids['pay_code'][0] );
		$this->assertEquals( $udt_arr[$date_epoch][1]['total_time'], ( 12 * 3600 ) );
		//Make sure no other hours
		$this->assertCount( 2, $udt_arr[$date_epoch] );

		//
		//Day of Week: 7
		//
		$date_epoch = TTDate::incrementDate( TTDate::getMiddleDayEpoch( TTDate::getBeginWeekEpoch( time() ) ), 6, 'day' );
		$date_stamp = TTDate::getDate( 'DATE', $date_epoch );

		$dd->createPunchPair( $this->user_id,
							  strtotime( $date_stamp . ' 8:00AM' ),
							  strtotime( $date_stamp . ' 8:00PM' ),
							  [
									  'in_type_id'    => 10,
									  'out_type_id'   => 10,
									  'branch_id'     => 0,
									  'department_id' => 0,
									  'job_id'        => 0,
									  'job_item_id'   => 0,
									  'punch_tag_id'  => []
							  ],
							  true
		);

		$udt_arr = $this->getUserDateTotalArray( $date_epoch, $date_epoch );
		//print_r($udt_arr);
		//Total Time
		$this->assertEquals( 5, $udt_arr[$date_epoch][0]['object_type_id'] );                               //5=System Total
		$this->assertEquals( $udt_arr[$date_epoch][0]['pay_code_id'], TTUUID::getZeroID() );
		$this->assertEquals( $udt_arr[$date_epoch][0]['total_time'], ( 12 * 3600 ) );
		//Overtime 1
		$this->assertEquals( 30, $udt_arr[$date_epoch][1]['object_type_id'] );                              //OverTime
		$this->assertEquals( $udt_arr[$date_epoch][1]['pay_code_id'], $policy_ids['pay_code'][0] );
		$this->assertEquals( $udt_arr[$date_epoch][1]['total_time'], ( 12 * 3600 ) );
		//Make sure no other hours
		$this->assertCount( 2, $udt_arr[$date_epoch] );

		//
		//Day of Week: 8
		//
		$date_epoch = TTDate::incrementDate( TTDate::getMiddleDayEpoch( TTDate::getBeginWeekEpoch( time() ) ), 7, 'day' );
		$date_stamp = TTDate::getDate( 'DATE', $date_epoch );

		$dd->createPunchPair( $this->user_id,
							  strtotime( $date_stamp . ' 8:00AM' ),
							  strtotime( $date_stamp . ' 8:00PM' ),
							  [
									  'in_type_id'    => 10,
									  'out_type_id'   => 10,
									  'branch_id'     => 0,
									  'department_id' => 0,
									  'job_id'        => 0,
									  'job_item_id'   => 0,
									  'punch_tag_id'  => []
							  ],
							  true
		);

		$udt_arr = $this->getUserDateTotalArray( $date_epoch, $date_epoch );
		//print_r($udt_arr);
		//Total Time
		$this->assertEquals( 5, $udt_arr[$date_epoch][0]['object_type_id'] );                               //5=System Total
		$this->assertEquals( $udt_arr[$date_epoch][0]['pay_code_id'], TTUUID::getZeroID() );
		$this->assertEquals( $udt_arr[$date_epoch][0]['total_time'], ( 12 * 3600 ) );
		//Regular Time
		$this->assertEquals( 20, $udt_arr[$date_epoch][1]['object_type_id'] );                              //Regular Time
		$this->assertEquals( $udt_arr[$date_epoch][1]['pay_code_id'], $this->policy_ids['pay_code'][100] ); //Regular Time
		$this->assertEquals( $udt_arr[$date_epoch][1]['total_time'], ( 12 * 3600 ) );
		//Make sure no other hours
		$this->assertCount( 2, $udt_arr[$date_epoch] );

		return true;
	}

	/**
	 * @group OvertimePolicy_test6DaysPerWeekOverTimePolicyA
	 */
	function test6DaysPerWeekOverTimePolicyA() {
		global $dd;

		$policy_ids['pay_formula_policy'][] = $this->createPayFormulaPolicy( $this->company_id, 200 );      //OT1.5
		$policy_ids['pay_formula_policy'][] = $this->createPayFormulaPolicy( $this->company_id, 210 );      //OT2.0
		$policy_ids['pay_formula_policy'][] = $this->createPayFormulaPolicy( $this->company_id, 220 );      //OT2.5

		$policy_ids['pay_code'][] = $this->createPayCode( $this->company_id, 200, $policy_ids['pay_formula_policy'][0] );
		$policy_ids['pay_code'][] = $this->createPayCode( $this->company_id, 210, $policy_ids['pay_formula_policy'][1] );
		$policy_ids['pay_code'][] = $this->createPayCode( $this->company_id, 220, $policy_ids['pay_formula_policy'][2] );

		$policy_ids['overtime'][] = $this->createOverTimePolicy( $this->company_id, 2404, $this->policy_ids['contributing_shift_policy'][12], $policy_ids['pay_code'][0] );
		//$policy_ids['overtime'][] = $this->createOverTimePolicy( $this->company_id, 210, $this->policy_ids['contributing_shift_policy'][12], $policy_ids['pay_code'][1] );
		//$policy_ids['overtime'][] = $this->createOverTimePolicy( $this->company_id, 220, $this->policy_ids['contributing_shift_policy'][12], $policy_ids['pay_code'][2] );
		//print_r($policy_ids['overtime']);

		//Create Policy Group
		$dd->createPolicyGroup( $this->company_id,
								null, //Meal
								null, //Exception
								null, //Holiday
								$policy_ids['overtime'], //OT
								null, //Premium
								null, //Round
								[ $this->user_id ], //Users
								null, //Break
								null, //Accrual
								null, //Expense
								null, //Absence
								[ $this->policy_ids['regular'][12] ] //Regular
		);

		$date_epoch = TTDate::getMiddleDayEpoch( TTDate::getBeginWeekEpoch( time() ) );
		$date_stamp = TTDate::getDate( 'DATE', $date_epoch );

		//
		//Day of Week: 1
		//
		$dd->createPunchPair( $this->user_id,
							  strtotime( $date_stamp . ' 8:00AM' ),
							  strtotime( $date_stamp . ' 8:00PM' ),
							  [
									  'in_type_id'    => 10,
									  'out_type_id'   => 10,
									  'branch_id'     => 0,
									  'department_id' => 0,
									  'job_id'        => 0,
									  'job_item_id'   => 0,
									  'punch_tag_id'  => []
							  ],
							  true
		);

		$udt_arr = $this->getUserDateTotalArray( $date_epoch, $date_epoch );
		//print_r($udt_arr);
		//Total Time
		$this->assertEquals( 5, $udt_arr[$date_epoch][0]['object_type_id'] );                               //5=System Total
		$this->assertEquals( $udt_arr[$date_epoch][0]['pay_code_id'], TTUUID::getZeroID() );
		$this->assertEquals( $udt_arr[$date_epoch][0]['total_time'], ( 12 * 3600 ) );
		//Regular Time
		$this->assertEquals( 20, $udt_arr[$date_epoch][1]['object_type_id'] );                              //Regular Time
		$this->assertEquals( $udt_arr[$date_epoch][1]['pay_code_id'], $this->policy_ids['pay_code'][100] ); //Regular Time
		$this->assertEquals( $udt_arr[$date_epoch][1]['total_time'], ( 12 * 3600 ) );
		//Make sure no other hours
		$this->assertCount( 2, $udt_arr[$date_epoch] );

		//
		//Day of Week: 2
		//
//		$date_epoch = TTDate::incrementDate( TTDate::getMiddleDayEpoch( TTDate::getBeginWeekEpoch( time() ) ), 1, 'day' );
//		$date_stamp = TTDate::getDate('DATE', $date_epoch );
//
//		$dd->createPunchPair( 	$this->user_id,
//								 strtotime($date_stamp.' 8:00AM'),
//								 strtotime($date_stamp.' 8:00PM'),
//								 array(
//										 'in_type_id' => 10,
//										 'out_type_id' => 10,
//										 'branch_id' => 0,
//										 'department_id' => 0,
//										 'job_id' => 0,
//										 'job_item_id' => 0,
//								 ),
//								 TRUE
//		);
//
//		$udt_arr = $this->getUserDateTotalArray( $date_epoch, $date_epoch );
//		//Total Time
//		$this->assertEquals( $udt_arr[$date_epoch][0]['object_type_id'], 5 ); //5=System Total
//		$this->assertEquals( $udt_arr[$date_epoch][0]['pay_code_id'], TTUUID::getZeroID() );
//		$this->assertEquals( $udt_arr[$date_epoch][0]['total_time'], (12 * 3600) );
//		//Regular Time
//		$this->assertEquals( $udt_arr[$date_epoch][1]['object_type_id'], 20 ); //Regular Time
//		$this->assertEquals( $udt_arr[$date_epoch][1]['pay_code_id'], $this->policy_ids['pay_code'][100] ); //Regular Time
//		$this->assertEquals( $udt_arr[$date_epoch][1]['total_time'], (12 * 3600) );
//		//Make sure no other hours
//		$this->assertEquals( count($udt_arr[$date_epoch]), 2 );

		//
		//Day of Week: 3
		//
		$date_epoch = TTDate::incrementDate( TTDate::getMiddleDayEpoch( TTDate::getBeginWeekEpoch( time() ) ), 2, 'day' );
		$date_stamp = TTDate::getDate( 'DATE', $date_epoch );

		$dd->createPunchPair( $this->user_id,
							  strtotime( $date_stamp . ' 8:00AM' ),
							  strtotime( $date_stamp . ' 8:00PM' ),
							  [
									  'in_type_id'    => 10,
									  'out_type_id'   => 10,
									  'branch_id'     => 0,
									  'department_id' => 0,
									  'job_id'        => 0,
									  'job_item_id'   => 0,
									  'punch_tag_id'  => []
							  ],
							  true
		);

		$udt_arr = $this->getUserDateTotalArray( $date_epoch, $date_epoch );
		//Total Time
		$this->assertEquals( 5, $udt_arr[$date_epoch][0]['object_type_id'] );                               //5=System Total
		$this->assertEquals( $udt_arr[$date_epoch][0]['pay_code_id'], TTUUID::getZeroID() );
		$this->assertEquals( $udt_arr[$date_epoch][0]['total_time'], ( 12 * 3600 ) );
		//Regular Time
		$this->assertEquals( 20, $udt_arr[$date_epoch][1]['object_type_id'] );                              //Regular Time
		$this->assertEquals( $udt_arr[$date_epoch][1]['pay_code_id'], $this->policy_ids['pay_code'][100] ); //Regular Time
		$this->assertEquals( $udt_arr[$date_epoch][1]['total_time'], ( 12 * 3600 ) );
		//Make sure no other hours
		$this->assertCount( 2, $udt_arr[$date_epoch] );

		//
		//Day of Week: 4
		//
		$date_epoch = TTDate::incrementDate( TTDate::getMiddleDayEpoch( TTDate::getBeginWeekEpoch( time() ) ), 3, 'day' );
		$date_stamp = TTDate::getDate( 'DATE', $date_epoch );

		$dd->createPunchPair( $this->user_id,
							  strtotime( $date_stamp . ' 8:00AM' ),
							  strtotime( $date_stamp . ' 8:00PM' ),
							  [
									  'in_type_id'    => 10,
									  'out_type_id'   => 10,
									  'branch_id'     => 0,
									  'department_id' => 0,
									  'job_id'        => 0,
									  'job_item_id'   => 0,
									  'punch_tag_id'  => []
							  ],
							  true
		);

		$udt_arr = $this->getUserDateTotalArray( $date_epoch, $date_epoch );
		//print_r($udt_arr);
		//Total Time
		$this->assertEquals( 5, $udt_arr[$date_epoch][0]['object_type_id'] );                               //5=System Total
		$this->assertEquals( $udt_arr[$date_epoch][0]['pay_code_id'], TTUUID::getZeroID() );
		$this->assertEquals( $udt_arr[$date_epoch][0]['total_time'], ( 12 * 3600 ) );
		//Regular Time
		$this->assertEquals( 20, $udt_arr[$date_epoch][1]['object_type_id'] );                              //Regular Time
		$this->assertEquals( $udt_arr[$date_epoch][1]['pay_code_id'], $this->policy_ids['pay_code'][100] ); //Regular Time
		$this->assertEquals( $udt_arr[$date_epoch][1]['total_time'], ( 12 * 3600 ) );
		//Make sure no other hours
		$this->assertCount( 2, $udt_arr[$date_epoch] );

		//
		//Day of Week: 5
		//
		$date_epoch = TTDate::incrementDate( TTDate::getMiddleDayEpoch( TTDate::getBeginWeekEpoch( time() ) ), 4, 'day' );
		$date_stamp = TTDate::getDate( 'DATE', $date_epoch );

		$dd->createPunchPair( $this->user_id,
							  strtotime( $date_stamp . ' 8:00AM' ),
							  strtotime( $date_stamp . ' 8:00PM' ),
							  [
									  'in_type_id'    => 10,
									  'out_type_id'   => 10,
									  'branch_id'     => 0,
									  'department_id' => 0,
									  'job_id'        => 0,
									  'job_item_id'   => 0,
									  'punch_tag_id'  => []
							  ],
							  true
		);

		$udt_arr = $this->getUserDateTotalArray( $date_epoch, $date_epoch );
		//print_r($udt_arr);
		//Total Time
		$this->assertEquals( 5, $udt_arr[$date_epoch][0]['object_type_id'] );                               //5=System Total
		$this->assertEquals( $udt_arr[$date_epoch][0]['pay_code_id'], TTUUID::getZeroID() );
		$this->assertEquals( $udt_arr[$date_epoch][0]['total_time'], ( 12 * 3600 ) );
		//Regular Time
		$this->assertEquals( 20, $udt_arr[$date_epoch][1]['object_type_id'] );                              //Regular Time
		$this->assertEquals( $udt_arr[$date_epoch][1]['pay_code_id'], $this->policy_ids['pay_code'][100] ); //Regular Time
		$this->assertEquals( $udt_arr[$date_epoch][1]['total_time'], ( 12 * 3600 ) );
		//Make sure no other hours
		$this->assertCount( 2, $udt_arr[$date_epoch] );

		//
		//Day of Week: 6
		//
		$date_epoch = TTDate::incrementDate( TTDate::getMiddleDayEpoch( TTDate::getBeginWeekEpoch( time() ) ), 5, 'day' );
		$date_stamp = TTDate::getDate( 'DATE', $date_epoch );

		$dd->createPunchPair( $this->user_id,
							  strtotime( $date_stamp . ' 8:00AM' ),
							  strtotime( $date_stamp . ' 8:00PM' ),
							  [
									  'in_type_id'    => 10,
									  'out_type_id'   => 10,
									  'branch_id'     => 0,
									  'department_id' => 0,
									  'job_id'        => 0,
									  'job_item_id'   => 0,
									  'punch_tag_id'  => []
							  ],
							  true
		);

		$udt_arr = $this->getUserDateTotalArray( $date_epoch, $date_epoch );
		//print_r($udt_arr);
		//Total Time
		$this->assertEquals( 5, $udt_arr[$date_epoch][0]['object_type_id'] );                               //5=System Total
		$this->assertEquals( $udt_arr[$date_epoch][0]['pay_code_id'], TTUUID::getZeroID() );
		$this->assertEquals( $udt_arr[$date_epoch][0]['total_time'], ( 12 * 3600 ) );
		//Regular Time
		$this->assertEquals( 20, $udt_arr[$date_epoch][1]['object_type_id'] );                              //Regular Time
		$this->assertEquals( $udt_arr[$date_epoch][1]['pay_code_id'], $this->policy_ids['pay_code'][100] ); //Regular Time
		$this->assertEquals( $udt_arr[$date_epoch][1]['total_time'], ( 12 * 3600 ) );
		//Make sure no other hours
		$this->assertCount( 2, $udt_arr[$date_epoch] );

		//
		//Day of Week: 7
		//
		$date_epoch = TTDate::incrementDate( TTDate::getMiddleDayEpoch( TTDate::getBeginWeekEpoch( time() ) ), 6, 'day' );
		$date_stamp = TTDate::getDate( 'DATE', $date_epoch );

		$dd->createPunchPair( $this->user_id,
							  strtotime( $date_stamp . ' 8:00AM' ),
							  strtotime( $date_stamp . ' 8:00PM' ),
							  [
									  'in_type_id'    => 10,
									  'out_type_id'   => 10,
									  'branch_id'     => 0,
									  'department_id' => 0,
									  'job_id'        => 0,
									  'job_item_id'   => 0,
									  'punch_tag_id'  => []
							  ],
							  true
		);

		$udt_arr = $this->getUserDateTotalArray( $date_epoch, $date_epoch );
		//print_r($udt_arr);
		//Total Time
		$this->assertEquals( 5, $udt_arr[$date_epoch][0]['object_type_id'] );                               //5=System Total
		$this->assertEquals( $udt_arr[$date_epoch][0]['pay_code_id'], TTUUID::getZeroID() );
		$this->assertEquals( $udt_arr[$date_epoch][0]['total_time'], ( 12 * 3600 ) );
		//Overtime 1
		$this->assertEquals( 30, $udt_arr[$date_epoch][1]['object_type_id'] );                              //OverTime
		$this->assertEquals( $udt_arr[$date_epoch][1]['pay_code_id'], $policy_ids['pay_code'][0] );
		$this->assertEquals( $udt_arr[$date_epoch][1]['total_time'], ( 12 * 3600 ) );
		//Make sure no other hours
		$this->assertCount( 2, $udt_arr[$date_epoch] );

		//
		//Day of Week: 8
		//
		$date_epoch = TTDate::incrementDate( TTDate::getMiddleDayEpoch( TTDate::getBeginWeekEpoch( time() ) ), 7, 'day' );
		$date_stamp = TTDate::getDate( 'DATE', $date_epoch );

		$dd->createPunchPair( $this->user_id,
							  strtotime( $date_stamp . ' 8:00AM' ),
							  strtotime( $date_stamp . ' 8:00PM' ),
							  [
									  'in_type_id'    => 10,
									  'out_type_id'   => 10,
									  'branch_id'     => 0,
									  'department_id' => 0,
									  'job_id'        => 0,
									  'job_item_id'   => 0,
									  'punch_tag_id'  => []
							  ],
							  true
		);

		$udt_arr = $this->getUserDateTotalArray( $date_epoch, $date_epoch );
		//print_r($udt_arr);
		//Total Time
		$this->assertEquals( 5, $udt_arr[$date_epoch][0]['object_type_id'] );                               //5=System Total
		$this->assertEquals( $udt_arr[$date_epoch][0]['pay_code_id'], TTUUID::getZeroID() );
		$this->assertEquals( $udt_arr[$date_epoch][0]['total_time'], ( 12 * 3600 ) );
		//Regular Time
		$this->assertEquals( 20, $udt_arr[$date_epoch][1]['object_type_id'] );                              //Regular Time
		$this->assertEquals( $udt_arr[$date_epoch][1]['pay_code_id'], $this->policy_ids['pay_code'][100] ); //Regular Time
		$this->assertEquals( $udt_arr[$date_epoch][1]['total_time'], ( 12 * 3600 ) );
		//Make sure no other hours
		$this->assertCount( 2, $udt_arr[$date_epoch] );

		return true;
	}

	/**
	 * @group OvertimePolicy_testHolidayAndScheduleA
	 */
	function testHolidayAndScheduleA() {
		global $dd;

		$date_epoch = TTDate::getMiddleDayEpoch( TTDate::getBeginWeekEpoch( time() ) );
		$date_stamp = TTDate::getDate( 'DATE', $date_epoch );

		//Holiday
		//$policy_ids['holiday'][] = $this->createHolidayPolicy( $this->company_id, 20 );
		//$this->createHoliday( $this->company_id, 10, $date_epoch, $policy_ids['holiday'][0] );

		$policy_ids['pay_formula_policy'][] = $this->createPayFormulaPolicy( $this->company_id, 200 ); //OT1.5
		$policy_ids['pay_formula_policy'][] = $this->createPayFormulaPolicy( $this->company_id, 210 ); //OT2.0
		$policy_ids['pay_formula_policy'][] = $this->createPayFormulaPolicy( $this->company_id, 220 ); //OT2.5
		//$policy_ids['pay_formula_policy'][]  = $this->createPayFormulaPolicy( $this->company_id, 510 ); //OT4.0

		//Daily
		$policy_ids['pay_code'][] = $this->createPayCode( $this->company_id, 100, $policy_ids['pay_formula_policy'][0] );
		$policy_ids['pay_code'][] = $this->createPayCode( $this->company_id, 110, $policy_ids['pay_formula_policy'][1] );
		$policy_ids['pay_code'][] = $this->createPayCode( $this->company_id, 120, $policy_ids['pay_formula_policy'][2] );

		//Holiday
		$policy_ids['pay_code'][] = $this->createPayCode( $this->company_id, 500, $policy_ids['pay_formula_policy'][0] );

		$policy_ids['overtime'][] = $this->createOverTimePolicy( $this->company_id, 510, $this->policy_ids['contributing_shift_policy'][12], $policy_ids['pay_code'][3] );

		$policy_ids['meal'][] = $this->createMealPolicy( $this->company_id, 120 ); //AutoDeduct 1hr

		$schedule_policy_id = $this->createSchedulePolicy( 10, $policy_ids['meal'][0] );

		//Create Policy Group
		$dd->createPolicyGroup( $this->company_id,
								null, //Meal
								null, //Exception
								null,
								$policy_ids['overtime'], //OT
								null, //Premium
								null, //Round
								[ $this->user_id ], //Users
								null, //Break
								null, //Accrual
								null, //Expense
								[ $this->policy_ids['absence'][10] ], //Absence
								[ $this->policy_ids['regular'][12] ] //Regular
		);

		$schedule_id[0] = $this->createSchedule( $this->user_id, $date_epoch, [
				'status_id'          => 20, //Absence
				'absence_policy_id'  => $this->policy_ids['absence'][10],
				'schedule_policy_id' => $schedule_policy_id,
				'start_time'         => '8:00AM',
				'end_time'           => '4:30PM',
		] );

		$udt_arr = $this->getUserDateTotalArray( $date_epoch, $date_epoch );
		//print_r($udt_arr);

		//Total Time
		$this->assertEquals( 5, $udt_arr[$date_epoch][0]['object_type_id'] );      //5=System Total
		$this->assertEquals( $udt_arr[$date_epoch][0]['pay_code_id'], TTUUID::getZeroID() );
		$this->assertEquals( $udt_arr[$date_epoch][0]['total_time'], ( 7.5 * 3600 ) );
		$this->assertEquals( $udt_arr[$date_epoch][0]['start_time_stamp'], strtotime( $date_stamp . ' 8:00AM' ) );
		$this->assertEquals( $udt_arr[$date_epoch][0]['end_time_stamp'], strtotime( $date_stamp . ' 3:30PM' ) );

		//Holiday Absence -- Absence is directly from the schedule, no holiday policy is involved.
		$this->assertEquals( 25, $udt_arr[$date_epoch][1]['object_type_id'] );     //Absence
		$this->assertEquals( $udt_arr[$date_epoch][1]['pay_code_id'], $this->policy_ids['pay_code'][900] );
		$this->assertEquals( $udt_arr[$date_epoch][1]['total_time'], ( 7.5 * 3600 ) );
		$this->assertEquals( $udt_arr[$date_epoch][1]['start_time_stamp'], strtotime( $date_stamp . ' 8:00AM' ) );
		$this->assertEquals( $udt_arr[$date_epoch][1]['end_time_stamp'], strtotime( $date_stamp . ' 3:30PM' ) );

		//Make sure no other hours
		$this->assertCount( 2, $udt_arr[$date_epoch] );

		return true;
	}

	/**
	 * @group OvertimePolicy_testHolidayAndScheduleA2
	 */
	function testHolidayAndScheduleA2() {
		global $dd;

		$date_epoch = TTDate::getMiddleDayEpoch( TTDate::getBeginWeekEpoch( time() ) );
		$date_stamp = TTDate::getDate( 'DATE', $date_epoch );

		//Holiday
		//$policy_ids['holiday'][] = $this->createHolidayPolicy( $this->company_id, 20 );
		//$this->createHoliday( $this->company_id, 10, $date_epoch, $policy_ids['holiday'][0] );

		$policy_ids['pay_formula_policy'][] = $this->createPayFormulaPolicy( $this->company_id, 200 ); //OT1.5
		$policy_ids['pay_formula_policy'][] = $this->createPayFormulaPolicy( $this->company_id, 210 ); //OT2.0
		$policy_ids['pay_formula_policy'][] = $this->createPayFormulaPolicy( $this->company_id, 220 ); //OT2.5
		//$policy_ids['pay_formula_policy'][]  = $this->createPayFormulaPolicy( $this->company_id, 510 ); //OT4.0

		//Daily
		$policy_ids['pay_code'][] = $this->createPayCode( $this->company_id, 100, $policy_ids['pay_formula_policy'][0] );
		$policy_ids['pay_code'][] = $this->createPayCode( $this->company_id, 110, $policy_ids['pay_formula_policy'][1] );
		$policy_ids['pay_code'][] = $this->createPayCode( $this->company_id, 120, $policy_ids['pay_formula_policy'][2] );

		//Holiday
		$policy_ids['pay_code'][] = $this->createPayCode( $this->company_id, 500, $policy_ids['pay_formula_policy'][0] );

		$policy_ids['overtime'][] = $this->createOverTimePolicy( $this->company_id, 510, $this->policy_ids['contributing_shift_policy'][12], $policy_ids['pay_code'][3] );

		$policy_ids['meal'][] = $this->createMealPolicy( $this->company_id, 120 ); //AutoDeduct 1hr

		$schedule_policy_id = $this->createSchedulePolicy( 10, $policy_ids['meal'][0] );

		//Create Policy Group
		$dd->createPolicyGroup( $this->company_id,
								null, //Meal
								null, //Exception
								null,
								$policy_ids['overtime'], //OT
								null, //Premium
								null, //Round
								[ $this->user_id ], //Users
								null, //Break
								null, //Accrual
								null, //Expense
								[ $this->policy_ids['absence'][10] ], //Absence
								[ $this->policy_ids['regular'][12] ] //Regular
		);

		//Test with split shift absences of the same type.
		$schedule_id[0] = $this->createSchedule( $this->user_id, $date_epoch, [
				'status_id'          => 20, //Absence
				'absence_policy_id'  => $this->policy_ids['absence'][10],
				'schedule_policy_id' => $schedule_policy_id,
				'start_time'         => '8:00AM',
				'end_time'           => '4:30PM',
		] );

		$schedule_id[1] = $this->createSchedule( $this->user_id, $date_epoch, [
				'status_id'          => 20, //Absence
				'absence_policy_id'  => $this->policy_ids['absence'][10],
				'schedule_policy_id' => $schedule_policy_id,
				'start_time'         => '6:00PM',
				'end_time'           => '9:00PM',
		] );

		$udt_arr = $this->getUserDateTotalArray( $date_epoch, $date_epoch );
		//print_r($udt_arr);

		//Total Time
		$this->assertEquals( 5, $udt_arr[$date_epoch][0]['object_type_id'] );      //5=System Total
		$this->assertEquals( $udt_arr[$date_epoch][0]['pay_code_id'], TTUUID::getZeroID() );
		$this->assertEquals( $udt_arr[$date_epoch][0]['total_time'], ( 10.5 * 3600 ) );
		$this->assertEquals( $udt_arr[$date_epoch][0]['start_time_stamp'], strtotime( $date_stamp . ' 8:00AM' ) );
		$this->assertEquals( $udt_arr[$date_epoch][0]['end_time_stamp'], strtotime( $date_stamp . ' 9:00PM' ) );

		//Holiday Absence -- Absence is directly from the schedule, no holiday policy is involved.
		$this->assertEquals( 25, $udt_arr[$date_epoch][1]['object_type_id'] );     //Absence
		$this->assertEquals( $udt_arr[$date_epoch][1]['pay_code_id'], $this->policy_ids['pay_code'][900] );
		$this->assertEquals( $udt_arr[$date_epoch][1]['total_time'], ( 3.0 * 3600 ) );
		$this->assertEquals( $udt_arr[$date_epoch][1]['start_time_stamp'], strtotime( $date_stamp . ' 6:00PM' ) );
		$this->assertEquals( $udt_arr[$date_epoch][1]['end_time_stamp'], strtotime( $date_stamp . ' 9:00PM' ) );

		//Holiday Absence -- Absence is directly from the schedule, no holiday policy is involved.
		$this->assertEquals( 25, $udt_arr[$date_epoch][2]['object_type_id'] );     //Absence
		$this->assertEquals( $udt_arr[$date_epoch][2]['pay_code_id'], $this->policy_ids['pay_code'][900] );
		$this->assertEquals( $udt_arr[$date_epoch][2]['total_time'], ( 7.5 * 3600 ) );
		$this->assertEquals( $udt_arr[$date_epoch][2]['start_time_stamp'], strtotime( $date_stamp . ' 8:00AM' ) );
		$this->assertEquals( $udt_arr[$date_epoch][2]['end_time_stamp'], strtotime( $date_stamp . ' 3:30PM' ) );

		//Make sure no other hours
		$this->assertCount( 3, $udt_arr[$date_epoch] );

		return true;
	}

	/**
	 * @group OvertimePolicy_testHolidayAndScheduleB
	 */
	function testHolidayAndScheduleB() {
		global $dd;

		$date_epoch = TTDate::getMiddleDayEpoch( TTDate::getBeginWeekEpoch( time() ) );

		//Holiday
		$policy_ids['holiday'][] = $this->createHolidayPolicy( $this->company_id, 10 );
		$this->createHoliday( $this->company_id, 10, $date_epoch, $policy_ids['holiday'][0] );

		$policy_ids['pay_formula_policy'][] = $this->createPayFormulaPolicy( $this->company_id, 200 ); //OT1.5
		$policy_ids['pay_formula_policy'][] = $this->createPayFormulaPolicy( $this->company_id, 210 ); //OT2.0
		$policy_ids['pay_formula_policy'][] = $this->createPayFormulaPolicy( $this->company_id, 220 ); //OT2.5
		//$policy_ids['pay_formula_policy'][]  = $this->createPayFormulaPolicy( $this->company_id, 510 ); //OT4.0

		//Daily
		$policy_ids['pay_code'][] = $this->createPayCode( $this->company_id, 100, $policy_ids['pay_formula_policy'][0] );
		$policy_ids['pay_code'][] = $this->createPayCode( $this->company_id, 110, $policy_ids['pay_formula_policy'][1] );
		$policy_ids['pay_code'][] = $this->createPayCode( $this->company_id, 120, $policy_ids['pay_formula_policy'][2] );

		//Holiday
		$policy_ids['pay_code'][] = $this->createPayCode( $this->company_id, 500, $policy_ids['pay_formula_policy'][0] );

		$policy_ids['overtime'][] = $this->createOverTimePolicy( $this->company_id, 510, $this->policy_ids['contributing_shift_policy'][12], $policy_ids['pay_code'][3] );

		$policy_ids['meal'][] = $this->createMealPolicy( $this->company_id, 120 ); //AutoDeduct 1hr

		$schedule_policy_id = $this->createSchedulePolicy( 10, $policy_ids['meal'][0] );

		//Create Policy Group
		$dd->createPolicyGroup( $this->company_id,
								null, //Meal
								null, //Exception
								$policy_ids['holiday'],
								$policy_ids['overtime'], //OT
								null, //Premium
								null, //Round
								[ $this->user_id ], //Users
								null, //Break
								null, //Accrual
								null, //Expense
								[ $this->policy_ids['absence'][10] ], //Absence
								[ $this->policy_ids['regular'][12] ] //Regular
		);

		$schedule_id[0] = $this->createSchedule( $this->user_id, $date_epoch, [
				'status_id'          => 20, //Absence
				'absence_policy_id'  => $this->policy_ids['absence'][10],
				'schedule_policy_id' => $schedule_policy_id,
				'start_time'         => '8:00AM',
				'end_time'           => '1:00PM',
		] );

		$udt_arr = $this->getUserDateTotalArray( $date_epoch, $date_epoch );
		//print_r($udt_arr);

		//Holiday policy calculates 0 hrs, so the scheduled time should be overridden to 0 (or no records at all).
		$this->assertCount( 0, $udt_arr );

		return true;
	}

	/**
	 * @group OvertimePolicy_testHolidayAndScheduleC
	 */
	function testHolidayAndScheduleC() {
		global $dd;

		$date_epoch = TTDate::getMiddleDayEpoch( TTDate::getBeginWeekEpoch( time() ) );
		$date_stamp = TTDate::getDate( 'DATE', $date_epoch );

		//Holiday
		$policy_ids['holiday'][] = $this->createHolidayPolicy( $this->company_id, 20 );
		$this->createHoliday( $this->company_id, 10, $date_epoch, $policy_ids['holiday'][0] );

		$policy_ids['pay_formula_policy'][] = $this->createPayFormulaPolicy( $this->company_id, 200 ); //OT1.5
		$policy_ids['pay_formula_policy'][] = $this->createPayFormulaPolicy( $this->company_id, 210 ); //OT2.0
		$policy_ids['pay_formula_policy'][] = $this->createPayFormulaPolicy( $this->company_id, 220 ); //OT2.5
		//$policy_ids['pay_formula_policy'][]  = $this->createPayFormulaPolicy( $this->company_id, 510 ); //OT4.0

		//Daily
		$policy_ids['pay_code'][] = $this->createPayCode( $this->company_id, 100, $policy_ids['pay_formula_policy'][0] );
		$policy_ids['pay_code'][] = $this->createPayCode( $this->company_id, 110, $policy_ids['pay_formula_policy'][1] );
		$policy_ids['pay_code'][] = $this->createPayCode( $this->company_id, 120, $policy_ids['pay_formula_policy'][2] );

		//Holiday
		$policy_ids['pay_code'][] = $this->createPayCode( $this->company_id, 500, $policy_ids['pay_formula_policy'][0] );

		$policy_ids['overtime'][] = $this->createOverTimePolicy( $this->company_id, 510, $this->policy_ids['contributing_shift_policy'][12], $policy_ids['pay_code'][3] );

		$policy_ids['meal'][] = $this->createMealPolicy( $this->company_id, 120 ); //AutoDeduct 1hr

		$schedule_policy_id = $this->createSchedulePolicy( 10, $policy_ids['meal'][0] );

		//Create Policy Group
		$dd->createPolicyGroup( $this->company_id,
								null, //Meal
								null, //Exception
								$policy_ids['holiday'],
								$policy_ids['overtime'], //OT
								null, //Premium
								null, //Round
								[ $this->user_id ], //Users
								null, //Break
								null, //Accrual
								null, //Expense
								[ $this->policy_ids['absence'][10] ], //Absence
								[ $this->policy_ids['regular'][12] ] //Regular
		);

		$schedule_id[0] = $this->createSchedule( $this->user_id, $date_epoch, [
				'status_id'          => 20, //Absence
				'absence_policy_id'  => $this->policy_ids['absence'][10],
				'schedule_policy_id' => $schedule_policy_id,
				'start_time'         => '8:00AM',
				'end_time'           => '8:00PM', //Longer than the what the actual holiday time appears on the timesheet will be.
		] );

		$udt_arr = $this->getUserDateTotalArray( $date_epoch, $date_epoch );
		//print_r($udt_arr);

		//Total Time
		$this->assertEquals( 5, $udt_arr[$date_epoch][0]['object_type_id'] );      //5=System Total
		$this->assertEquals( $udt_arr[$date_epoch][0]['pay_code_id'], TTUUID::getZeroID() );
		$this->assertEquals( $udt_arr[$date_epoch][0]['total_time'], ( 8 * 3600 ) );
		$this->assertEquals( $udt_arr[$date_epoch][0]['start_time_stamp'], strtotime( $date_stamp . ' 8:00AM' ) );
		$this->assertEquals( $udt_arr[$date_epoch][0]['end_time_stamp'], strtotime( $date_stamp . ' 4:00PM' ) );

		//Holiday Absence -- Calculated by the Holiday Policy, so its less than the scheduled time.
		$this->assertEquals( 25, $udt_arr[$date_epoch][1]['object_type_id'] );     //Absence
		$this->assertEquals( $udt_arr[$date_epoch][1]['pay_code_id'], $this->policy_ids['pay_code'][900] );
		$this->assertEquals( $udt_arr[$date_epoch][1]['total_time'], ( 8 * 3600 ) );
		$this->assertEquals( $udt_arr[$date_epoch][1]['start_time_stamp'], strtotime( $date_stamp . ' 8:00AM' ) );
		$this->assertEquals( $udt_arr[$date_epoch][1]['end_time_stamp'], strtotime( $date_stamp . ' 4:00PM' ) );

		//Make sure no other hours
		$this->assertCount( 2, $udt_arr[$date_epoch] );

		return true;
	}

	/**
	 * @group OvertimePolicy_testHolidayAndScheduleC2
	 */
	function testHolidayAndScheduleC2() {
		global $dd;

		$date_epoch = TTDate::getMiddleDayEpoch( TTDate::getBeginWeekEpoch( time() ) );
		$date_stamp = TTDate::getDate( 'DATE', $date_epoch );

		//Holiday
		$policy_ids['holiday'][] = $this->createHolidayPolicy( $this->company_id, 20 );
		$this->createHoliday( $this->company_id, 10, $date_epoch, $policy_ids['holiday'][0] );

		$policy_ids['pay_formula_policy'][] = $this->createPayFormulaPolicy( $this->company_id, 200 ); //OT1.5
		$policy_ids['pay_formula_policy'][] = $this->createPayFormulaPolicy( $this->company_id, 210 ); //OT2.0
		$policy_ids['pay_formula_policy'][] = $this->createPayFormulaPolicy( $this->company_id, 220 ); //OT2.5
		//$policy_ids['pay_formula_policy'][]  = $this->createPayFormulaPolicy( $this->company_id, 510 ); //OT4.0

		//Daily
		$policy_ids['pay_code'][] = $this->createPayCode( $this->company_id, 100, $policy_ids['pay_formula_policy'][0] );
		$policy_ids['pay_code'][] = $this->createPayCode( $this->company_id, 110, $policy_ids['pay_formula_policy'][1] );
		$policy_ids['pay_code'][] = $this->createPayCode( $this->company_id, 120, $policy_ids['pay_formula_policy'][2] );

		//Holiday
		$policy_ids['pay_code'][] = $this->createPayCode( $this->company_id, 500, $policy_ids['pay_formula_policy'][0] );

		$policy_ids['overtime'][] = $this->createOverTimePolicy( $this->company_id, 510, $this->policy_ids['contributing_shift_policy'][12], $policy_ids['pay_code'][3] );

		$policy_ids['meal'][] = $this->createMealPolicy( $this->company_id, 120 ); //AutoDeduct 1hr

		$schedule_policy_id = $this->createSchedulePolicy( 10, $policy_ids['meal'][0] );

		//Create Policy Group
		$dd->createPolicyGroup( $this->company_id,
								null, //Meal
								null, //Exception
								$policy_ids['holiday'],
								$policy_ids['overtime'], //OT
								null, //Premium
								null, //Round
								[ $this->user_id ], //Users
								null, //Break
								null, //Accrual
								null, //Expense
								[ $this->policy_ids['absence'][10] ], //Absence
								[ $this->policy_ids['regular'][12] ] //Regular
		);

		//Test split shift schedules that are both overridden by the holiday policy.
		$schedule_id[0] = $this->createSchedule( $this->user_id, $date_epoch, [
				'status_id'          => 20, //Absence
				'absence_policy_id'  => $this->policy_ids['absence'][10],
				'schedule_policy_id' => $schedule_policy_id,
				'start_time'         => '8:00AM',
				'end_time'           => '8:00PM', //Longer than the what the actual holiday time appears on the timesheet will be.
		] );

		$schedule_id[1] = $this->createSchedule( $this->user_id, $date_epoch, [
				'status_id'          => 20, //Absence
				'absence_policy_id'  => $this->policy_ids['absence'][10],
				'schedule_policy_id' => $schedule_policy_id,
				'start_time'         => '9:00PM',
				'end_time'           => '11:00PM', //Longer than the what the actual holiday time appears on the timesheet will be.
		] );

		$udt_arr = $this->getUserDateTotalArray( $date_epoch, $date_epoch );
		//print_r($udt_arr);

		//Total Time
		$this->assertEquals( 5, $udt_arr[$date_epoch][0]['object_type_id'] );      //5=System Total
		$this->assertEquals( $udt_arr[$date_epoch][0]['pay_code_id'], TTUUID::getZeroID() );
		$this->assertEquals( $udt_arr[$date_epoch][0]['total_time'], ( 8 * 3600 ) );
		$this->assertEquals( $udt_arr[$date_epoch][0]['start_time_stamp'], strtotime( $date_stamp . ' 8:00AM' ) );
		$this->assertEquals( $udt_arr[$date_epoch][0]['end_time_stamp'], strtotime( $date_stamp . ' 4:00PM' ) );

		//Holiday Absence -- Calculated by the Holiday Policy, so its less than the scheduled time.
		$this->assertEquals( 25, $udt_arr[$date_epoch][1]['object_type_id'] );     //Absence
		$this->assertEquals( $udt_arr[$date_epoch][1]['pay_code_id'], $this->policy_ids['pay_code'][900] );
		$this->assertEquals( $udt_arr[$date_epoch][1]['total_time'], ( 8 * 3600 ) );
		$this->assertEquals( $udt_arr[$date_epoch][1]['start_time_stamp'], strtotime( $date_stamp . ' 8:00AM' ) );
		$this->assertEquals( $udt_arr[$date_epoch][1]['end_time_stamp'], strtotime( $date_stamp . ' 4:00PM' ) );

		//Make sure no other hours
		$this->assertCount( 2, $udt_arr[$date_epoch] );

		return true;
	}

	/**
	 * @group OvertimePolicy_testHolidayAndScheduleC3
	 */
	function testHolidayAndScheduleC3() {
		global $dd;

		$date_epoch = TTDate::getMiddleDayEpoch( TTDate::getBeginWeekEpoch( time() ) );
		$date_stamp = TTDate::getDate( 'DATE', $date_epoch );

		//Holiday
		$policy_ids['holiday'][] = $this->createHolidayPolicy( $this->company_id, 20 );
		$this->createHoliday( $this->company_id, 10, $date_epoch, $policy_ids['holiday'][0] );

		$policy_ids['pay_formula_policy'][] = $this->createPayFormulaPolicy( $this->company_id, 200 ); //OT1.5
		$policy_ids['pay_formula_policy'][] = $this->createPayFormulaPolicy( $this->company_id, 210 ); //OT2.0
		$policy_ids['pay_formula_policy'][] = $this->createPayFormulaPolicy( $this->company_id, 220 ); //OT2.5
		//$policy_ids['pay_formula_policy'][]  = $this->createPayFormulaPolicy( $this->company_id, 510 ); //OT4.0

		//Daily
		$policy_ids['pay_code'][] = $this->createPayCode( $this->company_id, 100, $policy_ids['pay_formula_policy'][0] );
		$policy_ids['pay_code'][] = $this->createPayCode( $this->company_id, 110, $policy_ids['pay_formula_policy'][1] );
		$policy_ids['pay_code'][] = $this->createPayCode( $this->company_id, 120, $policy_ids['pay_formula_policy'][2] );

		//Holiday
		$policy_ids['pay_code'][] = $this->createPayCode( $this->company_id, 500, $policy_ids['pay_formula_policy'][0] );

		$policy_ids['overtime'][] = $this->createOverTimePolicy( $this->company_id, 510, $this->policy_ids['contributing_shift_policy'][12], $policy_ids['pay_code'][3] );

		$policy_ids['meal'][] = $this->createMealPolicy( $this->company_id, 120 ); //AutoDeduct 1hr

		$schedule_policy_id = $this->createSchedulePolicy( 10, $policy_ids['meal'][0] );

		//Create Policy Group
		$dd->createPolicyGroup( $this->company_id,
								null, //Meal
								null, //Exception
								$policy_ids['holiday'],
								$policy_ids['overtime'], //OT
								null, //Premium
								null, //Round
								[ $this->user_id ], //Users
								null, //Break
								null, //Accrual
								null, //Expense
								[ $this->policy_ids['absence'][10] ], //Absence
								[ $this->policy_ids['regular'][12] ] //Regular
		);

		$schedule_id[0] = $this->createSchedule( $this->user_id, $date_epoch, [
				'status_id'          => 20, //Absence
				'absence_policy_id'  => $this->policy_ids['absence'][10],
				'schedule_policy_id' => $schedule_policy_id,
				'start_time'         => '8:00AM',
				'end_time'           => '8:00PM', //Longer than the what the actual holiday time appears on the timesheet will be.
		] );

		//Override the schedule and the holiday policy to put in just 1hr of Holiday time directly on the timesheet.
		$dd->createAbsence( $this->user_id, $date_epoch, ( 1 * 3600 ), $this->policy_ids['absence'][10] );

		$udt_arr = $this->getUserDateTotalArray( $date_epoch, $date_epoch );
		//print_r($udt_arr);

		//Total Time
		$this->assertEquals( 5, $udt_arr[$date_epoch][0]['object_type_id'] );      //5=System Total
		$this->assertEquals( $udt_arr[$date_epoch][0]['pay_code_id'], TTUUID::getZeroID() );
		$this->assertEquals( $udt_arr[$date_epoch][0]['total_time'], ( 1 * 3600 ) );
		$this->assertEquals( $udt_arr[$date_epoch][0]['start_time_stamp'], strtotime( $date_stamp . ' 12:00AM' ) );
		$this->assertEqualsWithDelta( $udt_arr[$date_epoch][0]['end_time_stamp'], strtotime( $date_stamp . ' 1:00AM' ), 3600 ); //3600 delta due to DST when run on 04-Nov-19

		//Holiday Absence -- Calculated by the Holiday Policy, so its less than the scheduled time.
		$this->assertEquals( 25, $udt_arr[$date_epoch][1]['object_type_id'] );                                               //Absence
		$this->assertEquals( $udt_arr[$date_epoch][1]['pay_code_id'], $this->policy_ids['pay_code'][900] );
		$this->assertEquals( $udt_arr[$date_epoch][1]['total_time'], ( 1 * 3600 ) );
		$this->assertEquals( $udt_arr[$date_epoch][1]['start_time_stamp'], strtotime( $date_stamp . ' 12:00AM' ) );
		$this->assertEqualsWithDelta( $udt_arr[$date_epoch][1]['end_time_stamp'], strtotime( $date_stamp . ' 1:00AM' ), 3600 ); //3600 delta due to DST when run on 04-Nov-19

		//Make sure no other hours
		$this->assertCount( 2, $udt_arr[$date_epoch] );

		return true;
	}

	/**
	 * @group OvertimePolicy_testHolidayAndScheduleD
	 */
	function testHolidayAndScheduleD() {
		global $dd;

		$date_epoch = TTDate::getMiddleDayEpoch( TTDate::getBeginWeekEpoch( time() ) );
		$date_stamp = TTDate::getDate( 'DATE', $date_epoch );

		//Holiday
		$policy_ids['holiday'][] = $this->createHolidayPolicy( $this->company_id, 20 );
		$this->createHoliday( $this->company_id, 10, $date_epoch, $policy_ids['holiday'][0] );

		$policy_ids['pay_formula_policy'][] = $this->createPayFormulaPolicy( $this->company_id, 200 ); //OT1.5
		$policy_ids['pay_formula_policy'][] = $this->createPayFormulaPolicy( $this->company_id, 210 ); //OT2.0
		$policy_ids['pay_formula_policy'][] = $this->createPayFormulaPolicy( $this->company_id, 220 ); //OT2.5
		//$policy_ids['pay_formula_policy'][]  = $this->createPayFormulaPolicy( $this->company_id, 510 ); //OT4.0

		//Daily
		$policy_ids['pay_code'][] = $this->createPayCode( $this->company_id, 100, $policy_ids['pay_formula_policy'][0] );
		$policy_ids['pay_code'][] = $this->createPayCode( $this->company_id, 110, $policy_ids['pay_formula_policy'][1] );
		$policy_ids['pay_code'][] = $this->createPayCode( $this->company_id, 120, $policy_ids['pay_formula_policy'][2] );

		//Holiday
		$policy_ids['pay_code'][] = $this->createPayCode( $this->company_id, 500, $policy_ids['pay_formula_policy'][0] );

		$policy_ids['overtime'][] = $this->createOverTimePolicy( $this->company_id, 510, $this->policy_ids['contributing_shift_policy'][12], $policy_ids['pay_code'][3] );

		$policy_ids['meal'][] = $this->createMealPolicy( $this->company_id, 120 ); //AutoDeduct 1hr

		$policy_ids['absence'][] = $dd->createAbsencePolicy( $this->company_id, 30, $this->policy_ids['pay_code'][920] );

		$schedule_policy_id = $this->createSchedulePolicy( 10, $policy_ids['meal'][0] );

		//Create Policy Group
		$dd->createPolicyGroup( $this->company_id,
								null, //Meal
								null, //Exception
								$policy_ids['holiday'],
								$policy_ids['overtime'], //OT
								null, //Premium
								null, //Round
								[ $this->user_id ], //Users
								null, //Break
								null, //Accrual
								null, //Expense
								$policy_ids['absence'], //Absences
								[ $this->policy_ids['regular'][12] ] //Regular
		);

		//Test switching the scheduled shift to a different absence policy and make sure both
		$schedule_id[0] = $this->createSchedule( $this->user_id, $date_epoch, [
				'status_id'          => 20, //Absence
				'absence_policy_id'  => $policy_ids['absence'][0],
				'schedule_policy_id' => $schedule_policy_id,
				'start_time'         => '8:00AM',
				'end_time'           => '4:00PM', //Less than the what the actual holiday time appears on the timesheet will be.
		] );

		$udt_arr = $this->getUserDateTotalArray( $date_epoch, $date_epoch );
		//print_r($udt_arr);

		//Total Time
		$this->assertEquals( 5, $udt_arr[$date_epoch][0]['object_type_id'] );      //5=System Total
		$this->assertEquals( $udt_arr[$date_epoch][0]['pay_code_id'], TTUUID::getZeroID() );
		$this->assertEquals( $udt_arr[$date_epoch][0]['total_time'], ( 15 * 3600 ) );
		$this->assertEquals( $udt_arr[$date_epoch][0]['start_time_stamp'], strtotime( $date_stamp . ' 12:00AM' ) );
		$this->assertEquals( $udt_arr[$date_epoch][0]['end_time_stamp'], strtotime( $date_stamp . ' 3:00PM' ) );

		//Schedule Absence -- From overridden scheduled shift above that is different than holiday policy specifies.
		$this->assertEquals( 25, $udt_arr[$date_epoch][1]['object_type_id'] );     //Absence
		$this->assertEquals( $udt_arr[$date_epoch][1]['pay_code_id'], $this->policy_ids['pay_code'][920] );
		$this->assertEquals( $udt_arr[$date_epoch][1]['total_time'], ( 7 * 3600 ) );
		$this->assertEquals( $udt_arr[$date_epoch][1]['start_time_stamp'], strtotime( $date_stamp . ' 8:00AM' ) );
		$this->assertEquals( $udt_arr[$date_epoch][1]['end_time_stamp'], strtotime( $date_stamp . ' 3:00PM' ) );

		//Holiday Absence -- Calculated by the Holiday Policy, so its less than the scheduled time.
		$this->assertEquals( 25, $udt_arr[$date_epoch][2]['object_type_id'] );     //Absence
		$this->assertEquals( $udt_arr[$date_epoch][2]['pay_code_id'], $this->policy_ids['pay_code'][900] );
		$this->assertEquals( $udt_arr[$date_epoch][2]['total_time'], ( 8 * 3600 ) );
		$this->assertEquals( $udt_arr[$date_epoch][2]['start_time_stamp'], strtotime( $date_stamp . ' 12:00AM' ) );
		$this->assertEqualsWithDelta( $udt_arr[$date_epoch][2]['end_time_stamp'], strtotime( $date_stamp . ' 8:00AM' ), 3600 ); //3600 delta due to DST when run on 04-Nov-19

		//Make sure no other hours
		$this->assertCount( 3, $udt_arr[$date_epoch] );

		return true;
	}

	/**
	 * @group OvertimePolicy_testHolidayAndScheduleD2
	 */
	function testHolidayAndScheduleD2() {
		global $dd;

		$date_epoch = TTDate::getMiddleDayEpoch( TTDate::getBeginWeekEpoch( time() ) );
		$date_stamp = TTDate::getDate( 'DATE', $date_epoch );

		//Holiday
		$policy_ids['holiday'][] = $this->createHolidayPolicy( $this->company_id, 20 );
		$this->createHoliday( $this->company_id, 10, $date_epoch, $policy_ids['holiday'][0] );

		$policy_ids['pay_formula_policy'][] = $this->createPayFormulaPolicy( $this->company_id, 200 ); //OT1.5
		$policy_ids['pay_formula_policy'][] = $this->createPayFormulaPolicy( $this->company_id, 210 ); //OT2.0
		$policy_ids['pay_formula_policy'][] = $this->createPayFormulaPolicy( $this->company_id, 220 ); //OT2.5
		//$policy_ids['pay_formula_policy'][]  = $this->createPayFormulaPolicy( $this->company_id, 510 ); //OT4.0

		//Daily
		$policy_ids['pay_code'][] = $this->createPayCode( $this->company_id, 100, $policy_ids['pay_formula_policy'][0] );
		$policy_ids['pay_code'][] = $this->createPayCode( $this->company_id, 110, $policy_ids['pay_formula_policy'][1] );
		$policy_ids['pay_code'][] = $this->createPayCode( $this->company_id, 120, $policy_ids['pay_formula_policy'][2] );

		//Holiday
		$policy_ids['pay_code'][] = $this->createPayCode( $this->company_id, 500, $policy_ids['pay_formula_policy'][0] );

		$policy_ids['overtime'][] = $this->createOverTimePolicy( $this->company_id, 510, $this->policy_ids['contributing_shift_policy'][12], $policy_ids['pay_code'][3] );

		$policy_ids['meal'][] = $this->createMealPolicy( $this->company_id, 120 ); //AutoDeduct 1hr

		$policy_ids['absence'][] = $dd->createAbsencePolicy( $this->company_id, 30, $this->policy_ids['pay_code'][920] );

		$schedule_policy_id = $this->createSchedulePolicy( 10, $policy_ids['meal'][0] );

		//Create Policy Group
		$dd->createPolicyGroup( $this->company_id,
								null, //Meal
								null, //Exception
								$policy_ids['holiday'],
								$policy_ids['overtime'], //OT
								null, //Premium
								null, //Round
								[ $this->user_id ], //Users
								null, //Break
								null, //Accrual
								null, //Expense
								$policy_ids['absence'], //Absences
								[ $this->policy_ids['regular'][12] ] //Regular
		);

		//Test switching the scheduled shift to a different absence policy and make sure both
		$schedule_id[0] = $this->createSchedule( $this->user_id, $date_epoch, [
				'status_id'          => 20, //Absence
				'absence_policy_id'  => $policy_ids['absence'][0],
				'schedule_policy_id' => $schedule_policy_id,
				'start_time'         => '8:00AM',
				'end_time'           => '6:00PM', //Longer than the what the actual holiday time appears on the timesheet will be.
		] );

		$udt_arr = $this->getUserDateTotalArray( $date_epoch, $date_epoch );
		//print_r($udt_arr);

		//Total Time
		$this->assertEquals( 5, $udt_arr[$date_epoch][0]['object_type_id'] );      //5=System Total
		$this->assertEquals( $udt_arr[$date_epoch][0]['pay_code_id'], TTUUID::getZeroID() );
		$this->assertEquals( $udt_arr[$date_epoch][0]['total_time'], ( 17 * 3600 ) );
		$this->assertEquals( $udt_arr[$date_epoch][0]['start_time_stamp'], strtotime( $date_stamp . ' 12:00AM' ) );
		$this->assertEquals( $udt_arr[$date_epoch][0]['end_time_stamp'], strtotime( $date_stamp . ' 5:00PM' ) );

		//Schedule Absence -- From overridden scheduled shift above that is different than holiday policy specifies.
		$this->assertEquals( 25, $udt_arr[$date_epoch][1]['object_type_id'] );     //Absence
		$this->assertEquals( $udt_arr[$date_epoch][1]['pay_code_id'], $this->policy_ids['pay_code'][920] );
		$this->assertEquals( $udt_arr[$date_epoch][1]['total_time'], ( 9 * 3600 ) );
		$this->assertEquals( $udt_arr[$date_epoch][1]['start_time_stamp'], strtotime( $date_stamp . ' 8:00AM' ) );
		$this->assertEquals( $udt_arr[$date_epoch][1]['end_time_stamp'], strtotime( $date_stamp . ' 5:00PM' ) );

		//Holiday Absence -- Calculated by the Holiday Policy, so its less than the scheduled time.
		$this->assertEquals( 25, $udt_arr[$date_epoch][2]['object_type_id'] );     //Absence
		$this->assertEquals( $udt_arr[$date_epoch][2]['pay_code_id'], $this->policy_ids['pay_code'][900] );
		$this->assertEquals( $udt_arr[$date_epoch][2]['total_time'], ( 8 * 3600 ) );
		$this->assertEquals( $udt_arr[$date_epoch][2]['start_time_stamp'], strtotime( $date_stamp . ' 12:00AM' ) );
		$this->assertEqualsWithDelta( $udt_arr[$date_epoch][2]['end_time_stamp'], strtotime( $date_stamp . ' 8:00AM' ), 3600 ); //3600 delta due to DST when run on 04-Nov-19

		//Make sure no other hours
		$this->assertCount( 3, $udt_arr[$date_epoch] );

		return true;
	}

	/**
	 * @group OvertimePolicy_testScheduleAndAbsenceA
	 */
	function testScheduleAndAbsenceA() {
		global $dd;

		$date_epoch = TTDate::getMiddleDayEpoch( TTDate::getBeginWeekEpoch( time() ) );
		$date_stamp = TTDate::getDate( 'DATE', $date_epoch );

		$policy_ids['pay_formula_policy'][] = $this->createPayFormulaPolicy( $this->company_id, 200 ); //OT1.5
		$policy_ids['pay_formula_policy'][] = $this->createPayFormulaPolicy( $this->company_id, 210 ); //OT2.0
		$policy_ids['pay_formula_policy'][] = $this->createPayFormulaPolicy( $this->company_id, 220 ); //OT2.5

		//Daily
		$policy_ids['pay_code'][] = $this->createPayCode( $this->company_id, 100, $policy_ids['pay_formula_policy'][0] );
		$policy_ids['pay_code'][] = $this->createPayCode( $this->company_id, 110, $policy_ids['pay_formula_policy'][1] );
		$policy_ids['pay_code'][] = $this->createPayCode( $this->company_id, 120, $policy_ids['pay_formula_policy'][2] );

		//Holiday
		$policy_ids['pay_code'][] = $this->createPayCode( $this->company_id, 500, $policy_ids['pay_formula_policy'][0] );

		$policy_ids['overtime'][] = $this->createOverTimePolicy( $this->company_id, 510, $this->policy_ids['contributing_shift_policy'][12], $policy_ids['pay_code'][3] );

		$policy_ids['meal'][] = $this->createMealPolicy( $this->company_id, 120 ); //AutoDeduct 1hr

		$schedule_policy_id = $this->createSchedulePolicy( 10, $policy_ids['meal'][0] );

		//Create Policy Group
		$dd->createPolicyGroup( $this->company_id,
								null, //Meal
								null, //Exception
								null,
								$policy_ids['overtime'], //OT
								null, //Premium
								null, //Round
								[ $this->user_id ], //Users
								null, //Break
								null, //Accrual
								null, //Expense
								[ $this->policy_ids['absence'][10], $this->policy_ids['absence'][11] ], //Absence
								[ $this->policy_ids['regular'][12] ] //Regular
		);

		$schedule_id[0] = $this->createSchedule( $this->user_id, $date_epoch, [
				'status_id'          => 20, //Absence
				'absence_policy_id'  => $this->policy_ids['absence'][10],
				'schedule_policy_id' => $schedule_policy_id,
				'start_time'         => '8:00AM',
				'end_time'           => '8:00PM',
		] );

		//Add absence with a *same* absence policy, and same pay code, which *should* override it.
		$dd->createAbsence( $this->user_id, $date_epoch, ( 1 * 3600 ), $this->policy_ids['absence'][10] );

		$udt_arr = $this->getUserDateTotalArray( $date_epoch, $date_epoch );
		//print_r($udt_arr);

		//Total Time
		$this->assertEquals( 5, $udt_arr[$date_epoch][0]['object_type_id'] );      //5=System Total
		$this->assertEquals( $udt_arr[$date_epoch][0]['pay_code_id'], TTUUID::getZeroID() );
		$this->assertEquals( $udt_arr[$date_epoch][0]['total_time'], ( 1 * 3600 ) );
		$this->assertEquals( $udt_arr[$date_epoch][0]['start_time_stamp'], strtotime( $date_stamp . ' 12:00AM' ) );
		$this->assertEqualsWithDelta( $udt_arr[$date_epoch][0]['end_time_stamp'], strtotime( $date_stamp . ' 1:00AM' ), 3600 ); //3600 delta due to DST when run on 04-Nov-19

		//TimeSheet Absence -- Taken from the timesheet and overrides the schedule.
		$this->assertEquals( 25, $udt_arr[$date_epoch][1]['object_type_id'] );                                               //Absence
		$this->assertEquals( $udt_arr[$date_epoch][1]['pay_code_id'], $this->policy_ids['pay_code'][900] );
		$this->assertEquals( $udt_arr[$date_epoch][1]['total_time'], ( 1 * 3600 ) );
		$this->assertEquals( $udt_arr[$date_epoch][1]['start_time_stamp'], strtotime( $date_stamp . ' 12:00AM' ) );
		$this->assertEqualsWithDelta( $udt_arr[$date_epoch][1]['end_time_stamp'], strtotime( $date_stamp . ' 1:00AM' ), 3600 ); //3600 delta due to DST when run on 04-Nov-19

		//Make sure no other hours
		$this->assertCount( 2, $udt_arr[$date_epoch] );

		return true;
	}

	/**
	 * @group OvertimePolicy_testScheduleAndAbsenceB
	 */
	function testScheduleAndAbsenceB() {
		global $dd;

		$date_epoch = TTDate::getMiddleDayEpoch( TTDate::getBeginWeekEpoch( time() ) );
		$date_stamp = TTDate::getDate( 'DATE', $date_epoch );

		$policy_ids['pay_formula_policy'][] = $this->createPayFormulaPolicy( $this->company_id, 200 ); //OT1.5
		$policy_ids['pay_formula_policy'][] = $this->createPayFormulaPolicy( $this->company_id, 210 ); //OT2.0
		$policy_ids['pay_formula_policy'][] = $this->createPayFormulaPolicy( $this->company_id, 220 ); //OT2.5

		//Daily
		$policy_ids['pay_code'][] = $this->createPayCode( $this->company_id, 100, $policy_ids['pay_formula_policy'][0] );
		$policy_ids['pay_code'][] = $this->createPayCode( $this->company_id, 110, $policy_ids['pay_formula_policy'][1] );
		$policy_ids['pay_code'][] = $this->createPayCode( $this->company_id, 120, $policy_ids['pay_formula_policy'][2] );

		//Holiday
		$policy_ids['pay_code'][] = $this->createPayCode( $this->company_id, 500, $policy_ids['pay_formula_policy'][0] );

		$policy_ids['overtime'][] = $this->createOverTimePolicy( $this->company_id, 510, $this->policy_ids['contributing_shift_policy'][12], $policy_ids['pay_code'][3] );

		$policy_ids['meal'][] = $this->createMealPolicy( $this->company_id, 120 ); //AutoDeduct 1hr

		$schedule_policy_id = $this->createSchedulePolicy( 10, $policy_ids['meal'][0] );

		//Create Policy Group
		$dd->createPolicyGroup( $this->company_id,
								null, //Meal
								null, //Exception
								null,
								$policy_ids['overtime'], //OT
								null, //Premium
								null, //Round
								[ $this->user_id ], //Users
								null, //Break
								null, //Accrual
								null, //Expense
								[ $this->policy_ids['absence'][10], $this->policy_ids['absence'][11] ], //Absence
								[ $this->policy_ids['regular'][12] ] //Regular
		);

		$schedule_id[0] = $this->createSchedule( $this->user_id, $date_epoch, [
				'status_id'          => 20, //Absence
				'absence_policy_id'  => $this->policy_ids['absence'][10],
				'schedule_policy_id' => $schedule_policy_id,
				'start_time'         => '8:00AM',
				'end_time'           => '8:00PM',
		] );

		//Add absence with a different absence policy, but same pay code, which should be in addition to the schedule entry, and *not* override it.
		$dd->createAbsence( $this->user_id, $date_epoch, ( 1 * 3600 ), $this->policy_ids['absence'][11] );

		$udt_arr = $this->getUserDateTotalArray( $date_epoch, $date_epoch );
		//print_r($udt_arr);

		//Total Time
		$this->assertEquals( 5, $udt_arr[$date_epoch][0]['object_type_id'] );      //5=System Total
		$this->assertEquals( $udt_arr[$date_epoch][0]['pay_code_id'], TTUUID::getZeroID() );
		$this->assertEquals( $udt_arr[$date_epoch][0]['total_time'], ( 12 * 3600 ) );
		$this->assertEquals( $udt_arr[$date_epoch][0]['start_time_stamp'], strtotime( $date_stamp . ' 12:00AM' ) );
		$this->assertEquals( $udt_arr[$date_epoch][0]['end_time_stamp'], strtotime( $date_stamp . ' 7:00PM' ) );

		//Schedule Absence -- Taken from the schedule
		$this->assertEquals( 25, $udt_arr[$date_epoch][1]['object_type_id'] );     //Absence
		$this->assertEquals( $udt_arr[$date_epoch][1]['pay_code_id'], $this->policy_ids['pay_code'][900] );
		$this->assertEquals( $udt_arr[$date_epoch][1]['total_time'], ( 1 * 3600 ) );
		$this->assertEquals( $udt_arr[$date_epoch][1]['start_time_stamp'], strtotime( $date_stamp . ' 12:00AM' ) );
		$this->assertEqualsWithDelta( $udt_arr[$date_epoch][1]['end_time_stamp'], strtotime( $date_stamp . ' 1:00AM' ), 3600 ); //3600 delta due to DST when run on 04-Nov-19

		//TimeSheet Absence -- Taken from the timesheet
		$this->assertEquals( 25, $udt_arr[$date_epoch][2]['object_type_id'] );                                               //Absence
		$this->assertEquals( $udt_arr[$date_epoch][2]['pay_code_id'], $this->policy_ids['pay_code'][900] );
		$this->assertEquals( $udt_arr[$date_epoch][2]['total_time'], ( 11 * 3600 ) );
		$this->assertEquals( $udt_arr[$date_epoch][2]['start_time_stamp'], strtotime( $date_stamp . ' 8:00AM' ) );
		$this->assertEquals( $udt_arr[$date_epoch][2]['end_time_stamp'], strtotime( $date_stamp . ' 7:00PM' ) );

		//Make sure no other hours
		$this->assertCount( 3, $udt_arr[$date_epoch] );

		return true;
	}


	/**
	 * @group OvertimePolicy_testHolidayAbsenceCalendarDayBeforeAndAfterA
	 */
	function testHolidayAbsenceCalendarDayBeforeAndAfterA() {
		global $dd;

		$date_epoch = TTDate::getMiddleDayEpoch( TTDate::getBeginWeekEpoch( time() ) );

		$holiday_epoch = TTDate::incrementDate( TTDate::getMiddleDayEpoch( $date_epoch ), -1, 'day' );

		//Holiday
		$policy_ids['holiday'][] = $this->createHolidayPolicy( $this->company_id, 100 );                       //Calendar Days before and after
		$this->createHoliday( $this->company_id, 10, $holiday_epoch, $policy_ids['holiday'][0] );              //Sat of previous week.

		//Create Policy Group
		$dd->createPolicyGroup( $this->company_id,
								null, //Meal
								null, //Exception
								$policy_ids['holiday'],
								null, //OT
								null, //Premium
								null, //Round
								[ $this->user_id ], //Users
								null, //Break
								null, //Accrual
								null, //Expense
								null, //Absence
								[ $this->policy_ids['regular'][12] ] //Regular
		);


		//
		//Day of Week: 1
		//
		$date_epoch = TTDate::incrementDate( TTDate::getMiddleDayEpoch( TTDate::getBeginWeekEpoch( time() ) ), -2, 'day' );
		$date_stamp = TTDate::getDate( 'DATE', $date_epoch );

		$dd->createPunchPair( $this->user_id,
							  strtotime( $date_stamp . ' 8:00AM' ),
							  strtotime( $date_stamp . ' 4:00PM' ),
							  [
									  'in_type_id'    => 10,
									  'out_type_id'   => 10,
									  'branch_id'     => 0,
									  'department_id' => 0,
									  'job_id'        => 0,
									  'job_item_id'   => 0,
									  'punch_tag_id'  => []
							  ],
							  true
		);

		$udt_arr = $this->getUserDateTotalArray( $date_epoch, $date_epoch );
		//print_r($udt_arr);
		//Total Time
		$this->assertEquals( 5, $udt_arr[$date_epoch][0]['object_type_id'] );                                  //5=System Total
		$this->assertEquals( $udt_arr[$date_epoch][0]['pay_code_id'], TTUUID::getZeroID() );
		$this->assertEquals( $udt_arr[$date_epoch][0]['total_time'], ( 8 * 3600 ) );
		//Regular Time
		$this->assertEquals( 20, $udt_arr[$date_epoch][1]['object_type_id'] );                                 //Regular Time
		$this->assertEquals( $udt_arr[$date_epoch][1]['pay_code_id'], $this->policy_ids['pay_code'][100] );    //Regular Time
		$this->assertEquals( $udt_arr[$date_epoch][1]['total_time'], ( 8 * 3600 ) );
		//Make sure no other hours
		$this->assertCount( 2, $udt_arr[$date_epoch] );


		//
		//Day of Week: 2
		//
		$date_epoch = TTDate::incrementDate( TTDate::getMiddleDayEpoch( TTDate::getBeginWeekEpoch( time() ) ), -0, 'day' );
		$date_stamp = TTDate::getDate( 'DATE', $date_epoch );

		$dd->createPunchPair( $this->user_id,
							  strtotime( $date_stamp . ' 8:00AM' ),
							  strtotime( $date_stamp . ' 4:00PM' ),
							  [
									  'in_type_id'    => 10,
									  'out_type_id'   => 10,
									  'branch_id'     => 0,
									  'department_id' => 0,
									  'job_id'        => 0,
									  'job_item_id'   => 0,
									  'punch_tag_id'  => []
							  ],
							  true
		);

		$udt_arr = $this->getUserDateTotalArray( $date_epoch, $date_epoch );
		//print_r($udt_arr);
		//Total Time
		$this->assertEquals( 5, $udt_arr[$date_epoch][0]['object_type_id'] );                                  //5=System Total
		$this->assertEquals( $udt_arr[$date_epoch][0]['pay_code_id'], TTUUID::getZeroID() );
		$this->assertEquals( $udt_arr[$date_epoch][0]['total_time'], ( 8 * 3600 ) );
		//Regular Time
		$this->assertEquals( 20, $udt_arr[$date_epoch][1]['object_type_id'] );                                 //Regular Time
		$this->assertEquals( $udt_arr[$date_epoch][1]['pay_code_id'], $this->policy_ids['pay_code'][100] );    //Regular Time
		$this->assertEquals( $udt_arr[$date_epoch][1]['total_time'], ( 8 * 3600 ) );
		//Make sure no other hours
		$this->assertCount( 2, $udt_arr[$date_epoch] );


		//
		//Check holiday time
		//
		$udt_arr = $this->getUserDateTotalArray( $holiday_epoch, $holiday_epoch );
		//Total Time
		$this->assertEquals( 5, $udt_arr[$holiday_epoch][0]['object_type_id'] );                               //5=System Total
		$this->assertEquals( $udt_arr[$holiday_epoch][0]['pay_code_id'], TTUUID::getZeroID() );
		$this->assertEquals( $udt_arr[$holiday_epoch][0]['total_time'], ( 8 * 3600 ) );
		//Holiday Time
		$this->assertEquals( 25, $udt_arr[$holiday_epoch][1]['object_type_id'] );                              //Holiday Time
		$this->assertEquals( $udt_arr[$holiday_epoch][1]['pay_code_id'], $this->policy_ids['pay_code'][900] ); //Holiday Time
		$this->assertEquals( $udt_arr[$holiday_epoch][1]['total_time'], ( 8 * 3600 ) );

		return true;
	}


	/**
	 * @group OvertimePolicy_testHolidayAbsenceScheduledDayBeforeAndAfterA1
	 */
	function testHolidayAbsenceScheduledDayBeforeAndAfterA1() {
		global $dd;

		$date_epoch = TTDate::getMiddleDayEpoch( TTDate::getBeginWeekEpoch( time() ) );

		$holiday_epoch = TTDate::incrementDate( TTDate::getMiddleDayEpoch( $date_epoch ), -3, 'day' );

		//Holiday
		$policy_ids['holiday'][] = $this->createHolidayPolicy( $this->company_id, 200 );                       //Scheduled Days before and after
		$this->createHoliday( $this->company_id, 10, $holiday_epoch, $policy_ids['holiday'][0] );              //Thu of previous week

		//Create Policy Group
		$dd->createPolicyGroup( $this->company_id,
								null, //Meal
								null, //Exception
								$policy_ids['holiday'],
								null, //OT
								null, //Premium
								null, //Round
								[ $this->user_id ], //Users
								null, //Break
								null, //Accrual
								null, //Expense
								null, //Absence
								[ $this->policy_ids['regular'][12] ] //Regular
		);


		//
		//Day of Week: 1
		//
		$date_epoch = TTDate::incrementDate( TTDate::getMiddleDayEpoch( TTDate::getBeginWeekEpoch( time() ) ), -5, 'day' );
		$date_stamp = TTDate::getDate( 'DATE', $date_epoch );

		$this->createSchedule( $this->user_id, $date_epoch, [
				'start_time' => ' 8:00AM',
				'end_time'   => '4:00PM',
		] );

		$dd->createPunchPair( $this->user_id,
							  strtotime( $date_stamp . ' 8:00AM' ),
							  strtotime( $date_stamp . ' 4:00PM' ),
							  [
									  'in_type_id'    => 10,
									  'out_type_id'   => 10,
									  'branch_id'     => 0,
									  'department_id' => 0,
									  'job_id'        => 0,
									  'job_item_id'   => 0,
									  'punch_tag_id'  => []
							  ],
							  true
		);

		$udt_arr = $this->getUserDateTotalArray( $date_epoch, $date_epoch );
		//print_r($udt_arr);
		//Total Time
		$this->assertEquals( 5, $udt_arr[$date_epoch][0]['object_type_id'] );                                  //5=System Total
		$this->assertEquals( $udt_arr[$date_epoch][0]['pay_code_id'], TTUUID::getZeroID() );
		$this->assertEquals( $udt_arr[$date_epoch][0]['total_time'], ( 8 * 3600 ) );
		//Regular Time
		$this->assertEquals( 20, $udt_arr[$date_epoch][1]['object_type_id'] );                                 //Regular Time
		$this->assertEquals( $udt_arr[$date_epoch][1]['pay_code_id'], $this->policy_ids['pay_code'][100] );    //Regular Time
		$this->assertEquals( $udt_arr[$date_epoch][1]['total_time'], ( 8 * 3600 ) );
		//Make sure no other hours
		$this->assertCount( 2, $udt_arr[$date_epoch] );


		//
		//Day of Week: 2
		//
		$date_epoch = TTDate::incrementDate( TTDate::getMiddleDayEpoch( TTDate::getBeginWeekEpoch( time() ) ), 0, 'day' );
		$date_stamp = TTDate::getDate( 'DATE', $date_epoch );

		$this->createSchedule( $this->user_id, $date_epoch, [
				'start_time' => ' 8:00AM',
				'end_time'   => '4:00PM',
		] );

		$dd->createPunchPair( $this->user_id,
							  strtotime( $date_stamp . ' 8:00AM' ),
							  strtotime( $date_stamp . ' 4:00PM' ),
							  [
									  'in_type_id'    => 10,
									  'out_type_id'   => 10,
									  'branch_id'     => 0,
									  'department_id' => 0,
									  'job_id'        => 0,
									  'job_item_id'   => 0,
									  'punch_tag_id'  => []
							  ],
							  true
		);

		$udt_arr = $this->getUserDateTotalArray( $date_epoch, $date_epoch );
		//print_r($udt_arr);
		//Total Time
		$this->assertEquals( 5, $udt_arr[$date_epoch][0]['object_type_id'] );                                  //5=System Total
		$this->assertEquals( $udt_arr[$date_epoch][0]['pay_code_id'], TTUUID::getZeroID() );
		$this->assertEquals( $udt_arr[$date_epoch][0]['total_time'], ( 8 * 3600 ) );
		//Regular Time
		$this->assertEquals( 20, $udt_arr[$date_epoch][1]['object_type_id'] );                                 //Regular Time
		$this->assertEquals( $udt_arr[$date_epoch][1]['pay_code_id'], $this->policy_ids['pay_code'][100] );    //Regular Time
		$this->assertEquals( $udt_arr[$date_epoch][1]['total_time'], ( 8 * 3600 ) );
		//Make sure no other hours
		$this->assertCount( 2, $udt_arr[$date_epoch] );


		//
		//Check holiday time
		//
		$udt_arr = $this->getUserDateTotalArray( $holiday_epoch, $holiday_epoch );
		//Total Time
		$this->assertEquals( 5, $udt_arr[$holiday_epoch][0]['object_type_id'] );                               //5=System Total
		$this->assertEquals( $udt_arr[$holiday_epoch][0]['pay_code_id'], TTUUID::getZeroID() );
		$this->assertEquals( $udt_arr[$holiday_epoch][0]['total_time'], ( 8 * 3600 ) );
		//Holiday Time
		$this->assertEquals( 25, $udt_arr[$holiday_epoch][1]['object_type_id'] );                              //Holiday Time
		$this->assertEquals( $udt_arr[$holiday_epoch][1]['pay_code_id'], $this->policy_ids['pay_code'][900] ); //Holiday Time
		$this->assertEquals( $udt_arr[$holiday_epoch][1]['total_time'], ( 8 * 3600 ) );

		return true;
	}

	/**
	 * @group OvertimePolicy_testHolidayAbsenceScheduledDayBeforeAndAfterA2
	 */
	function testHolidayAbsenceScheduledDayBeforeAndAfterA2() {
		global $dd;

		$date_epoch = TTDate::getMiddleDayEpoch( TTDate::getBeginWeekEpoch( time() ) );

		$holiday_epoch = TTDate::incrementDate( TTDate::getMiddleDayEpoch( $date_epoch ), -1, 'day' );

		//Holiday
		$policy_ids['holiday'][] = $this->createHolidayPolicy( $this->company_id, 200 );                       //Scheduled Days before and after
		$this->createHoliday( $this->company_id, 10, $holiday_epoch, $policy_ids['holiday'][0] );              //Thu of previous week

		//Create Policy Group
		$dd->createPolicyGroup( $this->company_id,
								null, //Meal
								null, //Exception
								$policy_ids['holiday'],
								null, //OT
								null, //Premium
								null, //Round
								[ $this->user_id ], //Users
								null, //Break
								null, //Accrual
								null, //Expense
								null, //Absence
								[ $this->policy_ids['regular'][12] ] //Regular
		);


		//
		//Day of Week: 1
		//
		$date_epoch = TTDate::incrementDate( TTDate::getMiddleDayEpoch( TTDate::getBeginWeekEpoch( time() ) ), -2, 'day' );
		$date_stamp = TTDate::getDate( 'DATE', $date_epoch );

		$this->createSchedule( $this->user_id, $date_epoch, [
				'start_time' => ' 8:00AM',
				'end_time'   => '4:00PM',
		] );

		$dd->createPunchPair( $this->user_id,
							  strtotime( $date_stamp . ' 8:00AM' ),
							  strtotime( $date_stamp . ' 4:00PM' ),
							  [
									  'in_type_id'    => 10,
									  'out_type_id'   => 10,
									  'branch_id'     => 0,
									  'department_id' => 0,
									  'job_id'        => 0,
									  'job_item_id'   => 0,
									  'punch_tag_id'  => []
							  ],
							  true
		);

		$udt_arr = $this->getUserDateTotalArray( $date_epoch, $date_epoch );
		//print_r($udt_arr);
		//Total Time
		$this->assertEquals( 5, $udt_arr[$date_epoch][0]['object_type_id'] );                                  //5=System Total
		$this->assertEquals( $udt_arr[$date_epoch][0]['pay_code_id'], TTUUID::getZeroID() );
		$this->assertEquals( $udt_arr[$date_epoch][0]['total_time'], ( 8 * 3600 ) );
		//Regular Time
		$this->assertEquals( 20, $udt_arr[$date_epoch][1]['object_type_id'] );                                 //Regular Time
		$this->assertEquals( $udt_arr[$date_epoch][1]['pay_code_id'], $this->policy_ids['pay_code'][100] );    //Regular Time
		$this->assertEquals( $udt_arr[$date_epoch][1]['total_time'], ( 8 * 3600 ) );
		//Make sure no other hours
		$this->assertCount( 2, $udt_arr[$date_epoch] );


		//
		//Day of Week: 2
		//
		$date_epoch = TTDate::incrementDate( TTDate::getMiddleDayEpoch( TTDate::getBeginWeekEpoch( time() ) ), 0, 'day' );
		$date_stamp = TTDate::getDate( 'DATE', $date_epoch );

		$this->createSchedule( $this->user_id, $date_epoch, [
				'start_time' => ' 8:00AM',
				'end_time'   => '4:00PM',
		] );

		$dd->createPunchPair( $this->user_id,
							  strtotime( $date_stamp . ' 8:00AM' ),
							  strtotime( $date_stamp . ' 4:00PM' ),
							  [
									  'in_type_id'    => 10,
									  'out_type_id'   => 10,
									  'branch_id'     => 0,
									  'department_id' => 0,
									  'job_id'        => 0,
									  'job_item_id'   => 0,
									  'punch_tag_id'  => []
							  ],
							  true
		);

		$udt_arr = $this->getUserDateTotalArray( $date_epoch, $date_epoch );
		//print_r($udt_arr);
		//Total Time
		$this->assertEquals( 5, $udt_arr[$date_epoch][0]['object_type_id'] );                                  //5=System Total
		$this->assertEquals( $udt_arr[$date_epoch][0]['pay_code_id'], TTUUID::getZeroID() );
		$this->assertEquals( $udt_arr[$date_epoch][0]['total_time'], ( 8 * 3600 ) );
		//Regular Time
		$this->assertEquals( 20, $udt_arr[$date_epoch][1]['object_type_id'] );                                 //Regular Time
		$this->assertEquals( $udt_arr[$date_epoch][1]['pay_code_id'], $this->policy_ids['pay_code'][100] );    //Regular Time
		$this->assertEquals( $udt_arr[$date_epoch][1]['total_time'], ( 8 * 3600 ) );
		//Make sure no other hours
		$this->assertCount( 2, $udt_arr[$date_epoch] );


		//
		//Check holiday time
		//
		$udt_arr = $this->getUserDateTotalArray( $holiday_epoch, $holiday_epoch );
		//Total Time
		$this->assertEquals( 5, $udt_arr[$holiday_epoch][0]['object_type_id'] );                               //5=System Total
		$this->assertEquals( $udt_arr[$holiday_epoch][0]['pay_code_id'], TTUUID::getZeroID() );
		$this->assertEquals( $udt_arr[$holiday_epoch][0]['total_time'], ( 8 * 3600 ) );
		//Holiday Time
		$this->assertEquals( 25, $udt_arr[$holiday_epoch][1]['object_type_id'] );                              //Holiday Time
		$this->assertEquals( $udt_arr[$holiday_epoch][1]['pay_code_id'], $this->policy_ids['pay_code'][900] ); //Holiday Time
		$this->assertEquals( $udt_arr[$holiday_epoch][1]['total_time'], ( 8 * 3600 ) );

		return true;
	}

	/**
	 * @group OvertimePolicy_testHolidayAbsenceScheduledDayBeforeAndAfterA3
	 */
	function testHolidayAbsenceScheduledDayBeforeAndAfterA3() {
		global $dd;

		$date_epoch = TTDate::getMiddleDayEpoch( TTDate::getBeginWeekEpoch( time() ) );

		$holiday_epoch = TTDate::incrementDate( TTDate::getMiddleDayEpoch( $date_epoch ), -1, 'day' );

		//Holiday
		$policy_ids['holiday'][] = $this->createHolidayPolicy( $this->company_id, 200 );                    //Scheduled Days before and after
		$this->createHoliday( $this->company_id, 10, $holiday_epoch, $policy_ids['holiday'][0] );           //Thu of previous week

		//Create Policy Group
		$dd->createPolicyGroup( $this->company_id,
								null, //Meal
								null, //Exception
								$policy_ids['holiday'],
								null, //OT
								null, //Premium
								null, //Round
								[ $this->user_id ], //Users
								null, //Break
								null, //Accrual
								null, //Expense
								null, //Absence
								[ $this->policy_ids['regular'][12] ] //Regular
		);


		//
		//Day of Week: 1
		//
		$date_epoch = TTDate::incrementDate( TTDate::getMiddleDayEpoch( TTDate::getBeginWeekEpoch( time() ) ), -2, 'day' );

		$this->createSchedule( $this->user_id, $date_epoch, [
				'start_time' => ' 8:00AM',
				'end_time'   => '4:00PM',
		] );


		//
		//Day of Week: 2
		//
		$date_epoch = TTDate::incrementDate( TTDate::getMiddleDayEpoch( TTDate::getBeginWeekEpoch( time() ) ), 0, 'day' );
		$date_stamp = TTDate::getDate( 'DATE', $date_epoch );

		$this->createSchedule( $this->user_id, $date_epoch, [
				'start_time' => ' 8:00AM',
				'end_time'   => '4:00PM',
		] );

		$dd->createPunchPair( $this->user_id,
							  strtotime( $date_stamp . ' 8:00AM' ),
							  strtotime( $date_stamp . ' 4:00PM' ),
							  [
									  'in_type_id'    => 10,
									  'out_type_id'   => 10,
									  'branch_id'     => 0,
									  'department_id' => 0,
									  'job_id'        => 0,
									  'job_item_id'   => 0,
									  'punch_tag_id'  => []
							  ],
							  true
		);

		$udt_arr = $this->getUserDateTotalArray( $date_epoch, $date_epoch );
		//print_r($udt_arr);
		//Total Time
		$this->assertEquals( 5, $udt_arr[$date_epoch][0]['object_type_id'] );                               //5=System Total
		$this->assertEquals( $udt_arr[$date_epoch][0]['pay_code_id'], TTUUID::getZeroID() );
		$this->assertEquals( $udt_arr[$date_epoch][0]['total_time'], ( 8 * 3600 ) );
		//Regular Time
		$this->assertEquals( 20, $udt_arr[$date_epoch][1]['object_type_id'] );                              //Regular Time
		$this->assertEquals( $udt_arr[$date_epoch][1]['pay_code_id'], $this->policy_ids['pay_code'][100] ); //Regular Time
		$this->assertEquals( $udt_arr[$date_epoch][1]['total_time'], ( 8 * 3600 ) );
		//Make sure no other hours
		$this->assertCount( 2, $udt_arr[$date_epoch] );


		//
		//Check holiday time
		//
		$udt_arr = $this->getUserDateTotalArray( $holiday_epoch, $holiday_epoch );
		$this->assertArrayNotHasKey( $holiday_epoch, $udt_arr );

		return true;
	}

	/**
	 * @group OvertimePolicy_testHolidayAbsenceScheduledDayBeforeAndAfterA4
	 */
	function testHolidayAbsenceScheduledDayBeforeAndAfterA4() {
		global $dd;

		$date_epoch = TTDate::getMiddleDayEpoch( TTDate::getBeginWeekEpoch( time() ) );

		$holiday_epoch = TTDate::incrementDate( TTDate::getMiddleDayEpoch( $date_epoch ), -1, 'day' );

		//Holiday
		$policy_ids['holiday'][] = $this->createHolidayPolicy( $this->company_id, 200 );                    //Scheduled Days before and after
		$this->createHoliday( $this->company_id, 10, $holiday_epoch, $policy_ids['holiday'][0] );           //Thu of previous week

		//Create Policy Group
		$dd->createPolicyGroup( $this->company_id,
								null, //Meal
								null, //Exception
								$policy_ids['holiday'],
								null, //OT
								null, //Premium
								null, //Round
								[ $this->user_id ], //Users
								null, //Break
								null, //Accrual
								null, //Expense
								null, //Absence
								[ $this->policy_ids['regular'][12] ] //Regular
		);


		//
		//Day of Week: 1
		//
		$date_epoch = TTDate::incrementDate( TTDate::getMiddleDayEpoch( TTDate::getBeginWeekEpoch( time() ) ), -2, 'day' );
		$date_stamp = TTDate::getDate( 'DATE', $date_epoch );

		$this->createSchedule( $this->user_id, $date_epoch, [
				'start_time' => ' 8:00AM',
				'end_time'   => '4:00PM',
		] );

		$dd->createPunchPair( $this->user_id,
							  strtotime( $date_stamp . ' 8:00AM' ),
							  strtotime( $date_stamp . ' 4:00PM' ),
							  [
									  'in_type_id'    => 10,
									  'out_type_id'   => 10,
									  'branch_id'     => 0,
									  'department_id' => 0,
									  'job_id'        => 0,
									  'job_item_id'   => 0,
									  'punch_tag_id'  => []
							  ],
							  true
		);

		$udt_arr = $this->getUserDateTotalArray( $date_epoch, $date_epoch );
		//print_r($udt_arr);
		//Total Time
		$this->assertEquals( 5, $udt_arr[$date_epoch][0]['object_type_id'] );                               //5=System Total
		$this->assertEquals( $udt_arr[$date_epoch][0]['pay_code_id'], TTUUID::getZeroID() );
		$this->assertEquals( $udt_arr[$date_epoch][0]['total_time'], ( 8 * 3600 ) );
		//Regular Time
		$this->assertEquals( 20, $udt_arr[$date_epoch][1]['object_type_id'] );                              //Regular Time
		$this->assertEquals( $udt_arr[$date_epoch][1]['pay_code_id'], $this->policy_ids['pay_code'][100] ); //Regular Time
		$this->assertEquals( $udt_arr[$date_epoch][1]['total_time'], ( 8 * 3600 ) );
		//Make sure no other hours
		$this->assertCount( 2, $udt_arr[$date_epoch] );


		//
		//Day of Week: 2
		//
		$date_epoch = TTDate::incrementDate( TTDate::getMiddleDayEpoch( TTDate::getBeginWeekEpoch( time() ) ), 0, 'day' );

		$this->createSchedule( $this->user_id, $date_epoch, [
				'start_time' => ' 8:00AM',
				'end_time'   => '4:00PM',
		] );

		//
		//Check holiday time
		//
		$udt_arr = $this->getUserDateTotalArray( $holiday_epoch, $holiday_epoch );
		$this->assertArrayNotHasKey( $holiday_epoch, $udt_arr );

		return true;
	}

	/**
	 * @group OvertimePolicy_testHolidayAbsenceScheduledDayBeforeAndAfterA5A
	 */
	function testHolidayAbsenceScheduledDayBeforeAndAfterA5A() {
		global $dd;

		$date_epoch = TTDate::getMiddleDayEpoch( TTDate::getBeginWeekEpoch( time() ) );

		$holiday_epoch = TTDate::incrementDate( TTDate::getMiddleDayEpoch( $date_epoch ), -1, 'day' );

		//Holiday
		$policy_ids['holiday'][] = $this->createHolidayPolicy( $this->company_id, 200 );                    //Scheduled Days before and after
		$this->createHoliday( $this->company_id, 10, $holiday_epoch, $policy_ids['holiday'][0] );           //Thu of previous week

		//Create Policy Group
		$dd->createPolicyGroup( $this->company_id,
								null, //Meal
								null, //Exception
								$policy_ids['holiday'],
								null, //OT
								null, //Premium
								null, //Round
								[ $this->user_id ], //Users
								null, //Break
								null, //Accrual
								null, //Expense
								null, //Absence
								[ $this->policy_ids['regular'][12] ] //Regular
		);


		//
		//Day of Week: 1
		//
		$date_epoch = TTDate::incrementDate( TTDate::getMiddleDayEpoch( TTDate::getBeginWeekEpoch( time() ) ), -3, 'day' );
		$date_stamp = TTDate::getDate( 'DATE', $date_epoch );

		$this->createSchedule( $this->user_id, $date_epoch, [
				'start_time' => ' 8:00AM',
				'end_time'   => '4:00PM',
		] );

		$dd->createPunchPair( $this->user_id,
							  strtotime( $date_stamp . ' 8:00AM' ),
							  strtotime( $date_stamp . ' 4:00PM' ),
							  [
									  'in_type_id'    => 10,
									  'out_type_id'   => 10,
									  'branch_id'     => 0,
									  'department_id' => 0,
									  'job_id'        => 0,
									  'job_item_id'   => 0,
									  'punch_tag_id'  => []
							  ],
							  true
		);

		$udt_arr = $this->getUserDateTotalArray( $date_epoch, $date_epoch );
		//print_r($udt_arr);
		//Total Time
		$this->assertEquals( 5, $udt_arr[$date_epoch][0]['object_type_id'] );                               //5=System Total
		$this->assertEquals( $udt_arr[$date_epoch][0]['pay_code_id'], TTUUID::getZeroID() );
		$this->assertEquals( $udt_arr[$date_epoch][0]['total_time'], ( 8 * 3600 ) );
		//Regular Time
		$this->assertEquals( 20, $udt_arr[$date_epoch][1]['object_type_id'] );                              //Regular Time
		$this->assertEquals( $udt_arr[$date_epoch][1]['pay_code_id'], $this->policy_ids['pay_code'][100] ); //Regular Time
		$this->assertEquals( $udt_arr[$date_epoch][1]['total_time'], ( 8 * 3600 ) );
		//Make sure no other hours
		$this->assertCount( 2, $udt_arr[$date_epoch] );

		//
		//Day of Week: 2
		//
		$date_epoch = TTDate::incrementDate( TTDate::getMiddleDayEpoch( TTDate::getBeginWeekEpoch( time() ) ), -2, 'day' );

		$this->createSchedule( $this->user_id, $date_epoch, [
				'start_time' => ' 8:00AM',
				'end_time'   => '4:00PM',
		] );


		//
		//Day of Week: 2
		//
		$date_epoch = TTDate::incrementDate( TTDate::getMiddleDayEpoch( TTDate::getBeginWeekEpoch( time() ) ), 0, 'day' );
		$date_stamp = TTDate::getDate( 'DATE', $date_epoch );

		$this->createSchedule( $this->user_id, $date_epoch, [
				'start_time' => ' 8:00AM',
				'end_time'   => '4:00PM',
		] );

		$dd->createPunchPair( $this->user_id,
							  strtotime( $date_stamp . ' 8:00AM' ),
							  strtotime( $date_stamp . ' 4:00PM' ),
							  [
									  'in_type_id'    => 10,
									  'out_type_id'   => 10,
									  'branch_id'     => 0,
									  'department_id' => 0,
									  'job_id'        => 0,
									  'job_item_id'   => 0,
									  'punch_tag_id'  => []
							  ],
							  true
		);

		$udt_arr = $this->getUserDateTotalArray( $date_epoch, $date_epoch );
		//print_r($udt_arr);
		//Total Time
		$this->assertEquals( 5, $udt_arr[$date_epoch][0]['object_type_id'] );                               //5=System Total
		$this->assertEquals( $udt_arr[$date_epoch][0]['pay_code_id'], TTUUID::getZeroID() );
		$this->assertEquals( $udt_arr[$date_epoch][0]['total_time'], ( 8 * 3600 ) );
		//Regular Time
		$this->assertEquals( 20, $udt_arr[$date_epoch][1]['object_type_id'] );                              //Regular Time
		$this->assertEquals( $udt_arr[$date_epoch][1]['pay_code_id'], $this->policy_ids['pay_code'][100] ); //Regular Time
		$this->assertEquals( $udt_arr[$date_epoch][1]['total_time'], ( 8 * 3600 ) );
		//Make sure no other hours
		$this->assertCount( 2, $udt_arr[$date_epoch] );


		//
		//Check holiday time
		//
		$udt_arr = $this->getUserDateTotalArray( $holiday_epoch, $holiday_epoch );
		$this->assertArrayNotHasKey( $holiday_epoch, $udt_arr );

		return true;
	}

	/**
	 * @group OvertimePolicy_testHolidayAbsenceScheduledDayBeforeAndAfterA5B
	 */
	function testHolidayAbsenceScheduledDayBeforeAndAfterA5B() {
		global $dd;

		$date_epoch = TTDate::getMiddleDayEpoch( TTDate::getBeginWeekEpoch( time() ) );

		$holiday_epoch = TTDate::incrementDate( TTDate::getMiddleDayEpoch( $date_epoch ), -1, 'day' );

		//Holiday
		$policy_ids['holiday'][] = $this->createHolidayPolicy( $this->company_id, 200 );                       //Scheduled Days before and after
		$this->createHoliday( $this->company_id, 10, $holiday_epoch, $policy_ids['holiday'][0] );              //Thu of previous week

		//Create Policy Group
		$dd->createPolicyGroup( $this->company_id,
								null, //Meal
								null, //Exception
								$policy_ids['holiday'],
								null, //OT
								null, //Premium
								null, //Round
								[ $this->user_id ], //Users
								null, //Break
								null, //Accrual
								null, //Expense
								null, //Absence
								[ $this->policy_ids['regular'][12] ] //Regular
		);


		//
		//Day of Week: 1
		//
		$date_epoch = TTDate::incrementDate( TTDate::getMiddleDayEpoch( TTDate::getBeginWeekEpoch( time() ) ), -3, 'day' );
		$date_stamp = TTDate::getDate( 'DATE', $date_epoch );

		$this->createSchedule( $this->user_id, $date_epoch, [
				'start_time' => ' 8:00AM',
				'end_time'   => '4:00PM',
		] );

		$dd->createPunchPair( $this->user_id,
							  strtotime( $date_stamp . ' 8:00AM' ),
							  strtotime( $date_stamp . ' 4:00PM' ),
							  [
									  'in_type_id'    => 10,
									  'out_type_id'   => 10,
									  'branch_id'     => 0,
									  'department_id' => 0,
									  'job_id'        => 0,
									  'job_item_id'   => 0,
									  'punch_tag_id'  => []
							  ],
							  true
		);

		$udt_arr = $this->getUserDateTotalArray( $date_epoch, $date_epoch );
		//print_r($udt_arr);
		//Total Time
		$this->assertEquals( 5, $udt_arr[$date_epoch][0]['object_type_id'] );                                  //5=System Total
		$this->assertEquals( $udt_arr[$date_epoch][0]['pay_code_id'], TTUUID::getZeroID() );
		$this->assertEquals( $udt_arr[$date_epoch][0]['total_time'], ( 8 * 3600 ) );
		//Regular Time
		$this->assertEquals( 20, $udt_arr[$date_epoch][1]['object_type_id'] );                                 //Regular Time
		$this->assertEquals( $udt_arr[$date_epoch][1]['pay_code_id'], $this->policy_ids['pay_code'][100] );    //Regular Time
		$this->assertEquals( $udt_arr[$date_epoch][1]['total_time'], ( 8 * 3600 ) );
		//Make sure no other hours
		$this->assertCount( 2, $udt_arr[$date_epoch] );

		//
		//Day of Week: 2
		//
		$date_epoch = TTDate::incrementDate( TTDate::getMiddleDayEpoch( TTDate::getBeginWeekEpoch( time() ) ), -2, 'day' );

		$this->createSchedule( $this->user_id, $date_epoch, [
				'status_id'  => 20, //Absence
				'start_time' => ' 8:00AM',
				'end_time'   => '4:00PM',
		] );


		//
		//Day of Week: 2
		//
		$date_epoch = TTDate::incrementDate( TTDate::getMiddleDayEpoch( TTDate::getBeginWeekEpoch( time() ) ), 0, 'day' );
		$date_stamp = TTDate::getDate( 'DATE', $date_epoch );

		$this->createSchedule( $this->user_id, $date_epoch, [
				'start_time' => ' 8:00AM',
				'end_time'   => '4:00PM',
		] );

		$dd->createPunchPair( $this->user_id,
							  strtotime( $date_stamp . ' 8:00AM' ),
							  strtotime( $date_stamp . ' 4:00PM' ),
							  [
									  'in_type_id'    => 10,
									  'out_type_id'   => 10,
									  'branch_id'     => 0,
									  'department_id' => 0,
									  'job_id'        => 0,
									  'job_item_id'   => 0,
									  'punch_tag_id'  => []
							  ],
							  true
		);

		$udt_arr = $this->getUserDateTotalArray( $date_epoch, $date_epoch );
		//print_r($udt_arr);
		//Total Time
		$this->assertEquals( 5, $udt_arr[$date_epoch][0]['object_type_id'] );                                  //5=System Total
		$this->assertEquals( $udt_arr[$date_epoch][0]['pay_code_id'], TTUUID::getZeroID() );
		$this->assertEquals( $udt_arr[$date_epoch][0]['total_time'], ( 8 * 3600 ) );
		//Regular Time
		$this->assertEquals( 20, $udt_arr[$date_epoch][1]['object_type_id'] );                                 //Regular Time
		$this->assertEquals( $udt_arr[$date_epoch][1]['pay_code_id'], $this->policy_ids['pay_code'][100] );    //Regular Time
		$this->assertEquals( $udt_arr[$date_epoch][1]['total_time'], ( 8 * 3600 ) );
		//Make sure no other hours
		$this->assertCount( 2, $udt_arr[$date_epoch] );


		//
		//Check holiday time
		//
		$udt_arr = $this->getUserDateTotalArray( $holiday_epoch, $holiday_epoch );
		//Total Time
		$this->assertEquals( 5, $udt_arr[$holiday_epoch][0]['object_type_id'] );                               //5=System Total
		$this->assertEquals( $udt_arr[$holiday_epoch][0]['pay_code_id'], TTUUID::getZeroID() );
		$this->assertEquals( $udt_arr[$holiday_epoch][0]['total_time'], ( 8 * 3600 ) );
		//Holiday Time
		$this->assertEquals( 25, $udt_arr[$holiday_epoch][1]['object_type_id'] );                              //Holiday Time
		$this->assertEquals( $udt_arr[$holiday_epoch][1]['pay_code_id'], $this->policy_ids['pay_code'][900] ); //Holiday Time
		$this->assertEquals( $udt_arr[$holiday_epoch][1]['total_time'], ( 8 * 3600 ) );

		return true;
	}


	/**
	 * @group OvertimePolicy_testHolidayAbsenceScheduledDayBeforeAndAfterA6A
	 */
	function testHolidayAbsenceScheduledDayBeforeAndAfterA6A() {
		global $dd;

		$date_epoch = TTDate::getMiddleDayEpoch( TTDate::getBeginWeekEpoch( time() ) );

		$holiday_epoch = TTDate::incrementDate( TTDate::getMiddleDayEpoch( $date_epoch ), -2, 'day' );

		//Holiday
		$policy_ids['holiday'][] = $this->createHolidayPolicy( $this->company_id, 200 );                    //Scheduled Days before and after
		$this->createHoliday( $this->company_id, 10, $holiday_epoch, $policy_ids['holiday'][0] );           //Thu of previous week

		//Create Policy Group
		$dd->createPolicyGroup( $this->company_id,
								null, //Meal
								null, //Exception
								$policy_ids['holiday'],
								null, //OT
								null, //Premium
								null, //Round
								[ $this->user_id ], //Users
								null, //Break
								null, //Accrual
								null, //Expense
								null, //Absence
								[ $this->policy_ids['regular'][12] ] //Regular
		);


		//
		//Day of Week: 1
		//
		$date_epoch = TTDate::incrementDate( TTDate::getMiddleDayEpoch( TTDate::getBeginWeekEpoch( time() ) ), -3, 'day' );
		$date_stamp = TTDate::getDate( 'DATE', $date_epoch );

		$this->createSchedule( $this->user_id, $date_epoch, [
				'start_time' => ' 8:00AM',
				'end_time'   => '4:00PM',
		] );

		$dd->createPunchPair( $this->user_id,
							  strtotime( $date_stamp . ' 8:00AM' ),
							  strtotime( $date_stamp . ' 4:00PM' ),
							  [
									  'in_type_id'    => 10,
									  'out_type_id'   => 10,
									  'branch_id'     => 0,
									  'department_id' => 0,
									  'job_id'        => 0,
									  'job_item_id'   => 0,
									  'punch_tag_id'  => []
							  ],
							  true
		);

		$udt_arr = $this->getUserDateTotalArray( $date_epoch, $date_epoch );
		//print_r($udt_arr);
		//Total Time
		$this->assertEquals( 5, $udt_arr[$date_epoch][0]['object_type_id'] );                               //5=System Total
		$this->assertEquals( $udt_arr[$date_epoch][0]['pay_code_id'], TTUUID::getZeroID() );
		$this->assertEquals( $udt_arr[$date_epoch][0]['total_time'], ( 8 * 3600 ) );
		//Regular Time
		$this->assertEquals( 20, $udt_arr[$date_epoch][1]['object_type_id'] );                              //Regular Time
		$this->assertEquals( $udt_arr[$date_epoch][1]['pay_code_id'], $this->policy_ids['pay_code'][100] ); //Regular Time
		$this->assertEquals( $udt_arr[$date_epoch][1]['total_time'], ( 8 * 3600 ) );
		//Make sure no other hours
		$this->assertCount( 2, $udt_arr[$date_epoch] );

		//
		//Day of Week: 2
		//
		$date_epoch = TTDate::incrementDate( TTDate::getMiddleDayEpoch( TTDate::getBeginWeekEpoch( time() ) ), -1, 'day' );

		$this->createSchedule( $this->user_id, $date_epoch, [
				'start_time' => ' 8:00AM',
				'end_time'   => '4:00PM',
		] );


		//
		//Day of Week: 2
		//
		$date_epoch = TTDate::incrementDate( TTDate::getMiddleDayEpoch( TTDate::getBeginWeekEpoch( time() ) ), 0, 'day' );
		$date_stamp = TTDate::getDate( 'DATE', $date_epoch );

		$this->createSchedule( $this->user_id, $date_epoch, [
				'start_time' => ' 8:00AM',
				'end_time'   => '4:00PM',
		] );

		$dd->createPunchPair( $this->user_id,
							  strtotime( $date_stamp . ' 8:00AM' ),
							  strtotime( $date_stamp . ' 4:00PM' ),
							  [
									  'in_type_id'    => 10,
									  'out_type_id'   => 10,
									  'branch_id'     => 0,
									  'department_id' => 0,
									  'job_id'        => 0,
									  'job_item_id'   => 0,
									  'punch_tag_id'  => []
							  ],
							  true
		);

		$udt_arr = $this->getUserDateTotalArray( $date_epoch, $date_epoch );
		//print_r($udt_arr);
		//Total Time
		$this->assertEquals( 5, $udt_arr[$date_epoch][0]['object_type_id'] );                               //5=System Total
		$this->assertEquals( $udt_arr[$date_epoch][0]['pay_code_id'], TTUUID::getZeroID() );
		$this->assertEquals( $udt_arr[$date_epoch][0]['total_time'], ( 8 * 3600 ) );
		//Regular Time
		$this->assertEquals( 20, $udt_arr[$date_epoch][1]['object_type_id'] );                              //Regular Time
		$this->assertEquals( $udt_arr[$date_epoch][1]['pay_code_id'], $this->policy_ids['pay_code'][100] ); //Regular Time
		$this->assertEquals( $udt_arr[$date_epoch][1]['total_time'], ( 8 * 3600 ) );
		//Make sure no other hours
		$this->assertCount( 2, $udt_arr[$date_epoch] );


		//
		//Check holiday time
		//
		$udt_arr = $this->getUserDateTotalArray( $holiday_epoch, $holiday_epoch );
		$this->assertArrayNotHasKey( $holiday_epoch, $udt_arr );

		return true;
	}

	/**
	 * @group OvertimePolicy_testHolidayAbsenceScheduledDayBeforeAndAfterA6B
	 */
	function testHolidayAbsenceScheduledDayBeforeAndAfterA6B() {
		global $dd;

		$date_epoch = TTDate::getMiddleDayEpoch( TTDate::getBeginWeekEpoch( time() ) );

		$holiday_epoch = TTDate::incrementDate( TTDate::getMiddleDayEpoch( $date_epoch ), -2, 'day' );

		//Holiday
		$policy_ids['holiday'][] = $this->createHolidayPolicy( $this->company_id, 200 );                       //Scheduled Days before and after
		$this->createHoliday( $this->company_id, 10, $holiday_epoch, $policy_ids['holiday'][0] );              //Thu of previous week

		//Create Policy Group
		$dd->createPolicyGroup( $this->company_id,
								null, //Meal
								null, //Exception
								$policy_ids['holiday'],
								null, //OT
								null, //Premium
								null, //Round
								[ $this->user_id ], //Users
								null, //Break
								null, //Accrual
								null, //Expense
								null, //Absence
								[ $this->policy_ids['regular'][12] ] //Regular
		);


		//
		//Day of Week: 1
		//
		$date_epoch = TTDate::incrementDate( TTDate::getMiddleDayEpoch( TTDate::getBeginWeekEpoch( time() ) ), -3, 'day' );
		$date_stamp = TTDate::getDate( 'DATE', $date_epoch );

		$this->createSchedule( $this->user_id, $date_epoch, [
				'start_time' => ' 8:00AM',
				'end_time'   => '4:00PM',
		] );

		$dd->createPunchPair( $this->user_id,
							  strtotime( $date_stamp . ' 8:00AM' ),
							  strtotime( $date_stamp . ' 4:00PM' ),
							  [
									  'in_type_id'    => 10,
									  'out_type_id'   => 10,
									  'branch_id'     => 0,
									  'department_id' => 0,
									  'job_id'        => 0,
									  'job_item_id'   => 0,
									  'punch_tag_id'  => []
							  ],
							  true
		);

		$udt_arr = $this->getUserDateTotalArray( $date_epoch, $date_epoch );
		//print_r($udt_arr);
		//Total Time
		$this->assertEquals( 5, $udt_arr[$date_epoch][0]['object_type_id'] );                                  //5=System Total
		$this->assertEquals( $udt_arr[$date_epoch][0]['pay_code_id'], TTUUID::getZeroID() );
		$this->assertEquals( $udt_arr[$date_epoch][0]['total_time'], ( 8 * 3600 ) );
		//Regular Time
		$this->assertEquals( 20, $udt_arr[$date_epoch][1]['object_type_id'] );                                 //Regular Time
		$this->assertEquals( $udt_arr[$date_epoch][1]['pay_code_id'], $this->policy_ids['pay_code'][100] );    //Regular Time
		$this->assertEquals( $udt_arr[$date_epoch][1]['total_time'], ( 8 * 3600 ) );
		//Make sure no other hours
		$this->assertCount( 2, $udt_arr[$date_epoch] );

		//
		//Day of Week: 2
		//
		$date_epoch = TTDate::incrementDate( TTDate::getMiddleDayEpoch( TTDate::getBeginWeekEpoch( time() ) ), 1, 'day' );

		$this->createSchedule( $this->user_id, $date_epoch, [
				'status_id'  => 20, //Absence
				'start_time' => ' 8:00AM',
				'end_time'   => '4:00PM',
		] );


		//
		//Day of Week: 2
		//
		$date_epoch = TTDate::incrementDate( TTDate::getMiddleDayEpoch( TTDate::getBeginWeekEpoch( time() ) ), 0, 'day' );
		$date_stamp = TTDate::getDate( 'DATE', $date_epoch );

		$this->createSchedule( $this->user_id, $date_epoch, [
				'start_time' => ' 8:00AM',
				'end_time'   => '4:00PM',
		] );

		$dd->createPunchPair( $this->user_id,
							  strtotime( $date_stamp . ' 8:00AM' ),
							  strtotime( $date_stamp . ' 4:00PM' ),
							  [
									  'in_type_id'    => 10,
									  'out_type_id'   => 10,
									  'branch_id'     => 0,
									  'department_id' => 0,
									  'job_id'        => 0,
									  'job_item_id'   => 0,
									  'punch_tag_id'  => []
							  ],
							  true
		);

		$udt_arr = $this->getUserDateTotalArray( $date_epoch, $date_epoch );
		//print_r($udt_arr);
		//Total Time
		$this->assertEquals( 5, $udt_arr[$date_epoch][0]['object_type_id'] );                                  //5=System Total
		$this->assertEquals( $udt_arr[$date_epoch][0]['pay_code_id'], TTUUID::getZeroID() );
		$this->assertEquals( $udt_arr[$date_epoch][0]['total_time'], ( 8 * 3600 ) );
		//Regular Time
		$this->assertEquals( 20, $udt_arr[$date_epoch][1]['object_type_id'] );                                 //Regular Time
		$this->assertEquals( $udt_arr[$date_epoch][1]['pay_code_id'], $this->policy_ids['pay_code'][100] );    //Regular Time
		$this->assertEquals( $udt_arr[$date_epoch][1]['total_time'], ( 8 * 3600 ) );
		//Make sure no other hours
		$this->assertCount( 2, $udt_arr[$date_epoch] );


		//
		//Check holiday time
		//
		$udt_arr = $this->getUserDateTotalArray( $holiday_epoch, $holiday_epoch );
		//Total Time
		$this->assertEquals( 5, $udt_arr[$holiday_epoch][0]['object_type_id'] );                               //5=System Total
		$this->assertEquals( $udt_arr[$holiday_epoch][0]['pay_code_id'], TTUUID::getZeroID() );
		$this->assertEquals( $udt_arr[$holiday_epoch][0]['total_time'], ( 8 * 3600 ) );
		//Holiday Time
		$this->assertEquals( 25, $udt_arr[$holiday_epoch][1]['object_type_id'] );                              //Holiday Time
		$this->assertEquals( $udt_arr[$holiday_epoch][1]['pay_code_id'], $this->policy_ids['pay_code'][900] ); //Holiday Time
		$this->assertEquals( $udt_arr[$holiday_epoch][1]['total_time'], ( 8 * 3600 ) );

		return true;
	}

	/**
	 * @group OvertimePolicy_testHolidayAbsenceScheduledDayBeforeAndAfterB1
	 */
	function testHolidayAbsenceScheduledDayBeforeAndAfterB1() {
		global $dd;

		$date_epoch = TTDate::getMiddleDayEpoch( TTDate::getBeginWeekEpoch( time() ) );

		$holiday_epoch = TTDate::incrementDate( TTDate::getMiddleDayEpoch( $date_epoch ), -3, 'day' );

		//Holiday
		$policy_ids['holiday'][] = $this->createHolidayPolicy( $this->company_id, 200 );                       //Scheduled Days before and after
		$this->createHoliday( $this->company_id, 10, $holiday_epoch, $policy_ids['holiday'][0] );              //Thu of previous week

		//Create Policy Group
		$dd->createPolicyGroup( $this->company_id,
								null, //Meal
								null, //Exception
								$policy_ids['holiday'],
								null, //OT
								null, //Premium
								null, //Round
								[ $this->user_id ], //Users
								null, //Break
								null, //Accrual
								null, //Expense
								null, //Absence
								[ $this->policy_ids['regular'][12] ] //Regular
		);


		//
		//Day of Week: 1
		//
		$date_epoch = TTDate::incrementDate( TTDate::getMiddleDayEpoch( TTDate::getBeginWeekEpoch( time() ) ), -14, 'day' );
		$date_stamp = TTDate::getDate( 'DATE', $date_epoch );

		$this->createSchedule( $this->user_id, $date_epoch, [
				'start_time' => ' 8:00AM',
				'end_time'   => '4:00PM',
		] );

		$dd->createPunchPair( $this->user_id,
							  strtotime( $date_stamp . ' 8:00AM' ),
							  strtotime( $date_stamp . ' 4:00PM' ),
							  [
									  'in_type_id'    => 10,
									  'out_type_id'   => 10,
									  'branch_id'     => 0,
									  'department_id' => 0,
									  'job_id'        => 0,
									  'job_item_id'   => 0,
									  'punch_tag_id'  => []
							  ],
							  true
		);

		$udt_arr = $this->getUserDateTotalArray( $date_epoch, $date_epoch );
		//print_r($udt_arr);
		//Total Time
		$this->assertEquals( 5, $udt_arr[$date_epoch][0]['object_type_id'] );                                  //5=System Total
		$this->assertEquals( $udt_arr[$date_epoch][0]['pay_code_id'], TTUUID::getZeroID() );
		$this->assertEquals( $udt_arr[$date_epoch][0]['total_time'], ( 8 * 3600 ) );
		//Regular Time
		$this->assertEquals( 20, $udt_arr[$date_epoch][1]['object_type_id'] );                                 //Regular Time
		$this->assertEquals( $udt_arr[$date_epoch][1]['pay_code_id'], $this->policy_ids['pay_code'][100] );    //Regular Time
		$this->assertEquals( $udt_arr[$date_epoch][1]['total_time'], ( 8 * 3600 ) );
		//Make sure no other hours
		$this->assertCount( 2, $udt_arr[$date_epoch] );


		//
		//Day of Week: 2
		//
		$date_epoch = TTDate::incrementDate( TTDate::getMiddleDayEpoch( TTDate::getBeginWeekEpoch( time() ) ), 0, 'day' );
		$date_stamp = TTDate::getDate( 'DATE', $date_epoch );

		$this->createSchedule( $this->user_id, $date_epoch, [
				'start_time' => ' 8:00AM',
				'end_time'   => '4:00PM',
		] );

		$dd->createPunchPair( $this->user_id,
							  strtotime( $date_stamp . ' 8:00AM' ),
							  strtotime( $date_stamp . ' 4:00PM' ),
							  [
									  'in_type_id'    => 10,
									  'out_type_id'   => 10,
									  'branch_id'     => 0,
									  'department_id' => 0,
									  'job_id'        => 0,
									  'job_item_id'   => 0,
									  'punch_tag_id'  => []
							  ],
							  true
		);

		$udt_arr = $this->getUserDateTotalArray( $date_epoch, $date_epoch );
		//print_r($udt_arr);
		//Total Time
		$this->assertEquals( 5, $udt_arr[$date_epoch][0]['object_type_id'] );                                  //5=System Total
		$this->assertEquals( $udt_arr[$date_epoch][0]['pay_code_id'], TTUUID::getZeroID() );
		$this->assertEquals( $udt_arr[$date_epoch][0]['total_time'], ( 8 * 3600 ) );
		//Regular Time
		$this->assertEquals( 20, $udt_arr[$date_epoch][1]['object_type_id'] );                                 //Regular Time
		$this->assertEquals( $udt_arr[$date_epoch][1]['pay_code_id'], $this->policy_ids['pay_code'][100] );    //Regular Time
		$this->assertEquals( $udt_arr[$date_epoch][1]['total_time'], ( 8 * 3600 ) );
		//Make sure no other hours
		$this->assertCount( 2, $udt_arr[$date_epoch] );


		//
		//Check holiday time
		//
		$udt_arr = $this->getUserDateTotalArray( $holiday_epoch, $holiday_epoch );
		//Total Time
		$this->assertEquals( 5, $udt_arr[$holiday_epoch][0]['object_type_id'] );                               //5=System Total
		$this->assertEquals( $udt_arr[$holiday_epoch][0]['pay_code_id'], TTUUID::getZeroID() );
		$this->assertEquals( $udt_arr[$holiday_epoch][0]['total_time'], ( 8 * 3600 ) );
		//Holiday Time
		$this->assertEquals( 25, $udt_arr[$holiday_epoch][1]['object_type_id'] );                              //Holiday Time
		$this->assertEquals( $udt_arr[$holiday_epoch][1]['pay_code_id'], $this->policy_ids['pay_code'][900] ); //Holiday Time
		$this->assertEquals( $udt_arr[$holiday_epoch][1]['total_time'], ( 8 * 3600 ) );

		return true;
	}

	/**
	 * @group OvertimePolicy_testHolidayAbsenceScheduledDayBeforeAndAfterB2
	 */
	function testHolidayAbsenceScheduledDayBeforeAndAfterB2() {
		global $dd;

		$date_epoch = TTDate::getMiddleDayEpoch( TTDate::getBeginWeekEpoch( time() ) );

		$holiday_epoch = TTDate::incrementDate( TTDate::getMiddleDayEpoch( $date_epoch ), -14, 'day' );

		//Holiday
		$policy_ids['holiday'][] = $this->createHolidayPolicy( $this->company_id, 200 );                       //Scheduled Days before and after
		$this->createHoliday( $this->company_id, 10, $holiday_epoch, $policy_ids['holiday'][0] );              //Thu of previous week

		//Create Policy Group
		$dd->createPolicyGroup( $this->company_id,
								null, //Meal
								null, //Exception
								$policy_ids['holiday'],
								null, //OT
								null, //Premium
								null, //Round
								[ $this->user_id ], //Users
								null, //Break
								null, //Accrual
								null, //Expense
								null, //Absence
								[ $this->policy_ids['regular'][12] ] //Regular
		);


		//
		//Day of Week: 1
		//
		$date_epoch = TTDate::incrementDate( TTDate::getMiddleDayEpoch( TTDate::getBeginWeekEpoch( time() ) ), -28, 'day' );
		$date_stamp = TTDate::getDate( 'DATE', $date_epoch );

		$this->createSchedule( $this->user_id, $date_epoch, [
				'start_time' => ' 8:00AM',
				'end_time'   => '4:00PM',
		] );

		$dd->createPunchPair( $this->user_id,
							  strtotime( $date_stamp . ' 8:00AM' ),
							  strtotime( $date_stamp . ' 4:00PM' ),
							  [
									  'in_type_id'    => 10,
									  'out_type_id'   => 10,
									  'branch_id'     => 0,
									  'department_id' => 0,
									  'job_id'        => 0,
									  'job_item_id'   => 0,
									  'punch_tag_id'  => []
							  ],
							  true
		);

		$udt_arr = $this->getUserDateTotalArray( $date_epoch, $date_epoch );
		//print_r($udt_arr);
		//Total Time
		$this->assertEquals( 5, $udt_arr[$date_epoch][0]['object_type_id'] );                                  //5=System Total
		$this->assertEquals( $udt_arr[$date_epoch][0]['pay_code_id'], TTUUID::getZeroID() );
		$this->assertEquals( $udt_arr[$date_epoch][0]['total_time'], ( 8 * 3600 ) );
		//Regular Time
		$this->assertEquals( 20, $udt_arr[$date_epoch][1]['object_type_id'] );                                 //Regular Time
		$this->assertEquals( $udt_arr[$date_epoch][1]['pay_code_id'], $this->policy_ids['pay_code'][100] );    //Regular Time
		$this->assertEquals( $udt_arr[$date_epoch][1]['total_time'], ( 8 * 3600 ) );
		//Make sure no other hours
		$this->assertCount( 2, $udt_arr[$date_epoch] );


		//
		//Day of Week: 2
		//
		$date_epoch = TTDate::incrementDate( TTDate::getMiddleDayEpoch( TTDate::getBeginWeekEpoch( time() ) ), 0, 'day' );
		$date_stamp = TTDate::getDate( 'DATE', $date_epoch );

		$this->createSchedule( $this->user_id, $date_epoch, [
				'start_time' => ' 8:00AM',
				'end_time'   => '4:00PM',
		] );

		$dd->createPunchPair( $this->user_id,
							  strtotime( $date_stamp . ' 8:00AM' ),
							  strtotime( $date_stamp . ' 4:00PM' ),
							  [
									  'in_type_id'    => 10,
									  'out_type_id'   => 10,
									  'branch_id'     => 0,
									  'department_id' => 0,
									  'job_id'        => 0,
									  'job_item_id'   => 0,
									  'punch_tag_id'  => []
							  ],
							  true
		);

		$udt_arr = $this->getUserDateTotalArray( $date_epoch, $date_epoch );
		//print_r($udt_arr);
		//Total Time
		$this->assertEquals( 5, $udt_arr[$date_epoch][0]['object_type_id'] );                                  //5=System Total
		$this->assertEquals( $udt_arr[$date_epoch][0]['pay_code_id'], TTUUID::getZeroID() );
		$this->assertEquals( $udt_arr[$date_epoch][0]['total_time'], ( 8 * 3600 ) );
		//Regular Time
		$this->assertEquals( 20, $udt_arr[$date_epoch][1]['object_type_id'] );                                 //Regular Time
		$this->assertEquals( $udt_arr[$date_epoch][1]['pay_code_id'], $this->policy_ids['pay_code'][100] );    //Regular Time
		$this->assertEquals( $udt_arr[$date_epoch][1]['total_time'], ( 8 * 3600 ) );
		//Make sure no other hours
		$this->assertCount( 2, $udt_arr[$date_epoch] );


		//
		//Check holiday time
		//
		$udt_arr = $this->getUserDateTotalArray( $holiday_epoch, $holiday_epoch );
		//Total Time
		$this->assertEquals( 5, $udt_arr[$holiday_epoch][0]['object_type_id'] );                               //5=System Total
		$this->assertEquals( $udt_arr[$holiday_epoch][0]['pay_code_id'], TTUUID::getZeroID() );
		$this->assertEquals( $udt_arr[$holiday_epoch][0]['total_time'], ( 8 * 3600 ) );
		//Holiday Time
		$this->assertEquals( 25, $udt_arr[$holiday_epoch][1]['object_type_id'] );                              //Holiday Time
		$this->assertEquals( $udt_arr[$holiday_epoch][1]['pay_code_id'], $this->policy_ids['pay_code'][900] ); //Holiday Time
		$this->assertEquals( $udt_arr[$holiday_epoch][1]['total_time'], ( 8 * 3600 ) );

		return true;
	}

	/**
	 * @group OvertimePolicy_testHolidayAbsenceScheduledDayBeforeAndAfterC1
	 */
	function testHolidayAbsenceScheduledDayBeforeAndAfterC1() {
		global $dd;

		$date_epoch = TTDate::getMiddleDayEpoch( TTDate::getBeginWeekEpoch( time() ) );

		$holiday_epoch = TTDate::incrementDate( TTDate::getMiddleDayEpoch( $date_epoch ), -3, 'day' );
		$holiday_epoch2 = TTDate::incrementDate( TTDate::getMiddleDayEpoch( $date_epoch ), -0, 'day' );

		//Holiday
		$policy_ids['holiday'][] = $this->createHolidayPolicy( $this->company_id, 200 );                        //Scheduled Days before and after

		//Two holidays, to simiulate one on Friday and one on Monday.
		$this->createHoliday( $this->company_id, 10, $holiday_epoch, $policy_ids['holiday'][0] );               //Thu of previous week
		$this->createHoliday( $this->company_id, 20, $holiday_epoch2, $policy_ids['holiday'][0] );              //Sun of current week

		//Create Policy Group
		$dd->createPolicyGroup( $this->company_id,
								null, //Meal
								null, //Exception
								$policy_ids['holiday'],
								null, //OT
								null, //Premium
								null, //Round
								[ $this->user_id ], //Users
								null, //Break
								null, //Accrual
								null, //Expense
								null, //Absence
								[ $this->policy_ids['regular'][12] ] //Regular
		);


		//
		//Day of Week: 1
		//
		$date_epoch = TTDate::incrementDate( TTDate::getMiddleDayEpoch( TTDate::getBeginWeekEpoch( time() ) ), -4, 'day' );
		$date_stamp = TTDate::getDate( 'DATE', $date_epoch );

		$this->createSchedule( $this->user_id, $date_epoch, [
				'start_time' => ' 8:00AM',
				'end_time'   => '4:00PM',
		] );

		$dd->createPunchPair( $this->user_id,
							  strtotime( $date_stamp . ' 8:00AM' ),
							  strtotime( $date_stamp . ' 4:00PM' ),
							  [
									  'in_type_id'    => 10,
									  'out_type_id'   => 10,
									  'branch_id'     => 0,
									  'department_id' => 0,
									  'job_id'        => 0,
									  'job_item_id'   => 0,
									  'punch_tag_id'  => []
							  ],
							  true
		);

		$udt_arr = $this->getUserDateTotalArray( $date_epoch, $date_epoch );
		//print_r($udt_arr);
		//Total Time
		$this->assertEquals( 5, $udt_arr[$date_epoch][0]['object_type_id'] );                                   //5=System Total
		$this->assertEquals( $udt_arr[$date_epoch][0]['pay_code_id'], TTUUID::getZeroID() );
		$this->assertEquals( $udt_arr[$date_epoch][0]['total_time'], ( 8 * 3600 ) );
		//Regular Time
		$this->assertEquals( 20, $udt_arr[$date_epoch][1]['object_type_id'] );                                  //Regular Time
		$this->assertEquals( $udt_arr[$date_epoch][1]['pay_code_id'], $this->policy_ids['pay_code'][100] );     //Regular Time
		$this->assertEquals( $udt_arr[$date_epoch][1]['total_time'], ( 8 * 3600 ) );
		//Make sure no other hours
		$this->assertCount( 2, $udt_arr[$date_epoch] );


		//
		//Day of Week: 2
		//
		$date_epoch = TTDate::incrementDate( TTDate::getMiddleDayEpoch( TTDate::getBeginWeekEpoch( time() ) ), 1, 'day' );
		$date_stamp = TTDate::getDate( 'DATE', $date_epoch );

		$this->createSchedule( $this->user_id, $date_epoch, [
				'start_time' => ' 8:00AM',
				'end_time'   => '4:00PM',
		] );

		$dd->createPunchPair( $this->user_id,
							  strtotime( $date_stamp . ' 8:00AM' ),
							  strtotime( $date_stamp . ' 4:00PM' ),
							  [
									  'in_type_id'    => 10,
									  'out_type_id'   => 10,
									  'branch_id'     => 0,
									  'department_id' => 0,
									  'job_id'        => 0,
									  'job_item_id'   => 0,
									  'punch_tag_id'  => []
							  ],
							  true
		);

		$udt_arr = $this->getUserDateTotalArray( $date_epoch, $date_epoch );
		//print_r($udt_arr);
		//Total Time
		$this->assertEquals( 5, $udt_arr[$date_epoch][0]['object_type_id'] );                                   //5=System Total
		$this->assertEquals( $udt_arr[$date_epoch][0]['pay_code_id'], TTUUID::getZeroID() );
		$this->assertEquals( $udt_arr[$date_epoch][0]['total_time'], ( 8 * 3600 ) );
		//Regular Time
		$this->assertEquals( 20, $udt_arr[$date_epoch][1]['object_type_id'] );                                  //Regular Time
		$this->assertEquals( $udt_arr[$date_epoch][1]['pay_code_id'], $this->policy_ids['pay_code'][100] );     //Regular Time
		$this->assertEquals( $udt_arr[$date_epoch][1]['total_time'], ( 8 * 3600 ) );
		//Make sure no other hours
		$this->assertCount( 2, $udt_arr[$date_epoch] );


		//
		//Check holiday1 time
		//
		$udt_arr = $this->getUserDateTotalArray( $holiday_epoch, $holiday_epoch );
		//Total Time
		$this->assertEquals( 5, $udt_arr[$holiday_epoch][0]['object_type_id'] );                                //5=System Total
		$this->assertEquals( $udt_arr[$holiday_epoch][0]['pay_code_id'], TTUUID::getZeroID() );
		$this->assertEquals( $udt_arr[$holiday_epoch][0]['total_time'], ( 8 * 3600 ) );
		//Holiday Time
		$this->assertEquals( 25, $udt_arr[$holiday_epoch][1]['object_type_id'] );                               //Holiday Time
		$this->assertEquals( $udt_arr[$holiday_epoch][1]['pay_code_id'], $this->policy_ids['pay_code'][900] );  //Holiday Time
		$this->assertEquals( $udt_arr[$holiday_epoch][1]['total_time'], ( 8 * 3600 ) );

		//
		//Check holiday2 time
		//
		$udt_arr = $this->getUserDateTotalArray( $holiday_epoch2, $holiday_epoch2 );
		//Total Time
		$this->assertEquals( 5, $udt_arr[$holiday_epoch2][0]['object_type_id'] );                               //5=System Total
		$this->assertEquals( $udt_arr[$holiday_epoch2][0]['pay_code_id'], TTUUID::getZeroID() );
		$this->assertEquals( $udt_arr[$holiday_epoch2][0]['total_time'], ( 8 * 3600 ) );
		//Holiday Time
		$this->assertEquals( 25, $udt_arr[$holiday_epoch2][1]['object_type_id'] );                              //Holiday Time
		$this->assertEquals( $udt_arr[$holiday_epoch2][1]['pay_code_id'], $this->policy_ids['pay_code'][900] ); //Holiday Time
		$this->assertEquals( $udt_arr[$holiday_epoch2][1]['total_time'], ( 8 * 3600 ) );

		return true;
	}

	/**
	 * @group OvertimePolicy_testHolidayAbsenceHolidayWeekDayBeforeAndAfterA
	 */
	function testHolidayAbsenceHolidayWeekDayBeforeAndAfterA() {
		global $dd;

		$date_epoch = TTDate::getMiddleDayEpoch( TTDate::getBeginWeekEpoch( time() ) );

		$holiday_epoch = TTDate::incrementDate( TTDate::getMiddleDayEpoch( $date_epoch ), -3, 'day' );

		//Holiday
		$policy_ids['holiday'][] = $this->createHolidayPolicy( $this->company_id, 300 );                       //Scheduled Days before and after
		$this->createHoliday( $this->company_id, 10, $holiday_epoch, $policy_ids['holiday'][0] );              //Thu of previous week

		//Create Policy Group
		$dd->createPolicyGroup( $this->company_id,
								null, //Meal
								null, //Exception
								$policy_ids['holiday'],
								null, //OT
								null, //Premium
								null, //Round
								[ $this->user_id ], //Users
								null, //Break
								null, //Accrual
								null, //Expense
								null, //Absence
								[ $this->policy_ids['regular'][12] ] //Regular
		);


		//
		//Day of Week: 1
		//
		$date_epoch = TTDate::incrementDate( TTDate::getMiddleDayEpoch( TTDate::getBeginWeekEpoch( time() ) ), -10, 'day' );
		$date_stamp = TTDate::getDate( 'DATE', $date_epoch );

		$dd->createPunchPair( $this->user_id,
							  strtotime( $date_stamp . ' 8:00AM' ),
							  strtotime( $date_stamp . ' 4:00PM' ),
							  [
									  'in_type_id'    => 10,
									  'out_type_id'   => 10,
									  'branch_id'     => 0,
									  'department_id' => 0,
									  'job_id'        => 0,
									  'job_item_id'   => 0,
									  'punch_tag_id'  => []
							  ],
							  true
		);

		$udt_arr = $this->getUserDateTotalArray( $date_epoch, $date_epoch );
		//print_r($udt_arr);
		//Total Time
		$this->assertEquals( 5, $udt_arr[$date_epoch][0]['object_type_id'] );                                  //5=System Total
		$this->assertEquals( $udt_arr[$date_epoch][0]['pay_code_id'], TTUUID::getZeroID() );
		$this->assertEquals( $udt_arr[$date_epoch][0]['total_time'], ( 8 * 3600 ) );
		//Regular Time
		$this->assertEquals( 20, $udt_arr[$date_epoch][1]['object_type_id'] );                                 //Regular Time
		$this->assertEquals( $udt_arr[$date_epoch][1]['pay_code_id'], $this->policy_ids['pay_code'][100] );    //Regular Time
		$this->assertEquals( $udt_arr[$date_epoch][1]['total_time'], ( 8 * 3600 ) );
		//Make sure no other hours
		$this->assertCount( 2, $udt_arr[$date_epoch] );


		//
		//Day of Week: 2
		//
		$date_epoch = TTDate::incrementDate( TTDate::getMiddleDayEpoch( TTDate::getBeginWeekEpoch( time() ) ), 4, 'day' );
		$date_stamp = TTDate::getDate( 'DATE', $date_epoch );

		$dd->createPunchPair( $this->user_id,
							  strtotime( $date_stamp . ' 8:00AM' ),
							  strtotime( $date_stamp . ' 4:00PM' ),
							  [
									  'in_type_id'    => 10,
									  'out_type_id'   => 10,
									  'branch_id'     => 0,
									  'department_id' => 0,
									  'job_id'        => 0,
									  'job_item_id'   => 0,
									  'punch_tag_id'  => []
							  ],
							  true
		);

		$udt_arr = $this->getUserDateTotalArray( $date_epoch, $date_epoch );
		//print_r($udt_arr);
		//Total Time
		$this->assertEquals( 5, $udt_arr[$date_epoch][0]['object_type_id'] );                                  //5=System Total
		$this->assertEquals( $udt_arr[$date_epoch][0]['pay_code_id'], TTUUID::getZeroID() );
		$this->assertEquals( $udt_arr[$date_epoch][0]['total_time'], ( 8 * 3600 ) );
		//Regular Time
		$this->assertEquals( 20, $udt_arr[$date_epoch][1]['object_type_id'] );                                 //Regular Time
		$this->assertEquals( $udt_arr[$date_epoch][1]['pay_code_id'], $this->policy_ids['pay_code'][100] );    //Regular Time
		$this->assertEquals( $udt_arr[$date_epoch][1]['total_time'], ( 8 * 3600 ) );
		//Make sure no other hours
		$this->assertCount( 2, $udt_arr[$date_epoch] );


		//
		//Check holiday time
		//
		$udt_arr = $this->getUserDateTotalArray( $holiday_epoch, $holiday_epoch );
		//Total Time
		$this->assertEquals( 5, $udt_arr[$holiday_epoch][0]['object_type_id'] );                               //5=System Total
		$this->assertEquals( $udt_arr[$holiday_epoch][0]['pay_code_id'], TTUUID::getZeroID() );
		$this->assertEquals( $udt_arr[$holiday_epoch][0]['total_time'], ( 8 * 3600 ) );
		//Holiday Time
		$this->assertEquals( 25, $udt_arr[$holiday_epoch][1]['object_type_id'] );                              //Holiday Time
		$this->assertEquals( $udt_arr[$holiday_epoch][1]['pay_code_id'], $this->policy_ids['pay_code'][900] ); //Holiday Time
		$this->assertEquals( $udt_arr[$holiday_epoch][1]['total_time'], ( 8 * 3600 ) );

		return true;
	}

	/**
	 * @group OvertimePolicy_testHolidayShiftOnHolidayA1
	 */
	function testHolidayShiftOnHolidayA1() {
		global $dd;

		$date_epoch = TTDate::getMiddleDayEpoch( TTDate::getBeginWeekEpoch( time() ) );

		$holiday_epoch = TTDate::incrementDate( TTDate::getMiddleDayEpoch( $date_epoch ), -3, 'day' );

		//Holiday
		$policy_ids['holiday'][] = $this->createHolidayPolicy( $this->company_id, 400 );                    //Must Work On Holiday
		$this->createHoliday( $this->company_id, 10, $holiday_epoch, $policy_ids['holiday'][0] );           //Thu of previous week

		//Create Policy Group
		$dd->createPolicyGroup( $this->company_id,
								null, //Meal
								null, //Exception
								$policy_ids['holiday'],
								null, //OT
								null, //Premium
								null, //Round
								[ $this->user_id ], //Users
								null, //Break
								null, //Accrual
								null, //Expense
								null, //Absence
								[ $this->policy_ids['regular'][12] ] //Regular
		);


		//
		//Day of Week: 1
		//
		//$date_epoch = TTDate::incrementDate( TTDate::getMiddleDayEpoch( TTDate::getBeginWeekEpoch( time() ) ), -10, 'day' );
		$date_epoch = $holiday_epoch;
		$date_stamp = TTDate::getDate( 'DATE', $date_epoch );

		$dd->createPunchPair( $this->user_id,
							  strtotime( $date_stamp . ' 8:00AM' ),
							  strtotime( $date_stamp . ' 4:00PM' ),
							  [
									  'in_type_id'    => 10,
									  'out_type_id'   => 10,
									  'branch_id'     => 0,
									  'department_id' => 0,
									  'job_id'        => 0,
									  'job_item_id'   => 0,
									  'punch_tag_id'  => []
							  ],
							  true
		);

		$udt_arr = $this->getUserDateTotalArray( $date_epoch, $date_epoch );
		//print_r($udt_arr);
		//Total Time
		$this->assertEquals( 5, $udt_arr[$date_epoch][0]['object_type_id'] );                               //5=System Total
		$this->assertEquals( $udt_arr[$date_epoch][0]['pay_code_id'], TTUUID::getZeroID() );
		$this->assertEquals( $udt_arr[$date_epoch][0]['total_time'], ( 16 * 3600 ) );
		//Regular Time
		$this->assertEquals( 20, $udt_arr[$date_epoch][1]['object_type_id'] );                              //Regular Time
		$this->assertEquals( $udt_arr[$date_epoch][1]['pay_code_id'], $this->policy_ids['pay_code'][100] ); //Regular Time
		$this->assertEquals( $udt_arr[$date_epoch][1]['total_time'], ( 8 * 3600 ) );
		//Holiday Time
		$this->assertEquals( 25, $udt_arr[$date_epoch][2]['object_type_id'] );                              //Holiday Time
		$this->assertEquals( $udt_arr[$date_epoch][2]['pay_code_id'], $this->policy_ids['pay_code'][900] ); //Regular Time
		$this->assertEquals( $udt_arr[$date_epoch][2]['total_time'], ( 8 * 3600 ) );

		//Make sure no other hours
		$this->assertCount( 3, $udt_arr[$date_epoch] );

		return true;
	}

	/**
	 * @group OvertimePolicy_testHolidayShiftOnHolidayA2
	 */
	function testHolidayShiftOnHolidayA2() {
		global $dd;

		$date_epoch = TTDate::getMiddleDayEpoch( TTDate::getBeginWeekEpoch( time() ) );

		$holiday_epoch = TTDate::incrementDate( TTDate::getMiddleDayEpoch( $date_epoch ), -3, 'day' );

		//Holiday
		$policy_ids['holiday'][] = $this->createHolidayPolicy( $this->company_id, 400 ); //Must Work On Holiday
		$this->createHoliday( $this->company_id, 10, $holiday_epoch, $policy_ids['holiday'][0] ); //Thu of previous week

		//Create Policy Group
		$dd->createPolicyGroup( $this->company_id,
								null, //Meal
								null, //Exception
								$policy_ids['holiday'],
								null, //OT
								null, //Premium
								null, //Round
								[ $this->user_id ], //Users
								null, //Break
								null, //Accrual
								null, //Expense
								null, //Absence
								[ $this->policy_ids['regular'][12] ] //Regular
		);

		//
		//Check holiday time
		//
		$udt_arr = $this->getUserDateTotalArray( $holiday_epoch, $holiday_epoch );

		//Make sure no other hours
		$this->assertCount( 0, $udt_arr );

		return true;
	}

	/**
	 * @group OvertimePolicy_testHolidayShiftOnHolidayB1
	 */
	function testHolidayShiftOnHolidayB1() {
		global $dd;

		$date_epoch = TTDate::getMiddleDayEpoch( TTDate::getBeginWeekEpoch( time() ) );

		$holiday_epoch = TTDate::incrementDate( TTDate::getMiddleDayEpoch( $date_epoch ), -3, 'day' );

		//Holiday
		$policy_ids['holiday'][] = $this->createHolidayPolicy( $this->company_id, 420 );                    //Must Never Work
		$this->createHoliday( $this->company_id, 10, $holiday_epoch, $policy_ids['holiday'][0] );           //Thu of previous week

		//Create Policy Group
		$dd->createPolicyGroup( $this->company_id,
								null, //Meal
								null, //Exception
								$policy_ids['holiday'],
								null, //OT
								null, //Premium
								null, //Round
								[ $this->user_id ], //Users
								null, //Break
								null, //Accrual
								null, //Expense
								null, //Absence
								[ $this->policy_ids['regular'][12] ] //Regular
		);


		//
		//Day of Week: 1
		//
		//$date_epoch = TTDate::incrementDate( TTDate::getMiddleDayEpoch( TTDate::getBeginWeekEpoch( time() ) ), -10, 'day' );
		$date_epoch = $holiday_epoch;
		$date_stamp = TTDate::getDate( 'DATE', $date_epoch );

		$dd->createPunchPair( $this->user_id,
							  strtotime( $date_stamp . ' 8:00AM' ),
							  strtotime( $date_stamp . ' 4:00PM' ),
							  [
									  'in_type_id'    => 10,
									  'out_type_id'   => 10,
									  'branch_id'     => 0,
									  'department_id' => 0,
									  'job_id'        => 0,
									  'job_item_id'   => 0,
									  'punch_tag_id'  => []
							  ],
							  true
		);

		$udt_arr = $this->getUserDateTotalArray( $date_epoch, $date_epoch );
		//print_r($udt_arr);
		//Total Time
		$this->assertEquals( 5, $udt_arr[$date_epoch][0]['object_type_id'] );                               //5=System Total
		$this->assertEquals( $udt_arr[$date_epoch][0]['pay_code_id'], TTUUID::getZeroID() );
		$this->assertEquals( $udt_arr[$date_epoch][0]['total_time'], ( 8 * 3600 ) );
		//Regular Time
		$this->assertEquals( 20, $udt_arr[$date_epoch][1]['object_type_id'] );                              //Regular Time
		$this->assertEquals( $udt_arr[$date_epoch][1]['pay_code_id'], $this->policy_ids['pay_code'][100] ); //Regular Time
		$this->assertEquals( $udt_arr[$date_epoch][1]['total_time'], ( 8 * 3600 ) );

		//Make sure no other hours
		$this->assertCount( 2, $udt_arr[$date_epoch] );

		return true;
	}

	/**
	 * @group OvertimePolicy_testHolidayShiftOnHolidayB2
	 */
	function testHolidayShiftOnHolidayB2() {
		global $dd;

		$date_epoch = TTDate::getMiddleDayEpoch( TTDate::getBeginWeekEpoch( time() ) );

		$holiday_epoch = TTDate::incrementDate( TTDate::getMiddleDayEpoch( $date_epoch ), -3, 'day' );

		//Holiday
		$policy_ids['holiday'][] = $this->createHolidayPolicy( $this->company_id, 420 );                    //Must Never Work
		$this->createHoliday( $this->company_id, 10, $holiday_epoch, $policy_ids['holiday'][0] );           //Thu of previous week

		//Create Policy Group
		$dd->createPolicyGroup( $this->company_id,
								null, //Meal
								null, //Exception
								$policy_ids['holiday'],
								null, //OT
								null, //Premium
								null, //Round
								[ $this->user_id ], //Users
								null, //Break
								null, //Accrual
								null, //Expense
								null, //Absence
								[ $this->policy_ids['regular'][12] ] //Regular
		);


		$date_epoch = $holiday_epoch;


		//
		//Recalculate timesheet and recheck all start/end timestamps now.
		//
		$ulf = TTNew( 'UserListFactory' ); /** @var UserListFactory $ulf */
		$ulf->getById( $this->user_id );
		if ( $ulf->getRecordCount() > 0 ) {
			UserDateTotalFactory::reCalculateDay( $ulf->getCurrent(), TTDate::getDateArray( TTDate::getBeginWeekEpoch( $date_epoch ), TTDate::getEndWeekEpoch( $date_epoch ) ) );
		} else {
			$this->assertTrue( false );
		}

		$udt_arr = $this->getUserDateTotalArray( $date_epoch, $date_epoch );
		//print_r($udt_arr);
		//Total Time
		$this->assertEquals( 5, $udt_arr[$date_epoch][0]['object_type_id'] );                               //5=System Total
		$this->assertEquals( $udt_arr[$date_epoch][0]['pay_code_id'], TTUUID::getZeroID() );
		$this->assertEquals( $udt_arr[$date_epoch][0]['total_time'], ( 8 * 3600 ) );
		//Holiday Time
		$this->assertEquals( 25, $udt_arr[$date_epoch][1]['object_type_id'] );                              //Holiday Time
		$this->assertEquals( $udt_arr[$date_epoch][1]['pay_code_id'], $this->policy_ids['pay_code'][900] ); //Regular Time
		$this->assertEquals( $udt_arr[$date_epoch][1]['total_time'], ( 8 * 3600 ) );

		//Make sure no other hours
		$this->assertCount( 2, $udt_arr[$date_epoch] );

		return true;
	}

	/**
	 * @group OvertimePolicy_testHolidayShiftOnHolidayC1
	 */
	function testHolidayShiftOnHolidayC1() {
		global $dd;

		$date_epoch = TTDate::getMiddleDayEpoch( TTDate::getBeginWeekEpoch( time() ) );

		$holiday_epoch = TTDate::incrementDate( TTDate::getMiddleDayEpoch( $date_epoch ), -3, 'day' );

		//Holiday
		$policy_ids['holiday'][] = $this->createHolidayPolicy( $this->company_id, 430 );                    //Must Work Only If Scheduled
		$this->createHoliday( $this->company_id, 10, $holiday_epoch, $policy_ids['holiday'][0] );           //Thu of previous week

		//Create Policy Group
		$dd->createPolicyGroup( $this->company_id,
								null, //Meal
								null, //Exception
								$policy_ids['holiday'],
								null, //OT
								null, //Premium
								null, //Round
								[ $this->user_id ], //Users
								null, //Break
								null, //Accrual
								null, //Expense
								null, //Absence
								[ $this->policy_ids['regular'][12] ] //Regular
		);


		$date_epoch = $holiday_epoch;


		//
		//Recalculate timesheet and recheck all start/end timestamps now.
		//
		$ulf = TTNew( 'UserListFactory' ); /** @var UserListFactory $ulf */
		$ulf->getById( $this->user_id );
		if ( $ulf->getRecordCount() > 0 ) {
			UserDateTotalFactory::reCalculateDay( $ulf->getCurrent(), TTDate::getDateArray( TTDate::getBeginWeekEpoch( $date_epoch ), TTDate::getEndWeekEpoch( $date_epoch ) ) );
		} else {
			$this->assertTrue( false );
		}

		$udt_arr = $this->getUserDateTotalArray( $date_epoch, $date_epoch );
		//print_r($udt_arr);
		//Total Time
		$this->assertEquals( 5, $udt_arr[$date_epoch][0]['object_type_id'] );                               //5=System Total
		$this->assertEquals( $udt_arr[$date_epoch][0]['pay_code_id'], TTUUID::getZeroID() );
		$this->assertEquals( $udt_arr[$date_epoch][0]['total_time'], ( 8 * 3600 ) );
		//Holiday Time
		$this->assertEquals( 25, $udt_arr[$date_epoch][1]['object_type_id'] );                              //Holiday Time
		$this->assertEquals( $udt_arr[$date_epoch][1]['pay_code_id'], $this->policy_ids['pay_code'][900] ); //Regular Time
		$this->assertEquals( $udt_arr[$date_epoch][1]['total_time'], ( 8 * 3600 ) );

		//Make sure no other hours
		$this->assertCount( 2, $udt_arr[$date_epoch] );

		return true;
	}

	/**
	 * @group OvertimePolicy_testHolidayShiftOnHolidayC2
	 */
	function testHolidayShiftOnHolidayC2() {
		global $dd;

		$date_epoch = TTDate::getMiddleDayEpoch( TTDate::getBeginWeekEpoch( time() ) );

		$holiday_epoch = TTDate::incrementDate( TTDate::getMiddleDayEpoch( $date_epoch ), -3, 'day' );

		//Holiday
		$policy_ids['holiday'][] = $this->createHolidayPolicy( $this->company_id, 430 );                    //Must Work Only If Scheduled
		$this->createHoliday( $this->company_id, 10, $holiday_epoch, $policy_ids['holiday'][0] );           //Thu of previous week

		//Create Policy Group
		$dd->createPolicyGroup( $this->company_id,
								null, //Meal
								null, //Exception
								$policy_ids['holiday'],
								null, //OT
								null, //Premium
								null, //Round
								[ $this->user_id ], //Users
								null, //Break
								null, //Accrual
								null, //Expense
								null, //Absence
								[ $this->policy_ids['regular'][12] ] //Regular
		);


		//
		//Day of Week: 1
		//
		//$date_epoch = TTDate::incrementDate( TTDate::getMiddleDayEpoch( TTDate::getBeginWeekEpoch( time() ) ), -10, 'day' );
		$date_epoch = $holiday_epoch;
		$date_stamp = TTDate::getDate( 'DATE', $date_epoch );

		$dd->createPunchPair( $this->user_id,
							  strtotime( $date_stamp . ' 8:00AM' ),
							  strtotime( $date_stamp . ' 4:00PM' ),
							  [
									  'in_type_id'    => 10,
									  'out_type_id'   => 10,
									  'branch_id'     => 0,
									  'department_id' => 0,
									  'job_id'        => 0,
									  'job_item_id'   => 0,
									  'punch_tag_id'  => []
							  ],
							  true
		);

		$udt_arr = $this->getUserDateTotalArray( $date_epoch, $date_epoch );
		//print_r($udt_arr);
		//Total Time
		$this->assertEquals( 5, $udt_arr[$date_epoch][0]['object_type_id'] );                               //5=System Total
		$this->assertEquals( $udt_arr[$date_epoch][0]['pay_code_id'], TTUUID::getZeroID() );
		$this->assertEquals( $udt_arr[$date_epoch][0]['total_time'], ( 16 * 3600 ) );
		//Regular Time
		$this->assertEquals( 20, $udt_arr[$date_epoch][1]['object_type_id'] );                              //Regular Time
		$this->assertEquals( $udt_arr[$date_epoch][1]['pay_code_id'], $this->policy_ids['pay_code'][100] ); //Regular Time
		$this->assertEquals( $udt_arr[$date_epoch][1]['total_time'], ( 8 * 3600 ) );
		//Holiday Time
		$this->assertEquals( 25, $udt_arr[$date_epoch][2]['object_type_id'] );                              //Holiday Time
		$this->assertEquals( $udt_arr[$date_epoch][2]['pay_code_id'], $this->policy_ids['pay_code'][900] ); //Regular Time
		$this->assertEquals( $udt_arr[$date_epoch][2]['total_time'], ( 8 * 3600 ) );

		//Make sure no other hours
		$this->assertCount( 3, $udt_arr[$date_epoch] );

		return true;
	}

	/**
	 * @group OvertimePolicy_testHolidayShiftOnHolidayC3
	 */
	function testHolidayShiftOnHolidayC3() {
		global $dd;

		$date_epoch = TTDate::getMiddleDayEpoch( TTDate::getBeginWeekEpoch( time() ) );

		$holiday_epoch = TTDate::incrementDate( TTDate::getMiddleDayEpoch( $date_epoch ), -3, 'day' );

		//Holiday
		$policy_ids['holiday'][] = $this->createHolidayPolicy( $this->company_id, 430 );                    //Must Work Only If Scheduled
		$this->createHoliday( $this->company_id, 10, $holiday_epoch, $policy_ids['holiday'][0] );           //Thu of previous week

		//Create Policy Group
		$dd->createPolicyGroup( $this->company_id,
								null, //Meal
								null, //Exception
								$policy_ids['holiday'],
								null, //OT
								null, //Premium
								null, //Round
								[ $this->user_id ], //Users
								null, //Break
								null, //Accrual
								null, //Expense
								null, //Absence
								[ $this->policy_ids['regular'][12] ] //Regular
		);

		//
		//Day of Week: 1
		//
		//$date_epoch = TTDate::incrementDate( TTDate::getMiddleDayEpoch( TTDate::getBeginWeekEpoch( time() ) ), -10, 'day' );
		$date_epoch = $holiday_epoch;
		$date_stamp = TTDate::getDate( 'DATE', $date_epoch );

		$this->createSchedule( $this->user_id, $date_epoch, [
				'status_id'  => 10, //Working
				//'absence_policy_id' => $this->policy_ids['absence'][10],
				//'schedule_policy_id' => $schedule_policy_id,
				'start_time' => '8:00AM',
				'end_time'   => '4:00PM',
		] );


		$dd->createPunchPair( $this->user_id,
							  strtotime( $date_stamp . ' 8:00AM' ),
							  strtotime( $date_stamp . ' 4:00PM' ),
							  [
									  'in_type_id'    => 10,
									  'out_type_id'   => 10,
									  'branch_id'     => 0,
									  'department_id' => 0,
									  'job_id'        => 0,
									  'job_item_id'   => 0,
									  'punch_tag_id'  => []
							  ],
							  true
		);

		$udt_arr = $this->getUserDateTotalArray( $date_epoch, $date_epoch );
		//print_r($udt_arr);
		//Total Time
		$this->assertEquals( 5, $udt_arr[$date_epoch][0]['object_type_id'] );                               //5=System Total
		$this->assertEquals( $udt_arr[$date_epoch][0]['pay_code_id'], TTUUID::getZeroID() );
		$this->assertEquals( $udt_arr[$date_epoch][0]['total_time'], ( 16 * 3600 ) );
		//Regular Time
		$this->assertEquals( 20, $udt_arr[$date_epoch][1]['object_type_id'] );                              //Regular Time
		$this->assertEquals( $udt_arr[$date_epoch][1]['pay_code_id'], $this->policy_ids['pay_code'][100] ); //Regular Time
		$this->assertEquals( $udt_arr[$date_epoch][1]['total_time'], ( 8 * 3600 ) );
		//Holiday Time
		$this->assertEquals( 25, $udt_arr[$date_epoch][2]['object_type_id'] );                              //Holiday Time
		$this->assertEquals( $udt_arr[$date_epoch][2]['pay_code_id'], $this->policy_ids['pay_code'][900] ); //Regular Time
		$this->assertEquals( $udt_arr[$date_epoch][2]['total_time'], ( 8 * 3600 ) );

		//Make sure no other hours
		$this->assertCount( 3, $udt_arr[$date_epoch] );


		return true;
	}

	/**
	 * @group OvertimePolicy_testHolidayShiftOnHolidayC4
	 */
	function testHolidayShiftOnHolidayC4() {
		global $dd;

		$date_epoch = TTDate::getMiddleDayEpoch( TTDate::getBeginWeekEpoch( time() ) );

		$holiday_epoch = TTDate::incrementDate( TTDate::getMiddleDayEpoch( $date_epoch ), -3, 'day' );

		//Holiday
		$policy_ids['holiday'][] = $this->createHolidayPolicy( $this->company_id, 430 ); //Must Work Only If Scheduled
		$this->createHoliday( $this->company_id, 10, $holiday_epoch, $policy_ids['holiday'][0] ); //Thu of previous week

		//Create Policy Group
		$dd->createPolicyGroup( $this->company_id,
								null, //Meal
								null, //Exception
								$policy_ids['holiday'],
								null, //OT
								null, //Premium
								null, //Round
								[ $this->user_id ], //Users
								null, //Break
								null, //Accrual
								null, //Expense
								null, //Absence
								[ $this->policy_ids['regular'][12] ] //Regular
		);

		//
		//Day of Week: 1
		//
		//$date_epoch = TTDate::incrementDate( TTDate::getMiddleDayEpoch( TTDate::getBeginWeekEpoch( time() ) ), -10, 'day' );
		$date_epoch = $holiday_epoch;

		$this->createSchedule( $this->user_id, $date_epoch, [
				'status_id'  => 10, //Working
				//'absence_policy_id' => $this->policy_ids['absence'][10],
				//'schedule_policy_id' => $schedule_policy_id,
				'start_time' => '8:00AM',
				'end_time'   => '4:00PM',
		] );

		$udt_arr = $this->getUserDateTotalArray( $date_epoch, $date_epoch );
		//print_r($udt_arr);

		//Make sure no other hours
		$this->assertCount( 0, $udt_arr );


		return true;
	}

	/**
	 * @group OvertimePolicy_testHolidayShiftOnHolidayD1
	 */
	function testHolidayShiftOnHolidayD1() {
		global $dd;

		$date_epoch = TTDate::getMiddleDayEpoch( TTDate::getBeginWeekEpoch( time() ) );

		$holiday_epoch = TTDate::incrementDate( TTDate::getMiddleDayEpoch( $date_epoch ), -3, 'day' );

		//Holiday
		$policy_ids['holiday'][] = $this->createHolidayPolicy( $this->company_id, 440 );                    //Must Not Work (Only if Scheduled Absent)
		$this->createHoliday( $this->company_id, 10, $holiday_epoch, $policy_ids['holiday'][0] );           //Thu of previous week

		//Create Policy Group
		$dd->createPolicyGroup( $this->company_id,
								null, //Meal
								null, //Exception
								$policy_ids['holiday'],
								null, //OT
								null, //Premium
								null, //Round
								[ $this->user_id ], //Users
								null, //Break
								null, //Accrual
								null, //Expense
								[ $this->policy_ids['absence'][10], $this->policy_ids['absence'][11] ], //Absence, //Absence
								[ $this->policy_ids['regular'][12] ] //Regular
		);

		//
		//Day of Week: 1
		//
		//$date_epoch = TTDate::incrementDate( TTDate::getMiddleDayEpoch( TTDate::getBeginWeekEpoch( time() ) ), -10, 'day' );
		$date_epoch = $holiday_epoch;

		$this->createSchedule( $this->user_id, $date_epoch, [
				'status_id'          => 20, //Absent
				'absence_policy_id'  => $this->policy_ids['absence'][10],
				'schedule_policy_id' => TTUUID::getZeroID(),
				'start_time'         => '8:00AM',
				'end_time'           => '4:00PM',
		] );

		$udt_arr = $this->getUserDateTotalArray( $date_epoch, $date_epoch );
		//print_r($udt_arr);
		//Total Time
		$this->assertEquals( 5, $udt_arr[$date_epoch][0]['object_type_id'] );                               //5=System Total
		$this->assertEquals( $udt_arr[$date_epoch][0]['pay_code_id'], TTUUID::getZeroID() );
		$this->assertEquals( $udt_arr[$date_epoch][0]['total_time'], ( 8 * 3600 ) );
		//Holiday Time
		$this->assertEquals( 25, $udt_arr[$date_epoch][1]['object_type_id'] );                              //Holiday Time
		$this->assertEquals( $udt_arr[$date_epoch][1]['pay_code_id'], $this->policy_ids['pay_code'][900] ); //Regular Time
		$this->assertEquals( $udt_arr[$date_epoch][1]['total_time'], ( 8 * 3600 ) );

		//Make sure no other hours
		$this->assertCount( 2, $udt_arr[$date_epoch] );

		return true;
	}

	/**
	 * @group OvertimePolicy_testHolidayShiftOnHolidayD2
	 */
	function testHolidayShiftOnHolidayD2() {
		global $dd;

		$date_epoch = TTDate::getMiddleDayEpoch( TTDate::getBeginWeekEpoch( time() ) );

		$holiday_epoch = TTDate::incrementDate( TTDate::getMiddleDayEpoch( $date_epoch ), -3, 'day' );

		//Holiday
		$policy_ids['holiday'][] = $this->createHolidayPolicy( $this->company_id, 440 );                    //Must Not Work (Only if Scheduled Absent)
		$this->createHoliday( $this->company_id, 10, $holiday_epoch, $policy_ids['holiday'][0] );           //Thu of previous week

		//Create Policy Group
		$dd->createPolicyGroup( $this->company_id,
								null, //Meal
								null, //Exception
								$policy_ids['holiday'],
								null, //OT
								null, //Premium
								null, //Round
								[ $this->user_id ], //Users
								null, //Break
								null, //Accrual
								null, //Expense
								[ $this->policy_ids['absence'][10], $this->policy_ids['absence'][11] ], //Absence, //Absence
								[ $this->policy_ids['regular'][12] ] //Regular
		);

		//
		//Day of Week: 1
		//
		//$date_epoch = TTDate::incrementDate( TTDate::getMiddleDayEpoch( TTDate::getBeginWeekEpoch( time() ) ), -10, 'day' );
		$date_epoch = $holiday_epoch;

		$this->createSchedule( $this->user_id, $date_epoch, [
				'status_id'          => 10, //Working
				//'absence_policy_id' => $this->policy_ids['absence'][10],
				'schedule_policy_id' => TTUUID::getZeroID(),
				'start_time'         => '8:00AM',
				'end_time'           => '4:00PM',
		] );

		$udt_arr = $this->getUserDateTotalArray( $date_epoch, $date_epoch );
		//print_r($udt_arr);
		//Total Time
		$this->assertEquals( 5, $udt_arr[$date_epoch][0]['object_type_id'] );                               //5=System Total
		$this->assertEquals( $udt_arr[$date_epoch][0]['pay_code_id'], TTUUID::getZeroID() );
		$this->assertEquals( $udt_arr[$date_epoch][0]['total_time'], ( 8 * 3600 ) );
		//Holiday Time
		$this->assertEquals( 25, $udt_arr[$date_epoch][1]['object_type_id'] );                              //Holiday Time
		$this->assertEquals( $udt_arr[$date_epoch][1]['pay_code_id'], $this->policy_ids['pay_code'][900] ); //Regular Time
		$this->assertEquals( $udt_arr[$date_epoch][1]['total_time'], ( 8 * 3600 ) );

		//Make sure no other hours
		$this->assertCount( 2, $udt_arr[$date_epoch] );

		return true;
	}

	/**
	 * @group OvertimePolicy_testHolidayShiftOnHolidayD3
	 */
	function testHolidayShiftOnHolidayD3() {
		global $dd;

		$date_epoch = TTDate::getMiddleDayEpoch( TTDate::getBeginWeekEpoch( time() ) );

		$holiday_epoch = TTDate::incrementDate( TTDate::getMiddleDayEpoch( $date_epoch ), -3, 'day' );

		//Holiday
		$policy_ids['holiday'][] = $this->createHolidayPolicy( $this->company_id, 440 );                    //Must Not Work (Only if Scheduled Absent)
		$this->createHoliday( $this->company_id, 10, $holiday_epoch, $policy_ids['holiday'][0] );           //Thu of previous week

		//Create Policy Group
		$dd->createPolicyGroup( $this->company_id,
								null, //Meal
								null, //Exception
								$policy_ids['holiday'],
								null, //OT
								null, //Premium
								null, //Round
								[ $this->user_id ], //Users
								null, //Break
								null, //Accrual
								null, //Expense
								[ $this->policy_ids['absence'][10], $this->policy_ids['absence'][11] ], //Absence, //Absence
								[ $this->policy_ids['regular'][12] ] //Regular
		);

		//
		//Day of Week: 1
		//
		//$date_epoch = TTDate::incrementDate( TTDate::getMiddleDayEpoch( TTDate::getBeginWeekEpoch( time() ) ), -10, 'day' );
		$date_epoch = $holiday_epoch;
		$date_stamp = TTDate::getDate( 'DATE', $date_epoch );

		$this->createSchedule( $this->user_id, $date_epoch, [
				'status_id'          => 20, //Absent
				'absence_policy_id'  => $this->policy_ids['absence'][10],
				'schedule_policy_id' => TTUUID::getZeroID(),
				'start_time'         => '8:00AM',
				'end_time'           => '4:00PM',
		] );

		$dd->createPunchPair( $this->user_id,
							  strtotime( $date_stamp . ' 8:00AM' ),
							  strtotime( $date_stamp . ' 4:00PM' ),
							  [
									  'in_type_id'    => 10,
									  'out_type_id'   => 10,
									  'branch_id'     => 0,
									  'department_id' => 0,
									  'job_id'        => 0,
									  'job_item_id'   => 0,
									  'punch_tag_id'  => []
							  ],
							  true
		);

		$udt_arr = $this->getUserDateTotalArray( $date_epoch, $date_epoch );
		//print_r($udt_arr);
		//Total Time
		$this->assertEquals( 5, $udt_arr[$date_epoch][0]['object_type_id'] );                               //5=System Total
		$this->assertEquals( $udt_arr[$date_epoch][0]['pay_code_id'], TTUUID::getZeroID() );
		$this->assertEquals( $udt_arr[$date_epoch][0]['total_time'], ( 8 * 3600 ) );
		//Regular Time
		$this->assertEquals( 20, $udt_arr[$date_epoch][1]['object_type_id'] );                              //Regular Time
		$this->assertEquals( $udt_arr[$date_epoch][1]['pay_code_id'], $this->policy_ids['pay_code'][100] ); //Regular Time
		$this->assertEquals( $udt_arr[$date_epoch][1]['total_time'], ( 8 * 3600 ) );

		//Make sure no other hours
		$this->assertCount( 2, $udt_arr[$date_epoch] );

		return true;
	}

	/**
	 * @group OvertimePolicy_testHolidayShiftOnHolidayE1
	 */
	function testHolidayShiftOnHolidayE1() {
		global $dd;

		$date_epoch = TTDate::getMiddleDayEpoch( TTDate::getBeginWeekEpoch( time() ) );

		$holiday_epoch = TTDate::incrementDate( TTDate::getMiddleDayEpoch( $date_epoch ), -3, 'day' );

		//Holiday
		$policy_ids['holiday'][] = $this->createHolidayPolicy( $this->company_id, 472 );                    //Must Not Work (Must be Scheduled Absent)
		$this->createHoliday( $this->company_id, 10, $holiday_epoch, $policy_ids['holiday'][0] );           //Thu of previous week

		//Create Policy Group
		$dd->createPolicyGroup( $this->company_id,
								null, //Meal
								null, //Exception
								$policy_ids['holiday'],
								null, //OT
								null, //Premium
								null, //Round
								[ $this->user_id ], //Users
								null, //Break
								null, //Accrual
								null, //Expense
								[ $this->policy_ids['absence'][10], $this->policy_ids['absence'][11] ], //Absence, //Absence
								[ $this->policy_ids['regular'][12] ] //Regular
		);

		//
		//Day of Week: 1
		//
		//$date_epoch = TTDate::incrementDate( TTDate::getMiddleDayEpoch( TTDate::getBeginWeekEpoch( time() ) ), -10, 'day' );
		$date_epoch = $holiday_epoch;

		$this->createSchedule( $this->user_id, $date_epoch, [
				'status_id'          => 20, //Absent
				'absence_policy_id'  => $this->policy_ids['absence'][10],
				'schedule_policy_id' => TTUUID::getZeroID(),
				'start_time'         => '8:00AM',
				'end_time'           => '4:00PM',
		] );

		$udt_arr = $this->getUserDateTotalArray( $date_epoch, $date_epoch );
		//print_r($udt_arr);
		//Total Time
		$this->assertEquals( 5, $udt_arr[$date_epoch][0]['object_type_id'] );                               //5=System Total
		$this->assertEquals( $udt_arr[$date_epoch][0]['pay_code_id'], TTUUID::getZeroID() );
		$this->assertEquals( $udt_arr[$date_epoch][0]['total_time'], ( 8 * 3600 ) );
		//Holiday Time
		$this->assertEquals( 25, $udt_arr[$date_epoch][1]['object_type_id'] );                              //Holiday Time
		$this->assertEquals( $udt_arr[$date_epoch][1]['pay_code_id'], $this->policy_ids['pay_code'][900] ); //Regular Time
		$this->assertEquals( $udt_arr[$date_epoch][1]['total_time'], ( 8 * 3600 ) );

		//Make sure no other hours
		$this->assertCount( 2, $udt_arr[$date_epoch] );

		return true;
	}

	/**
	 * @group OvertimePolicy_testHolidayShiftOnHolidayE2
	 */
	function testHolidayShiftOnHolidayE2() {
		global $dd;

		$date_epoch = TTDate::getMiddleDayEpoch( TTDate::getBeginWeekEpoch( time() ) );

		$holiday_epoch = TTDate::incrementDate( TTDate::getMiddleDayEpoch( $date_epoch ), -3, 'day' );

		//Holiday
		$policy_ids['holiday'][] = $this->createHolidayPolicy( $this->company_id, 472 ); //Must Not Work (Must be Scheduled Absent)
		$this->createHoliday( $this->company_id, 10, $holiday_epoch, $policy_ids['holiday'][0] ); //Thu of previous week

		//Create Policy Group
		$dd->createPolicyGroup( $this->company_id,
								null, //Meal
								null, //Exception
								$policy_ids['holiday'],
								null, //OT
								null, //Premium
								null, //Round
								[ $this->user_id ], //Users
								null, //Break
								null, //Accrual
								null, //Expense
								[ $this->policy_ids['absence'][10], $this->policy_ids['absence'][11] ], //Absence, //Absence
								[ $this->policy_ids['regular'][12] ] //Regular
		);

		//
		//Day of Week: 1
		//
		//$date_epoch = TTDate::incrementDate( TTDate::getMiddleDayEpoch( TTDate::getBeginWeekEpoch( time() ) ), -10, 'day' );
		$date_epoch = $holiday_epoch;

		$this->createSchedule( $this->user_id, $date_epoch, [
				'status_id'          => 10, //Working
				//'absence_policy_id' => $this->policy_ids['absence'][10],
				'schedule_policy_id' => TTUUID::getZeroID(),
				'start_time'         => '8:00AM',
				'end_time'           => '4:00PM',
		] );

		$udt_arr = $this->getUserDateTotalArray( $date_epoch, $date_epoch );
		//print_r($udt_arr);

		//Make sure no other hours
		$this->assertCount( 0, $udt_arr );

		return true;
	}

	/**
	 * @group OvertimePolicy_testHolidayShiftOnHolidayE3
	 */
	function testHolidayShiftOnHolidayE3() {
		global $dd;

		$date_epoch = TTDate::getMiddleDayEpoch( TTDate::getBeginWeekEpoch( time() ) );

		$holiday_epoch = TTDate::incrementDate( TTDate::getMiddleDayEpoch( $date_epoch ), -3, 'day' );

		//Holiday
		$policy_ids['holiday'][] = $this->createHolidayPolicy( $this->company_id, 472 );                    //Must Not Work (Must be Scheduled Absent)
		$this->createHoliday( $this->company_id, 10, $holiday_epoch, $policy_ids['holiday'][0] );           //Thu of previous week

		//Create Policy Group
		$dd->createPolicyGroup( $this->company_id,
								null, //Meal
								null, //Exception
								$policy_ids['holiday'],
								null, //OT
								null, //Premium
								null, //Round
								[ $this->user_id ], //Users
								null, //Break
								null, //Accrual
								null, //Expense
								[ $this->policy_ids['absence'][10], $this->policy_ids['absence'][11] ], //Absence, //Absence
								[ $this->policy_ids['regular'][12] ] //Regular
		);

		//
		//Day of Week: 1
		//
		//$date_epoch = TTDate::incrementDate( TTDate::getMiddleDayEpoch( TTDate::getBeginWeekEpoch( time() ) ), -10, 'day' );
		$date_epoch = $holiday_epoch;
		$date_stamp = TTDate::getDate( 'DATE', $date_epoch );

		$this->createSchedule( $this->user_id, $date_epoch, [
				'status_id'          => 20, //Absent
				'absence_policy_id'  => $this->policy_ids['absence'][10],
				'schedule_policy_id' => TTUUID::getZeroID(),
				'start_time'         => '8:00AM',
				'end_time'           => '4:00PM',
		] );

		$dd->createPunchPair( $this->user_id,
							  strtotime( $date_stamp . ' 8:00AM' ),
							  strtotime( $date_stamp . ' 4:00PM' ),
							  [
									  'in_type_id'    => 10,
									  'out_type_id'   => 10,
									  'branch_id'     => 0,
									  'department_id' => 0,
									  'job_id'        => 0,
									  'job_item_id'   => 0,
									  'punch_tag_id'  => []
							  ],
							  true
		);

		$udt_arr = $this->getUserDateTotalArray( $date_epoch, $date_epoch );
		//print_r($udt_arr);
		//Total Time
		$this->assertEquals( 5, $udt_arr[$date_epoch][0]['object_type_id'] );                               //5=System Total
		$this->assertEquals( $udt_arr[$date_epoch][0]['pay_code_id'], TTUUID::getZeroID() );
		$this->assertEquals( $udt_arr[$date_epoch][0]['total_time'], ( 8 * 3600 ) );
		//Regular Time
		$this->assertEquals( 20, $udt_arr[$date_epoch][1]['object_type_id'] );                              //Regular Time
		$this->assertEquals( $udt_arr[$date_epoch][1]['pay_code_id'], $this->policy_ids['pay_code'][100] ); //Regular Time
		$this->assertEquals( $udt_arr[$date_epoch][1]['total_time'], ( 8 * 3600 ) );

		//Make sure no other hours
		$this->assertCount( 2, $udt_arr[$date_epoch] );

		return true;
	}

	/**
	 * @group OvertimePolicy_testHolidayShiftOnHolidayF1
	 */
	function testHolidayShiftOnHolidayF1() {
		global $dd;

		$date_epoch = TTDate::getMiddleDayEpoch( TTDate::getBeginWeekEpoch( time() ) );

		$holiday_epoch = TTDate::incrementDate( TTDate::getMiddleDayEpoch( $date_epoch ), -3, 'day' );

		//Holiday
		$policy_ids['holiday'][] = $this->createHolidayPolicy( $this->company_id, 475 ); //Must Not Work (Must not be Scheduled)
		$this->createHoliday( $this->company_id, 10, $holiday_epoch, $policy_ids['holiday'][0] ); //Thu of previous week

		//Create Policy Group
		$dd->createPolicyGroup( $this->company_id,
								null, //Meal
								null, //Exception
								$policy_ids['holiday'],
								null, //OT
								null, //Premium
								null, //Round
								[ $this->user_id ], //Users
								null, //Break
								null, //Accrual
								null, //Expense
								[ $this->policy_ids['absence'][10], $this->policy_ids['absence'][11] ], //Absence, //Absence
								[ $this->policy_ids['regular'][12] ] //Regular
		);

		//
		//Day of Week: 1
		//
		//$date_epoch = TTDate::incrementDate( TTDate::getMiddleDayEpoch( TTDate::getBeginWeekEpoch( time() ) ), -10, 'day' );
		$date_epoch = $holiday_epoch;

		$this->createSchedule( $this->user_id, $date_epoch, [
				'status_id'          => 20, //Absent
				'absence_policy_id'  => $this->policy_ids['absence'][10],
				'schedule_policy_id' => TTUUID::getZeroID(),
				'start_time'         => '8:00AM',
				'end_time'           => '4:00PM',
		] );

		$udt_arr = $this->getUserDateTotalArray( $date_epoch, $date_epoch );
		//print_r($udt_arr);

		//Make sure no other hours
		$this->assertCount( 0, $udt_arr );

		return true;
	}

	/**
	 * @group OvertimePolicy_testHolidayShiftOnHolidayF2
	 */
	function testHolidayShiftOnHolidayF2() {
		global $dd;

		$date_epoch = TTDate::getMiddleDayEpoch( TTDate::getBeginWeekEpoch( time() ) );

		$holiday_epoch = TTDate::incrementDate( TTDate::getMiddleDayEpoch( $date_epoch ), -3, 'day' );

		//Holiday
		$policy_ids['holiday'][] = $this->createHolidayPolicy( $this->company_id, 475 ); //Must Not Work (Must not be Scheduled)
		$this->createHoliday( $this->company_id, 10, $holiday_epoch, $policy_ids['holiday'][0] ); //Thu of previous week

		//Create Policy Group
		$dd->createPolicyGroup( $this->company_id,
								null, //Meal
								null, //Exception
								$policy_ids['holiday'],
								null, //OT
								null, //Premium
								null, //Round
								[ $this->user_id ], //Users
								null, //Break
								null, //Accrual
								null, //Expense
								[ $this->policy_ids['absence'][10], $this->policy_ids['absence'][11] ], //Absence, //Absence
								[ $this->policy_ids['regular'][12] ] //Regular
		);

		//
		//Day of Week: 1
		//
		//$date_epoch = TTDate::incrementDate( TTDate::getMiddleDayEpoch( TTDate::getBeginWeekEpoch( time() ) ), -10, 'day' );
		$date_epoch = $holiday_epoch;

		$this->createSchedule( $this->user_id, $date_epoch, [
				'status_id'          => 10, //Working
				//'absence_policy_id' => $this->policy_ids['absence'][10],
				'schedule_policy_id' => TTUUID::getZeroID(),
				'start_time'         => '8:00AM',
				'end_time'           => '4:00PM',
		] );

		$udt_arr = $this->getUserDateTotalArray( $date_epoch, $date_epoch );
		//print_r($udt_arr);

		//Make sure no other hours
		$this->assertCount( 0, $udt_arr );

		return true;
	}

	/**
	 * @group OvertimePolicy_testHolidayShiftOnHolidayF3
	 */
	function testHolidayShiftOnHolidayF3() {
		global $dd;

		$date_epoch = TTDate::getMiddleDayEpoch( TTDate::getBeginWeekEpoch( time() ) );

		$holiday_epoch = TTDate::incrementDate( TTDate::getMiddleDayEpoch( $date_epoch ), -3, 'day' );

		//Holiday
		$policy_ids['holiday'][] = $this->createHolidayPolicy( $this->company_id, 475 );                    //Must Not Work (Must not be Scheduled)
		$this->createHoliday( $this->company_id, 10, $holiday_epoch, $policy_ids['holiday'][0] );           //Thu of previous week

		//Create Policy Group
		$dd->createPolicyGroup( $this->company_id,
								null, //Meal
								null, //Exception
								$policy_ids['holiday'],
								null, //OT
								null, //Premium
								null, //Round
								[ $this->user_id ], //Users
								null, //Break
								null, //Accrual
								null, //Expense
								[ $this->policy_ids['absence'][10], $this->policy_ids['absence'][11] ], //Absence, //Absence
								[ $this->policy_ids['regular'][12] ] //Regular
		);

		//
		//Day of Week: 1
		//
		//$date_epoch = TTDate::incrementDate( TTDate::getMiddleDayEpoch( TTDate::getBeginWeekEpoch( time() ) ), -10, 'day' );
		$date_epoch = $holiday_epoch;
		$date_stamp = TTDate::getDate( 'DATE', $date_epoch );

		$this->createSchedule( $this->user_id, $date_epoch, [
				'status_id'          => 20, //Absent
				'absence_policy_id'  => $this->policy_ids['absence'][10],
				'schedule_policy_id' => TTUUID::getZeroID(),
				'start_time'         => '8:00AM',
				'end_time'           => '4:00PM',
		] );

		$dd->createPunchPair( $this->user_id,
							  strtotime( $date_stamp . ' 8:00AM' ),
							  strtotime( $date_stamp . ' 4:00PM' ),
							  [
									  'in_type_id'    => 10,
									  'out_type_id'   => 10,
									  'branch_id'     => 0,
									  'department_id' => 0,
									  'job_id'        => 0,
									  'job_item_id'   => 0,
									  'punch_tag_id'  => []
							  ],
							  true
		);

		$udt_arr = $this->getUserDateTotalArray( $date_epoch, $date_epoch );
		//print_r($udt_arr);
		//Total Time
		$this->assertEquals( 5, $udt_arr[$date_epoch][0]['object_type_id'] );                               //5=System Total
		$this->assertEquals( $udt_arr[$date_epoch][0]['pay_code_id'], TTUUID::getZeroID() );
		$this->assertEquals( $udt_arr[$date_epoch][0]['total_time'], ( 8 * 3600 ) );
		//Regular Time
		$this->assertEquals( 20, $udt_arr[$date_epoch][1]['object_type_id'] );                              //Regular Time
		$this->assertEquals( $udt_arr[$date_epoch][1]['pay_code_id'], $this->policy_ids['pay_code'][100] ); //Regular Time
		$this->assertEquals( $udt_arr[$date_epoch][1]['total_time'], ( 8 * 3600 ) );

		//Make sure no other hours
		$this->assertCount( 2, $udt_arr[$date_epoch] );

		return true;
	}

	/**
	 * @group OvertimePolicy_testHolidayShiftOnHolidayF4
	 */
	function testHolidayShiftOnHolidayF4() {
		global $dd;

		$date_epoch = TTDate::getMiddleDayEpoch( TTDate::getBeginWeekEpoch( time() ) );

		$holiday_epoch = TTDate::incrementDate( TTDate::getMiddleDayEpoch( $date_epoch ), -3, 'day' );

		//Holiday
		$policy_ids['holiday'][] = $this->createHolidayPolicy( $this->company_id, 475 );                    //Must Not Work (Must not be Scheduled)
		$this->createHoliday( $this->company_id, 10, $holiday_epoch, $policy_ids['holiday'][0] );           //Thu of previous week

		//Create Policy Group
		$dd->createPolicyGroup( $this->company_id,
								null, //Meal
								null, //Exception
								$policy_ids['holiday'],
								null, //OT
								null, //Premium
								null, //Round
								[ $this->user_id ], //Users
								null, //Break
								null, //Accrual
								null, //Expense
								[ $this->policy_ids['absence'][10], $this->policy_ids['absence'][11] ], //Absence, //Absence
								[ $this->policy_ids['regular'][12] ] //Regular
		);

		//
		//Day of Week: 1
		//
		//$date_epoch = TTDate::incrementDate( TTDate::getMiddleDayEpoch( TTDate::getBeginWeekEpoch( time() ) ), -10, 'day' );
		$date_epoch = $holiday_epoch;

		//
		//Recalculate timesheet and recheck all start/end timestamps now.
		//
		$ulf = TTNew( 'UserListFactory' ); /** @var UserListFactory $ulf */
		$ulf->getById( $this->user_id );
		if ( $ulf->getRecordCount() > 0 ) {
			UserDateTotalFactory::reCalculateDay( $ulf->getCurrent(), TTDate::getDateArray( TTDate::getBeginWeekEpoch( $date_epoch ), TTDate::getEndWeekEpoch( $date_epoch ) ) );
		} else {
			$this->assertTrue( false );
		}


		$udt_arr = $this->getUserDateTotalArray( $date_epoch, $date_epoch );
		//print_r($udt_arr);
		//Total Time
		$this->assertEquals( 5, $udt_arr[$date_epoch][0]['object_type_id'] );                               //5=System Total
		$this->assertEquals( $udt_arr[$date_epoch][0]['pay_code_id'], TTUUID::getZeroID() );
		$this->assertEquals( $udt_arr[$date_epoch][0]['total_time'], ( 8 * 3600 ) );
		//Holiday Time
		$this->assertEquals( 25, $udt_arr[$date_epoch][1]['object_type_id'] );                              //Holiday Time
		$this->assertEquals( $udt_arr[$date_epoch][1]['pay_code_id'], $this->policy_ids['pay_code'][900] ); //Regular Time
		$this->assertEquals( $udt_arr[$date_epoch][1]['total_time'], ( 8 * 3600 ) );

		//Make sure no other hours
		$this->assertCount( 2, $udt_arr[$date_epoch] );

		return true;
	}

	/**
	 * @group testNegativeAbsencePolicyA
	 */
	function testNegativeAbsencePolicyA() {
		//Test handling negative absence that matches the amount of time worked. There should still be a system row of 0hrs but the start/end time stamps will be populated.
		global $dd;

		$policy_ids['pay_formula_policy'][] = $this->createPayFormulaPolicy( $this->company_id, 200 ); //OT1.5
		$policy_ids['pay_formula_policy'][] = $this->createPayFormulaPolicy( $this->company_id, 210 ); //OT2.0
		$policy_ids['pay_formula_policy'][] = $this->createPayFormulaPolicy( $this->company_id, 220 ); //OT2.5

		$policy_ids['pay_code'][] = $this->createPayCode( $this->company_id, 100, $this->policy_ids['pay_formula_policy'][910] );
		$policy_ids['pay_code'][] = $this->createPayCode( $this->company_id, 110, $policy_ids['pay_formula_policy'][1] );
		$policy_ids['pay_code'][] = $this->createPayCode( $this->company_id, 120, $policy_ids['pay_formula_policy'][2] );

		//Create Policy Group
		$dd->createPolicyGroup( $this->company_id,
								null, //Meal
								null, //Exception
								null, //Holiday
								null, //OT
								null, //Premium
								null, //Round
								[ $this->user_id ], //Users
								null, //Break
								null, //Accrual
								null, //Expense
								[ $this->policy_ids['absence'][10] ], //Absence
								[ $this->policy_ids['regular'][12] ] //Regular
		);


		$date_epoch = TTDate::getMiddleDayEpoch( TTDate::getBeginWeekEpoch( time(), 1 ) );                  //Start on Monday to avoid DST issues on Sunday morning.
		$date_stamp = TTDate::getDate( 'DATE', $date_epoch );

		$dd->createPunchPair( $this->user_id,
							  strtotime( $date_stamp . ' 8:00AM' ),
							  strtotime( $date_stamp . ' 9:00AM' ),
							  [
									  'in_type_id'    => 10,
									  'out_type_id'   => 10,
									  'branch_id'     => 0,
									  'department_id' => 0,
									  'job_id'        => 0,
									  'job_item_id'   => 0,
									  'punch_tag_id'  => []
							  ],
							  true
		);

		$dd->createAbsence( $this->user_id, $date_epoch, ( -1 * 3600 ), $this->policy_ids['absence'][10] );

		$udt_arr = $this->getUserDateTotalArray( $date_epoch, $date_epoch );
		//print_r($udt_arr);

		//Total Time
		$this->assertEquals( 5, $udt_arr[$date_epoch][0]['object_type_id'] );                               //5=System Total
		$this->assertEquals( $udt_arr[$date_epoch][0]['pay_code_id'], TTUUID::getZeroID() );
		$this->assertEquals( $udt_arr[$date_epoch][0]['total_time'], ( 0 * 3600 ) );
		$this->assertEquals( $udt_arr[$date_epoch][0]['start_time_stamp'], strtotime( $date_stamp . ' 8:00AM' ) );
		$this->assertEquals( $udt_arr[$date_epoch][0]['end_time_stamp'], strtotime( $date_stamp . ' 9:00AM' ) );
		$this->assertEquals( 0, $udt_arr[$date_epoch][0]['hourly_rate'] );
		//Regular Time
		$this->assertEquals( 20, $udt_arr[$date_epoch][1]['object_type_id'] );                              //Regular Time
		$this->assertEquals( $udt_arr[$date_epoch][1]['pay_code_id'], $this->policy_ids['pay_code'][100] ); //Regular Time
		$this->assertEquals( $udt_arr[$date_epoch][1]['total_time'], ( 1 * 3600 ) );
		$this->assertEquals( $udt_arr[$date_epoch][1]['start_time_stamp'], strtotime( $date_stamp . ' 8:00AM' ) );
		$this->assertEquals( $udt_arr[$date_epoch][1]['end_time_stamp'], strtotime( $date_stamp . ' 9:00AM' ) );
		//Absence Time
		$this->assertEquals( 25, $udt_arr[$date_epoch][2]['object_type_id'] );                              //Absence Time
		$this->assertEquals( $udt_arr[$date_epoch][2]['pay_code_id'], $this->policy_ids['pay_code'][900] ); //Absence Time
		$this->assertEquals( $udt_arr[$date_epoch][2]['total_time'], ( -1 * 3600 ) );
		$this->assertEquals( $udt_arr[$date_epoch][2]['start_time_stamp'], strtotime( $date_stamp . ' 9:00AM' ) );
		$this->assertEquals( $udt_arr[$date_epoch][2]['end_time_stamp'], strtotime( $date_stamp . ' 8:00AM' ) );

		//Make sure no other hours
		$this->assertCount( 3, $udt_arr[$date_epoch] );

		return true;
	}

	/**
	 * @group testDuplicateRegularTimePolicyA
	 */
	function testDuplicateRegularTimePolicyA() {
		//Test handling meal policy at Active After time, along with regular time policies that include the meal and some that don't. This ensures that the regular time never gets double up or shows more than the employee worked.
		global $dd;

		$policy_ids['pay_formula_policy'][] = $this->createPayFormulaPolicy( $this->company_id, 200 ); //OT1.5
		$policy_ids['pay_formula_policy'][] = $this->createPayFormulaPolicy( $this->company_id, 210 ); //OT2.0
		$policy_ids['pay_formula_policy'][] = $this->createPayFormulaPolicy( $this->company_id, 220 ); //OT2.5

		$policy_ids['pay_code'][] = $this->createPayCode( $this->company_id, 100, $this->policy_ids['pay_formula_policy'][910] );
		$policy_ids['pay_code'][] = $this->createPayCode( $this->company_id, 110, $policy_ids['pay_formula_policy'][1] );
		$policy_ids['pay_code'][] = $this->createPayCode( $this->company_id, 120, $policy_ids['pay_formula_policy'][2] );

		$policy_ids['regular'][500] = $dd->createRegularTimePolicy( $this->company_id, 21, $this->policy_ids['contributing_shift_policy'][10], $this->policy_ids['pay_code'][100] );
		$policy_ids['regular'][501] = $dd->createRegularTimePolicy( $this->company_id, 22, $this->policy_ids['contributing_shift_policy'][12], $this->policy_ids['pay_code'][101] );

		$policy_ids['meal'][] = $this->createMealPolicy( $this->company_id, 130 ); //AutoDeduct 1hr At Active After Time


		//Create Policy Group
		$dd->createPolicyGroup( $this->company_id,
								$policy_ids['meal'], //Meal
								null, //Exception
								null, //Holiday
								null, //OT
								null, //Premium
								null, //Round
								[ $this->user_id ], //Users
								null, //Break
								null, //Accrual
								null, //Expense
								null, //Absence
								[ $policy_ids['regular'][500], $policy_ids['regular'][501] ] //Regular
		);


		$date_epoch = TTDate::getMiddleDayEpoch( TTDate::getBeginWeekEpoch( time(), 1 ) );                  //Start on Monday to avoid DST issues on Sunday morning.
		$date_stamp = TTDate::getDate( 'DATE', $date_epoch );
		$date_epoch2 = TTDate::incrementDate( TTDate::getMiddleDayEpoch( TTDate::getBeginWeekEpoch( time(), 1 ) ), 1, 'day' );
		$date_stamp2 = TTDate::getDate( 'DATE', $date_epoch2 );

		$dd->createPunchPair( $this->user_id,
							  strtotime( $date_stamp . ' 6:00AM' ),
							  strtotime( $date_stamp . ' 6:00PM' ),
							  [
									  'in_type_id'    => 10,
									  'out_type_id'   => 10,
									  'branch_id'     => 0,
									  'department_id' => 0,
									  'job_id'        => 0,
									  'job_item_id'   => 0,
									  'punch_tag_id'  => []
							  ],
							  true
		);

		$dd->createPunchPair( $this->user_id,
							  strtotime( $date_stamp . ' 11:45PM' ),
							  strtotime( $date_stamp2 . ' 1:00AM' ),
							  [
									  'in_type_id'    => 10,
									  'out_type_id'   => 10,
									  'branch_id'     => 0,
									  'department_id' => 0,
									  'job_id'        => 0,
									  'job_item_id'   => 0,
									  'punch_tag_id'  => []
							  ],
							  true
		);

		$udt_arr = $this->getUserDateTotalArray( $date_epoch, $date_epoch );
		//print_r($udt_arr);

		//Total Time
		$this->assertEquals( 5, $udt_arr[$date_epoch][0]['object_type_id'] );                               //5=System Total
		$this->assertEquals( $udt_arr[$date_epoch][0]['pay_code_id'], TTUUID::getZeroID() );
		$this->assertEquals( $udt_arr[$date_epoch][0]['total_time'], ( 13.25 * 3600 ) );
		$this->assertEquals( $udt_arr[$date_epoch][0]['start_time_stamp'], strtotime( $date_stamp . ' 6:00AM' ) );
		$this->assertEquals( $udt_arr[$date_epoch][0]['end_time_stamp'], strtotime( $date_stamp2 . ' 1:00AM' ) );
		$this->assertEquals( 0, $udt_arr[$date_epoch][0]['hourly_rate'] );
		//Regular Time
		$this->assertEquals( 20, $udt_arr[$date_epoch][1]['object_type_id'] );                              //Regular Time
		$this->assertEquals( $udt_arr[$date_epoch][1]['pay_code_id'], $this->policy_ids['pay_code'][100] ); //Regular Time
		$this->assertEquals( $udt_arr[$date_epoch][1]['total_time'], ( 1.25 * 3600 ) );
		$this->assertEquals( $udt_arr[$date_epoch][1]['start_time_stamp'], strtotime( $date_stamp . ' 11:45PM' ) );
		$this->assertEquals( $udt_arr[$date_epoch][1]['end_time_stamp'], strtotime( $date_stamp2 . ' 1:00AM' ) );
		//Regular Time
		$this->assertEquals( 20, $udt_arr[$date_epoch][2]['object_type_id'] );                              //Regular Time
		$this->assertEquals( $udt_arr[$date_epoch][2]['pay_code_id'], $this->policy_ids['pay_code'][100] ); //Regular Time
		$this->assertEquals( $udt_arr[$date_epoch][2]['total_time'], ( 12 * 3600 ) );
		$this->assertEquals( $udt_arr[$date_epoch][2]['start_time_stamp'], strtotime( $date_stamp . ' 6:00AM' ) );
		$this->assertEquals( $udt_arr[$date_epoch][2]['end_time_stamp'], strtotime( $date_stamp . ' 6:00PM' ) );
		//Lunch
		$this->assertEquals( 100, $udt_arr[$date_epoch][3]['object_type_id'] );
		$this->assertEquals( $udt_arr[$date_epoch][3]['pay_code_id'], $this->policy_ids['pay_code'][190] );
		$this->assertEquals( $udt_arr[$date_epoch][3]['total_time'], ( -1 * 3600 ) );
		$this->assertEquals( $udt_arr[$date_epoch][3]['start_time_stamp'], strtotime( $date_stamp . ' 12:00PM' ) );
		$this->assertEquals( $udt_arr[$date_epoch][3]['end_time_stamp'], strtotime( $date_stamp . ' 1:00PM' ) );

		//Make sure no other hours
		$this->assertCount( 4, $udt_arr[$date_epoch] );

		return true;
	}

	/**
	 * @group OvertimePolicy_testDailyAverageHourlyRateA
	 */
	function testDailyAverageHourlyRateA() {
		if ( getTTProductEdition() == TT_PRODUCT_COMMUNITY ) {
			return true;
		}

		global $dd;

		$policy_ids['pay_formula_policy'][] = $this->createPayFormulaPolicy( $this->company_id, 1300, 0, $this->policy_ids['contributing_shift_policy'][10], $this->policy_ids['contributing_shift_policy'][10] );

		//Modify existing pay code to use the above pay formula.
		$pclf = TTnew( 'PayCodeListFactory' );
		$pclf->getById( $this->policy_ids['pay_code'][900] );
		if ( $pclf->getRecordCount() > 0 ) {
			$pc_obj = $pclf->getCurrent();
			$pc_obj->setPayFormulaPolicy( $policy_ids['pay_formula_policy'][0] );
			if ( $pc_obj->isValid() ) {
				$pc_obj->Save();
			}
		} else {
			$this->assertTrue( false, 'Pay Code not found!' );
		}

		//Create Policy Group
		$dd->createPolicyGroup( $this->company_id,
								null, //Meal
								null, //Exception
								null, //Holiday
								null, //OT
								null, //Premium
								null, //Round
								[ $this->user_id ], //Users
								null, //Break
								null, //Accrual
								null, //Expense
								[ $this->policy_ids['absence'][10] ], //Absence
								[ $this->policy_ids['regular'][10] ] //Regular
		);


		$date_epoch = TTDate::getMiddleDayEpoch( TTDate::getBeginWeekEpoch( time() ) );
		$date_stamp = TTDate::getDate( 'DATE', $date_epoch );


		//
		//Day of Week: 1
		//
		$dd->createPunchPair( $this->user_id,
							  strtotime( $date_stamp . ' 8:00AM' ),
							  strtotime( $date_stamp . ' 9:00AM' ), //This is before the averaging lookback period, so make it small so we know if it affects the averaging formula.
							  [
									  'in_type_id'    => 10,
									  'out_type_id'   => 10,
									  'branch_id'     => $this->branch_ids[0],
									  'department_id' => 0,
									  'job_id'        => 0,
									  'job_item_id'   => 0,
									  'punch_tag_id'  => []
							  ],
							  true
		);

		$udt_arr = $this->getUserDateTotalArray( $date_epoch, $date_epoch );
		//Total Time
		$this->assertEquals( 5, $udt_arr[$date_epoch][0]['object_type_id'] );                                                                                                                                                                                                                                                                          //5=System Total
		$this->assertEquals( $udt_arr[$date_epoch][0]['pay_code_id'], TTUUID::getZeroID() );
		$this->assertEquals( $udt_arr[$date_epoch][0]['total_time'], ( 1 * 3600 ) );
		$this->assertEquals( 0, $udt_arr[$date_epoch][0]['hourly_rate'] );
		$this->assertEquals( 0, $udt_arr[$date_epoch][0]['hourly_rate_with_burden'] );

		//Regular Time
		$this->assertEquals( 20, $udt_arr[$date_epoch][1]['object_type_id'] );                                                                                                                                                                                                                                                                         //Regular Time
		$this->assertEquals( $udt_arr[$date_epoch][1]['pay_code_id'], $this->policy_ids['pay_code'][100] );                                                                                                                                                                                                                                            //Regular Time
		$this->assertEquals( $udt_arr[$date_epoch][1]['total_time'], ( 1 * 3600 ) );
		$this->assertEquals( $udt_arr[$date_epoch][1]['hourly_rate'], 21.50 );
		$this->assertEquals( $udt_arr[$date_epoch][1]['hourly_rate_with_burden'], ( 21.50 * 1.135 ) );

		//Make sure no other hours
		$this->assertCount( 2, $udt_arr[$date_epoch] );

		//
		//Day of Week: 2
		//
		$date_epoch = TTDate::incrementDate( TTDate::getMiddleDayEpoch( TTDate::getBeginWeekEpoch( time() ) ), 1, 'day' );
		$date_stamp = TTDate::getDate( 'DATE', $date_epoch );

		$dd->createPunchPair( $this->user_id,
							  strtotime( $date_stamp . ' 8:00AM' ),
							  strtotime( $date_stamp . ' 4:00PM' ),
							  [
									  'in_type_id'    => 10,
									  'out_type_id'   => 10,
									  'branch_id'     => $this->branch_ids[0],
									  'department_id' => 0,
									  'job_id'        => 0,
									  'job_item_id'   => 0,
									  'punch_tag_id'  => []
							  ],
							  true
		);

		$udt_arr = $this->getUserDateTotalArray( $date_epoch, $date_epoch );
		//Total Time
		$this->assertEquals( 5, $udt_arr[$date_epoch][0]['object_type_id'] );                                                                                                                                                                                                                                                                          //5=System Total
		$this->assertEquals( $udt_arr[$date_epoch][0]['pay_code_id'], TTUUID::getZeroID() );
		$this->assertEquals( $udt_arr[$date_epoch][0]['total_time'], ( 8 * 3600 ) );
		$this->assertEquals( 0, $udt_arr[$date_epoch][0]['hourly_rate'] );
		$this->assertEquals( 0, $udt_arr[$date_epoch][0]['hourly_rate_with_burden'] );

		//Regular Time
		$this->assertEquals( 20, $udt_arr[$date_epoch][1]['object_type_id'] );                                                                                                                                                                                                                                                                         //Regular Time
		$this->assertEquals( $udt_arr[$date_epoch][1]['pay_code_id'], $this->policy_ids['pay_code'][100] );                                                                                                                                                                                                                                            //Regular Time
		$this->assertEquals( $udt_arr[$date_epoch][1]['total_time'], ( 8 * 3600 ) );
		$this->assertEquals( $udt_arr[$date_epoch][1]['hourly_rate'], 21.50 );
		$this->assertEquals( $udt_arr[$date_epoch][1]['hourly_rate_with_burden'], ( 21.50 * 1.135 ) );

		//Make sure no other hours
		$this->assertCount( 2, $udt_arr[$date_epoch] );



		//
		//Day of Week: 3
		//
		$date_epoch = TTDate::incrementDate( TTDate::getMiddleDayEpoch( TTDate::getBeginWeekEpoch( time() ) ), 2, 'day' );
		$date_stamp = TTDate::getDate( 'DATE', $date_epoch );

		$dd->createPunchPair( $this->user_id,
							  strtotime( $date_stamp . ' 8:00AM' ),
							  strtotime( $date_stamp . ' 4:00PM' ),
							  [
									  'in_type_id'    => 10,
									  'out_type_id'   => 10,
									  'branch_id'     => $this->branch_ids[1],
									  'department_id' => 0,
									  'job_id'        => 0,
									  'job_item_id'   => 0,
									  'punch_tag_id'  => []
							  ],
							  true
		);

		$udt_arr = $this->getUserDateTotalArray( $date_epoch, $date_epoch );
		//Total Time
		$this->assertEquals( 5, $udt_arr[$date_epoch][0]['object_type_id'] );                                                                                                                                                                                                                                                                          //5=System Total
		$this->assertEquals( $udt_arr[$date_epoch][0]['pay_code_id'], TTUUID::getZeroID() );
		$this->assertEquals( $udt_arr[$date_epoch][0]['total_time'], ( 8 * 3600 ) );
		$this->assertEquals( 0, $udt_arr[$date_epoch][0]['hourly_rate'] );
		$this->assertEquals( 0, $udt_arr[$date_epoch][0]['hourly_rate_with_burden'] );

		//Regular Time
		$this->assertEquals( 20, $udt_arr[$date_epoch][1]['object_type_id'] );                                                                                                                                                                                                                                                                         //Regular Time
		$this->assertEquals( $udt_arr[$date_epoch][1]['pay_code_id'], $this->policy_ids['pay_code'][100] );                                                                                                                                                                                                                                            //Regular Time
		$this->assertEquals( $udt_arr[$date_epoch][1]['total_time'], ( 8 * 3600 ) );
		$this->assertEquals( $udt_arr[$date_epoch][1]['hourly_rate'], 21.50 );
		$this->assertEquals( $udt_arr[$date_epoch][1]['hourly_rate_with_burden'], ( 21.50 * 1.135 ) );

		//Make sure no other hours
		$this->assertCount( 2, $udt_arr[$date_epoch] );



		//
		//Day of Week: 4
		//
		$date_epoch = TTDate::incrementDate( TTDate::getMiddleDayEpoch( TTDate::getBeginWeekEpoch( time() ) ), 3, 'day' );
		$date_stamp = TTDate::getDate( 'DATE', $date_epoch );

		$dd->createPunchPair( $this->user_id,
							  strtotime( $date_stamp . ' 8:00AM' ),
							  strtotime( $date_stamp . ' 4:00PM' ),
							  [
									  'in_type_id'    => 10,
									  'out_type_id'   => 10,
									  'branch_id'     => $this->branch_ids[1],
									  'department_id' => 0,
									  'job_id'        => 0,
									  'job_item_id'   => 0,
									  'punch_tag_id'  => []
							  ],
							  true
		);

		$udt_arr = $this->getUserDateTotalArray( $date_epoch, $date_epoch );
		//Total Time
		$this->assertEquals( 5, $udt_arr[$date_epoch][0]['object_type_id'] );                                                                                                                                                                                                                                                                          //5=System Total
		$this->assertEquals( $udt_arr[$date_epoch][0]['pay_code_id'], TTUUID::getZeroID() );
		$this->assertEquals( $udt_arr[$date_epoch][0]['total_time'], ( 8 * 3600 ) );
		$this->assertEquals( 0, $udt_arr[$date_epoch][0]['hourly_rate'] );
		$this->assertEquals( 0, $udt_arr[$date_epoch][0]['hourly_rate_with_burden'] );

		//Regular Time
		$this->assertEquals( 20, $udt_arr[$date_epoch][1]['object_type_id'] );                                                                                                                                                                                                                                                                         //Regular Time
		$this->assertEquals( $udt_arr[$date_epoch][1]['pay_code_id'], $this->policy_ids['pay_code'][100] );                                                                                                                                                                                                                                            //Regular Time
		$this->assertEquals( $udt_arr[$date_epoch][1]['total_time'], ( 8 * 3600 ) );
		$this->assertEquals( $udt_arr[$date_epoch][1]['hourly_rate'], 21.50 );
		$this->assertEquals( $udt_arr[$date_epoch][1]['hourly_rate_with_burden'], ( 21.50 * 1.135 ) );

		//Make sure no other hours
		$this->assertCount( 2, $udt_arr[$date_epoch] );


		//
		//Day of Week: 5
		//
		$date_epoch = TTDate::incrementDate( TTDate::getMiddleDayEpoch( TTDate::getBeginWeekEpoch( time() ) ), 4, 'day' );
		$date_stamp = TTDate::getDate( 'DATE', $date_epoch );

		$dd->createPunchPair( $this->user_id,
							  strtotime( $date_stamp . ' 8:00AM' ),
							  strtotime( $date_stamp . ' 4:00PM' ),
							  [
									  'in_type_id'    => 10,
									  'out_type_id'   => 10,
									  'branch_id'     => $this->branch_ids[1],
									  'department_id' => 0,
									  'job_id'        => 0,
									  'job_item_id'   => 0,
									  'punch_tag_id'  => []
							  ],
							  true
		);

		$udt_arr = $this->getUserDateTotalArray( $date_epoch, $date_epoch );
		//Total Time
		$this->assertEquals( 5, $udt_arr[$date_epoch][0]['object_type_id'] );                                                                                                                                                                                                                                                                          //5=System Total
		$this->assertEquals( $udt_arr[$date_epoch][0]['pay_code_id'], TTUUID::getZeroID() );
		$this->assertEquals( $udt_arr[$date_epoch][0]['total_time'], ( 8 * 3600 ) );
		$this->assertEquals( 0, $udt_arr[$date_epoch][0]['hourly_rate'] );
		$this->assertEquals( 0, $udt_arr[$date_epoch][0]['hourly_rate_with_burden'] );

		//Regular Time
		$this->assertEquals( 20, $udt_arr[$date_epoch][1]['object_type_id'] );                                                                                                                                                                                                                                                                         //Regular Time
		$this->assertEquals( $udt_arr[$date_epoch][1]['pay_code_id'], $this->policy_ids['pay_code'][100] );                                                                                                                                                                                                                                            //Regular Time
		$this->assertEquals( $udt_arr[$date_epoch][1]['total_time'], ( 8 * 3600 ) );
		$this->assertEquals( $udt_arr[$date_epoch][1]['hourly_rate'], 21.50 );
		$this->assertEquals( $udt_arr[$date_epoch][1]['hourly_rate_with_burden'], ( 21.50 * 1.135 ) );

		//Make sure no other hours
		$this->assertCount( 2, $udt_arr[$date_epoch] );

		//
		//Day of Week: 6
		//
		$date_epoch = TTDate::incrementDate( TTDate::getMiddleDayEpoch( TTDate::getBeginWeekEpoch( time() ) ), 5, 'day' );
		$date_stamp = TTDate::getDate( 'DATE', $date_epoch );

		$dd->createPunchPair( $this->user_id,
							  strtotime( $date_stamp . ' 8:00AM' ),
							  strtotime( $date_stamp . ' 4:00PM' ),
							  [
									  'in_type_id'    => 10,
									  'out_type_id'   => 10,
									  'branch_id'     => $this->branch_ids[1],
									  'department_id' => 0,
									  'job_id'        => 0,
									  'job_item_id'   => 0,
									  'punch_tag_id'  => []
							  ],
							  true
		);

		$udt_arr = $this->getUserDateTotalArray( $date_epoch, $date_epoch );
		//Total Time
		$this->assertEquals( 5, $udt_arr[$date_epoch][0]['object_type_id'] );                                                                                                                                                                                                                                                                          //5=System Total
		$this->assertEquals( $udt_arr[$date_epoch][0]['pay_code_id'], TTUUID::getZeroID() );
		$this->assertEquals( $udt_arr[$date_epoch][0]['total_time'], ( 8 * 3600 ) );
		$this->assertEquals( 0, $udt_arr[$date_epoch][0]['hourly_rate'] );
		$this->assertEquals( 0, $udt_arr[$date_epoch][0]['hourly_rate_with_burden'] );

		//Regular Time
		$this->assertEquals( 20, $udt_arr[$date_epoch][1]['object_type_id'] );                                                                                                                                                                                                                                                                         //Regular Time
		$this->assertEquals( $udt_arr[$date_epoch][1]['pay_code_id'], $this->policy_ids['pay_code'][100] );                                                                                                                                                                                                                                            //Regular Time
		$this->assertEquals( $udt_arr[$date_epoch][1]['total_time'], ( 8 * 3600 ) );
		$this->assertEquals( $udt_arr[$date_epoch][1]['hourly_rate'], 21.50 );
		$this->assertEquals( $udt_arr[$date_epoch][1]['hourly_rate_with_burden'], ( 21.50 * 1.135 ) );

		//Make sure no other hours
		$this->assertCount( 2, $udt_arr[$date_epoch] );

		//
		//Day of Week: 7
		//
		$date_epoch = TTDate::incrementDate( TTDate::getMiddleDayEpoch( TTDate::getBeginWeekEpoch( time() ) ), 6, 'day' );
		$date_stamp = TTDate::getDate( 'DATE', $date_epoch );

		$absence_id = $dd->createAbsence( $this->user_id, $date_epoch, ( 8 * 3600 ), $this->policy_ids['absence'][10] );

		$udt_arr = $this->getUserDateTotalArray( $date_epoch, $date_epoch );
		//print_r($udt_arr);

		//Total Time
		$this->assertEquals( 5, $udt_arr[$date_epoch][0]['object_type_id'] );                                                                                                                                                                                                                                                                          //5=System Total
		$this->assertEquals( $udt_arr[$date_epoch][0]['pay_code_id'], TTUUID::getZeroID() );
		$this->assertEquals( $udt_arr[$date_epoch][0]['total_time'], ( 8 * 3600 ) );
		$this->assertEquals( 0, $udt_arr[$date_epoch][0]['hourly_rate'] );
		$this->assertEquals( 0, $udt_arr[$date_epoch][0]['hourly_rate_with_burden'] );

		//Absence
		$this->assertEquals( 25, $udt_arr[$date_epoch][1]['object_type_id'] );                                                                                                                                                                                                                                                                         //Regular Time
		$this->assertEquals( $udt_arr[$date_epoch][1]['pay_code_id'], $this->policy_ids['pay_code'][900] );                                                                                                                                                                                                                                            //Regular Time
		$this->assertEquals( $udt_arr[$date_epoch][1]['total_time'], ( 8 * 3600 ) );
		$this->assertEquals( $udt_arr[$date_epoch][1]['hourly_rate'], 21.50 );
		$this->assertEquals( $udt_arr[$date_epoch][1]['hourly_rate_with_burden'], ( 21.50 * 1.135 ) );

		//Make sure no other hours
		$this->assertCount( 2, $udt_arr[$date_epoch] );

		return true;
	}

	/**
	 * @group OvertimePolicy_testDailyAverageHourlyRateB
	 */
	function testDailyAverageHourlyRateB() {
		if ( getTTProductEdition() == TT_PRODUCT_COMMUNITY ) {
			return true;
		}

		global $dd;

		$policy_ids['pay_formula_policy'][] = $this->createPayFormulaPolicy( $this->company_id, 1300, 0, $this->policy_ids['contributing_shift_policy'][10], $this->policy_ids['contributing_shift_policy'][10] );

		//Modify existing pay code to use the above pay formula.
		$pclf = TTnew( 'PayCodeListFactory' );
		$pclf->getById( $this->policy_ids['pay_code'][900] );
		if ( $pclf->getRecordCount() > 0 ) {
			$pc_obj = $pclf->getCurrent();
			$pc_obj->setPayFormulaPolicy( $policy_ids['pay_formula_policy'][0] );
			if ( $pc_obj->isValid() ) {
				$pc_obj->Save();
			}
		} else {
			$this->assertTrue( false, 'Pay Code not found!' );
		}

		//Create Policy Group
		$dd->createPolicyGroup( $this->company_id,
								null, //Meal
								null, //Exception
								null, //Holiday
								null, //OT
								null, //Premium
								null, //Round
								[ $this->user_id ], //Users
								null, //Break
								null, //Accrual
								null, //Expense
								[ $this->policy_ids['absence'][10] ], //Absence
								[ $this->policy_ids['regular'][10] ] //Regular
		);


		$date_epoch = TTDate::getMiddleDayEpoch( TTDate::getBeginWeekEpoch( time() ) );
		$date_stamp = TTDate::getDate( 'DATE', $date_epoch );


		//
		//Day of Week: 1
		//
		$dd->createPunchPair( $this->user_id,
							  strtotime( $date_stamp . ' 8:00AM' ),
							  strtotime( $date_stamp . ' 9:00AM' ),
							  [
									  'in_type_id'    => 10,
									  'out_type_id'   => 10,
									  'branch_id'     => $this->branch_ids[0],
									  'department_id' => 0,
									  'job_id'        => 0,
									  'job_item_id'   => 0,
									  'punch_tag_id'  => []
							  ],
							  true
		);

		$udt_arr = $this->getUserDateTotalArray( $date_epoch, $date_epoch );
		//Total Time
		$this->assertEquals( 5, $udt_arr[$date_epoch][0]['object_type_id'] );                                                                                                                                                                                                                                                                          //5=System Total
		$this->assertEquals( $udt_arr[$date_epoch][0]['pay_code_id'], TTUUID::getZeroID() );
		$this->assertEquals( $udt_arr[$date_epoch][0]['total_time'], ( 1 * 3600 ) );
		$this->assertEquals( 0, $udt_arr[$date_epoch][0]['hourly_rate'] );
		$this->assertEquals( 0, $udt_arr[$date_epoch][0]['hourly_rate_with_burden'] );

		//Regular Time
		$this->assertEquals( 20, $udt_arr[$date_epoch][1]['object_type_id'] );                                                                                                                                                                                                                                                                         //Regular Time
		$this->assertEquals( $udt_arr[$date_epoch][1]['pay_code_id'], $this->policy_ids['pay_code'][100] );                                                                                                                                                                                                                                            //Regular Time
		$this->assertEquals( $udt_arr[$date_epoch][1]['total_time'], ( 1 * 3600 ) );
		$this->assertEquals( $udt_arr[$date_epoch][1]['hourly_rate'], 21.50 );
		$this->assertEquals( $udt_arr[$date_epoch][1]['hourly_rate_with_burden'], ( 21.50 * 1.135 ) );

		//Make sure no other hours
		$this->assertCount( 2, $udt_arr[$date_epoch] );

		//
		//Day of Week: 2
		//
		$date_epoch = TTDate::incrementDate( TTDate::getMiddleDayEpoch( TTDate::getBeginWeekEpoch( time() ) ), 1, 'day' );
		$date_stamp = TTDate::getDate( 'DATE', $date_epoch );

		$dd->createPunchPair( $this->user_id,
							  strtotime( $date_stamp . ' 8:00AM' ),
							  strtotime( $date_stamp . ' 4:00PM' ),
							  [
									  'in_type_id'    => 10,
									  'out_type_id'   => 10,
									  'branch_id'     => $this->branch_ids[0],
									  'department_id' => 0,
									  'job_id'        => 0,
									  'job_item_id'   => 0,
									  'punch_tag_id'  => []
							  ],
							  true
		);

		$udt_arr = $this->getUserDateTotalArray( $date_epoch, $date_epoch );
		//Total Time
		$this->assertEquals( 5, $udt_arr[$date_epoch][0]['object_type_id'] );                                                                                                                                                                                                                                                                          //5=System Total
		$this->assertEquals( $udt_arr[$date_epoch][0]['pay_code_id'], TTUUID::getZeroID() );
		$this->assertEquals( $udt_arr[$date_epoch][0]['total_time'], ( 8 * 3600 ) );
		$this->assertEquals( 0, $udt_arr[$date_epoch][0]['hourly_rate'] );
		$this->assertEquals( 0, $udt_arr[$date_epoch][0]['hourly_rate_with_burden'] );

		//Regular Time
		$this->assertEquals( 20, $udt_arr[$date_epoch][1]['object_type_id'] );                                                                                                                                                                                                                                                                         //Regular Time
		$this->assertEquals( $udt_arr[$date_epoch][1]['pay_code_id'], $this->policy_ids['pay_code'][100] );                                                                                                                                                                                                                                            //Regular Time
		$this->assertEquals( $udt_arr[$date_epoch][1]['total_time'], ( 8 * 3600 ) );
		$this->assertEquals( $udt_arr[$date_epoch][1]['hourly_rate'], 21.50 );
		$this->assertEquals( $udt_arr[$date_epoch][1]['hourly_rate_with_burden'], ( 21.50 * 1.135 ) );

		//Make sure no other hours
		$this->assertCount( 2, $udt_arr[$date_epoch] );



		//
		//Day of Week: 3
		//
		$date_epoch = TTDate::incrementDate( TTDate::getMiddleDayEpoch( TTDate::getBeginWeekEpoch( time() ) ), 2, 'day' );
		$date_stamp = TTDate::getDate( 'DATE', $date_epoch );

		$dd->createPunchPair( $this->user_id,
							  strtotime( $date_stamp . ' 8:00AM' ),
							  strtotime( $date_stamp . ' 12:00PM' ),
							  [
									  'in_type_id'    => 10,
									  'out_type_id'   => 10,
									  'branch_id'     => $this->branch_ids[1],
									  'department_id' => 0,
									  'job_id'        => 0,
									  'job_item_id'   => 0,
									  'punch_tag_id'  => []
							  ],
							  true
		);

		$udt_arr = $this->getUserDateTotalArray( $date_epoch, $date_epoch );
		//Total Time
		$this->assertEquals( 5, $udt_arr[$date_epoch][0]['object_type_id'] );                                                                                                                                                                                                                                                                          //5=System Total
		$this->assertEquals( $udt_arr[$date_epoch][0]['pay_code_id'], TTUUID::getZeroID() );
		$this->assertEquals( $udt_arr[$date_epoch][0]['total_time'], ( 4 * 3600 ) );
		$this->assertEquals( 0, $udt_arr[$date_epoch][0]['hourly_rate'] );
		$this->assertEquals( 0, $udt_arr[$date_epoch][0]['hourly_rate_with_burden'] );

		//Regular Time
		$this->assertEquals( 20, $udt_arr[$date_epoch][1]['object_type_id'] );                                                                                                                                                                                                                                                                         //Regular Time
		$this->assertEquals( $udt_arr[$date_epoch][1]['pay_code_id'], $this->policy_ids['pay_code'][100] );                                                                                                                                                                                                                                            //Regular Time
		$this->assertEquals( $udt_arr[$date_epoch][1]['total_time'], ( 4 * 3600 ) );
		$this->assertEquals( $udt_arr[$date_epoch][1]['hourly_rate'], 21.50 );
		$this->assertEquals( $udt_arr[$date_epoch][1]['hourly_rate_with_burden'], ( 21.50 * 1.135 ) );

		//Make sure no other hours
		$this->assertCount( 2, $udt_arr[$date_epoch] );



		//
		//Day of Week: 4
		//
		$date_epoch = TTDate::incrementDate( TTDate::getMiddleDayEpoch( TTDate::getBeginWeekEpoch( time() ) ), 3, 'day' );
		$date_stamp = TTDate::getDate( 'DATE', $date_epoch );

		$dd->createPunchPair( $this->user_id,
							  strtotime( $date_stamp . ' 8:00AM' ),
							  strtotime( $date_stamp . ' 4:00PM' ),
							  [
									  'in_type_id'    => 10,
									  'out_type_id'   => 10,
									  'branch_id'     => $this->branch_ids[1],
									  'department_id' => 0,
									  'job_id'        => 0,
									  'job_item_id'   => 0,
									  'punch_tag_id'  => []
							  ],
							  true
		);

		$udt_arr = $this->getUserDateTotalArray( $date_epoch, $date_epoch );
		//Total Time
		$this->assertEquals( 5, $udt_arr[$date_epoch][0]['object_type_id'] );                                                                                                                                                                                                                                                                          //5=System Total
		$this->assertEquals( $udt_arr[$date_epoch][0]['pay_code_id'], TTUUID::getZeroID() );
		$this->assertEquals( $udt_arr[$date_epoch][0]['total_time'], ( 8 * 3600 ) );
		$this->assertEquals( 0, $udt_arr[$date_epoch][0]['hourly_rate'] );
		$this->assertEquals( 0, $udt_arr[$date_epoch][0]['hourly_rate_with_burden'] );

		//Regular Time
		$this->assertEquals( 20, $udt_arr[$date_epoch][1]['object_type_id'] );                                                                                                                                                                                                                                                                         //Regular Time
		$this->assertEquals( $udt_arr[$date_epoch][1]['pay_code_id'], $this->policy_ids['pay_code'][100] );                                                                                                                                                                                                                                            //Regular Time
		$this->assertEquals( $udt_arr[$date_epoch][1]['total_time'], ( 8 * 3600 ) );
		$this->assertEquals( $udt_arr[$date_epoch][1]['hourly_rate'], 21.50 );
		$this->assertEquals( $udt_arr[$date_epoch][1]['hourly_rate_with_burden'], ( 21.50 * 1.135 ) );

		//Make sure no other hours
		$this->assertCount( 2, $udt_arr[$date_epoch] );


		//
		//Day of Week: 5
		//
		$date_epoch = TTDate::incrementDate( TTDate::getMiddleDayEpoch( TTDate::getBeginWeekEpoch( time() ) ), 4, 'day' );
		$date_stamp = TTDate::getDate( 'DATE', $date_epoch );

		$dd->createPunchPair( $this->user_id,
							  strtotime( $date_stamp . ' 8:00AM' ),
							  strtotime( $date_stamp . ' 12:00PM' ),
							  [
									  'in_type_id'    => 10,
									  'out_type_id'   => 10,
									  'branch_id'     => $this->branch_ids[1],
									  'department_id' => 0,
									  'job_id'        => 0,
									  'job_item_id'   => 0,
									  'punch_tag_id'  => []
							  ],
							  true
		);

		$udt_arr = $this->getUserDateTotalArray( $date_epoch, $date_epoch );
		//Total Time
		$this->assertEquals( 5, $udt_arr[$date_epoch][0]['object_type_id'] );                                                                                                                                                                                                                                                                          //5=System Total
		$this->assertEquals( $udt_arr[$date_epoch][0]['pay_code_id'], TTUUID::getZeroID() );
		$this->assertEquals( $udt_arr[$date_epoch][0]['total_time'], ( 4 * 3600 ) );
		$this->assertEquals( 0, $udt_arr[$date_epoch][0]['hourly_rate'] );
		$this->assertEquals( 0, $udt_arr[$date_epoch][0]['hourly_rate_with_burden'] );

		//Regular Time
		$this->assertEquals( 20, $udt_arr[$date_epoch][1]['object_type_id'] );                                                                                                                                                                                                                                                                         //Regular Time
		$this->assertEquals( $udt_arr[$date_epoch][1]['pay_code_id'], $this->policy_ids['pay_code'][100] );                                                                                                                                                                                                                                            //Regular Time
		$this->assertEquals( $udt_arr[$date_epoch][1]['total_time'], ( 4 * 3600 ) );
		$this->assertEquals( $udt_arr[$date_epoch][1]['hourly_rate'], 21.50 );
		$this->assertEquals( $udt_arr[$date_epoch][1]['hourly_rate_with_burden'], ( 21.50 * 1.135 ) );

		//Make sure no other hours
		$this->assertCount( 2, $udt_arr[$date_epoch] );


		//
		//Day of Week: 6
		//
		$date_epoch = TTDate::incrementDate( TTDate::getMiddleDayEpoch( TTDate::getBeginWeekEpoch( time() ) ), 5, 'day' );
		$date_stamp = TTDate::getDate( 'DATE', $date_epoch );

		$dd->createPunchPair( $this->user_id,
							  strtotime( $date_stamp . ' 8:00AM' ),
							  strtotime( $date_stamp . ' 4:00PM' ),
							  [
									  'in_type_id'    => 10,
									  'out_type_id'   => 10,
									  'branch_id'     => $this->branch_ids[1],
									  'department_id' => 0,
									  'job_id'        => 0,
									  'job_item_id'   => 0,
									  'punch_tag_id'  => []
							  ],
							  true
		);

		$udt_arr = $this->getUserDateTotalArray( $date_epoch, $date_epoch );
		//Total Time
		$this->assertEquals( 5, $udt_arr[$date_epoch][0]['object_type_id'] );                                                                                                                                                                                                                                                                          //5=System Total
		$this->assertEquals( $udt_arr[$date_epoch][0]['pay_code_id'], TTUUID::getZeroID() );
		$this->assertEquals( $udt_arr[$date_epoch][0]['total_time'], ( 8 * 3600 ) );
		$this->assertEquals( 0, $udt_arr[$date_epoch][0]['hourly_rate'] );
		$this->assertEquals( 0, $udt_arr[$date_epoch][0]['hourly_rate_with_burden'] );

		//Regular Time
		$this->assertEquals( 20, $udt_arr[$date_epoch][1]['object_type_id'] );                                                                                                                                                                                                                                                                         //Regular Time
		$this->assertEquals( $udt_arr[$date_epoch][1]['pay_code_id'], $this->policy_ids['pay_code'][100] );                                                                                                                                                                                                                                            //Regular Time
		$this->assertEquals( $udt_arr[$date_epoch][1]['total_time'], ( 8 * 3600 ) );
		$this->assertEquals( $udt_arr[$date_epoch][1]['hourly_rate'], 21.50 );
		$this->assertEquals( $udt_arr[$date_epoch][1]['hourly_rate_with_burden'], ( 21.50 * 1.135 ) );

		//Make sure no other hours
		$this->assertCount( 2, $udt_arr[$date_epoch] );

		//
		//Day of Week: 7
		//
		$date_epoch = TTDate::incrementDate( TTDate::getMiddleDayEpoch( TTDate::getBeginWeekEpoch( time() ) ), 6, 'day' );
		$date_stamp = TTDate::getDate( 'DATE', $date_epoch );

		$absence_id = $dd->createAbsence( $this->user_id, $date_epoch, ( 8 * 3600 ), $this->policy_ids['absence'][10] );

		$udt_arr = $this->getUserDateTotalArray( $date_epoch, $date_epoch );
		//print_r($udt_arr);

		//Total Time
		$this->assertEquals( 5, $udt_arr[$date_epoch][0]['object_type_id'] );                                                                                                                                                                                                                                                                          //5=System Total
		$this->assertEquals( $udt_arr[$date_epoch][0]['pay_code_id'], TTUUID::getZeroID() );
		$this->assertEquals( $udt_arr[$date_epoch][0]['total_time'], ( 8 * 3600 ) );
		$this->assertEquals( 0, $udt_arr[$date_epoch][0]['hourly_rate'] );
		$this->assertEquals( 0, $udt_arr[$date_epoch][0]['hourly_rate_with_burden'] );

		//Absence
		$this->assertEquals( 25, $udt_arr[$date_epoch][1]['object_type_id'] );                                                                                                                                                                                                                                                                         //Regular Time
		$this->assertEquals( $udt_arr[$date_epoch][1]['pay_code_id'], $this->policy_ids['pay_code'][900] );                                                                                                                                                                                                                                            //Regular Time
		$this->assertEquals( $udt_arr[$date_epoch][1]['total_time'], ( 8 * 3600 ) );
		$this->assertEquals( $udt_arr[$date_epoch][1]['hourly_rate'], 17.20 );
		$this->assertEquals( $udt_arr[$date_epoch][1]['hourly_rate_with_burden'], ( 17.20 * 1.135 ) );

		//Make sure no other hours
		$this->assertCount( 2, $udt_arr[$date_epoch] );

		return true;
	}

//	function testUserFactoryCache() {
//		//Make sure that UserFactory caches are cleared when saving a user record.
//		//This is here since the setup/tearDown functions create user records already.
//		// However this won't work when run in parallel. :(
//		$ulf = new UserListFactory();
//
//		$ulf->removeCache( $this->user_id ); //Make sure we start with the cache cleared.
//		$this->assertFalse( $ulf->getCache( $this->user_id ) ); //Confirm its cleared.
//
//		$ulf->getById( $this->user_id );
//		if ( $ulf->getRecordCount() > 0 ) {
//			$user_obj = $ulf->getCurrent();
//			$old_data = $user_obj->data;
//
//			$this->assertNotFalse( $user_obj->getCache( $this->user_id ) );
//
//			$this->assertEquals( $user_obj->getNote(), FALSE );
//			$user_obj->setNote('Test1');
//			if ( $user_obj->isValid() ) {
//				$user_obj->Save( FALSE );
//
//				$this->assertFalse( $user_obj->getCache( $this->user_id ) );
//
//				//Cache should be cleared at this point
//				$ulf_b = new UserListFactory();
//				$ulf_b->getById( $this->user_id );
//				if ( $ulf_b->getRecordCount() > 0 ) {
//				    $user_obj_b = $ulf_b->getCurrent();
//					$new_data = $user_obj_b->data;
//
//					$this->assertNotEquals( $old_data, $new_data ); //Updated Date and NOTE fields would have changed.
//					$this->assertEquals( $user_obj->getNote(), 'Test1' );
//					$this->assertEquals( $user_obj->getNote(), $user_obj_b->getNote() );
//				} else {
//					$this->assertTrue( FALSE );
//				}
//
//			} else {
//				$this->assertTrue( FALSE );
//			}
//		} else {
//			$this->assertTrue( FALSE );
//		}
//	}
}

?>