getAll( null, null, null ); $epoch = time(); foreach ( $hplf as $hp_obj ) { /** @var $hp_obj HolidayPolicyFactory */ //Get all recurring holidays $recurring_holiday_ids = $hp_obj->getRecurringHoliday(); //Must order recurring holidays to come in order based on static days, so Xmas Eve, Xmas, Boxing day are always in order so they can all be moved to nearest weekdays as a group. $rhlf = new RecurringHolidayListFactory(); $rhlf->getByIdAndCompanyId( $recurring_holiday_ids, $hp_obj->getCompany(), null, [ 'type_id' => 'asc', 'month_int' => 'asc', 'day_of_month' => 'asc' ] ); if ( $rhlf->getRecordCount() > 0 ) { Debug::Text( 'Found Recurring Holidays: '. $rhlf->getRecordCount(), __FILE__, __LINE__, __METHOD__, 10 ); foreach( $rhlf as $rh_obj ) { Debug::Text( 'Found Recurring Holiday: ' . $rh_obj->getName() .' ID: '. $rh_obj->getID(), __FILE__, __LINE__, __METHOD__, 10 ); // How many days in the future holidays are populated. Set per holiday policy by users. $offset = ( $hp_obj->getHolidayDisplayDays() * 86400 ); //Get all existing holidays that are already populated, so if two holidays occur one right after another (ie: Xmas Eve, Xmas, Boxing Day), we can adjust them accordingly. $exclude_dates = []; $hlf = TTnew( 'HolidayListFactory' ); /** @var HolidayListFactory $hlf */ $hlf->getByHolidayPolicyIdAndStartDateAndEndDate( $hp_obj->getId(), ( $epoch - 86400 ), ( $epoch + $offset ) ); if ( $hlf->getRecordCount() > 0 ) { foreach( $hlf as $h_obj ) { if ( strtolower( trim( $rh_obj->getName() ) ) != strtolower( trim( $h_obj->getName() ) ) ) { //Skip the holiday we are trying to populate so it doesn't get duplicated. $exclude_dates[] = TTDate::getBeginDayEpoch( $h_obj->getDateStamp() ); } } } unset( $hlf, $h_obj ); $next_holiday_date = $rh_obj->getNextDate( $epoch, $exclude_dates ); Debug::Text( 'Next Holiday Date: ' . TTDate::getDate( 'DATE+TIME', $next_holiday_date ) .' Excluded Dates: '. count( $exclude_dates ), __FILE__, __LINE__, __METHOD__, 10 ); if ( $next_holiday_date <= ( $epoch + $offset ) ) { Debug::Text( 'Next Holiday Date is within Time Period (offset) adding...', __FILE__, __LINE__, __METHOD__, 10 ); $hf = new HolidayFactory(); $hf->setHolidayPolicyId( $hp_obj->getId() ); $hf->setDateStamp( $next_holiday_date ); $hf->setName( $rh_obj->getName() ); if ( $hf->isValid() ) { $hf->Save(); } } else { Debug::Text( 'Next Holiday Date is NOT within Time Period (offset)!', __FILE__, __LINE__, __METHOD__, 10 ); } } } } ?>