/** -------------------------
  * Compare one Shift with one Repeated Driving Assertion Plan
  *
  * Returns true when the Shift matches the Repeated Driving Assertion Plan:
  * same ShiftType, weekday / weekdayAsText same as WorkingDay.weekday and
  * WorkingDay.date between anchorDate and endingDate.
  *
  * @param Shift $shift
  * @param RepeatedDrivingAssertionPlan $repeatedDrivingAssertionPlan
  * @return mixed
  */
 protected function matching($shift, $repeatedDrivingAssertionPlan)
 {
     /**@var $repeatedDrivingAssertion RepeatedDrivingAssertion */
     foreach ($repeatedDrivingAssertionPlan->getRepeatedDrivingAssertions() as $repeatedDrivingAssertion) {
         if ($repeatedDrivingAssertion->matching($shift)) {
             return true;
         }
     }
     return false;
 }
 /**
  * @param RepeatedDrivingAssertionPlan $assertionPlan
  * @return RepeatedDrivingAssertionRegisterDTO
  */
 public function toRepeatedRegisterDTO(RepeatedDrivingAssertionPlan $assertionPlan)
 {
     $assertionDTO = new RepeatedDrivingAssertionRegisterDTO();
     $assertionDTO->id = $assertionPlan->getId();
     $assertionDTO->subject = $assertionPlan->getSubject();
     $assertionDTO->memo = $assertionPlan->getMemo();
     $assertionDTO->anchorDate = $assertionPlan->getAnchorDate();
     $assertionDTO->endDate = $assertionPlan->getEndingDate() != DateTimeService::getMaxDateTime() ? $assertionPlan->getEndingDate() : null;
     $assertionDTO->frequency = $assertionPlan->getFrequency();
     $assertionDTO->withHolidays = $assertionPlan->getWithHolidays();
     if ($assertionDTO->frequency === 'weekly') {
         /** @var RepeatedWeeklyDrivingAssertion $weeklyAssertion */
         foreach ($assertionPlan->getRepeatedDrivingAssertions() as $weeklyAssertion) {
             $assertionDTO->weeklyDaysSelector[] = WeekdayService::$numericToWeekdayConverter[$weeklyAssertion->getWeekday()];
             $assertionDTO->weeklyShiftSelections->add($this->createShiftSelectionDTO('day', WeekdayService::$numericToWeekdayConverter[$weeklyAssertion->getWeekday()], $weeklyAssertion->getShiftTypes()->toArray()));
         }
     } else {
         if ($assertionDTO->frequency === 'monthly') {
             /** @var RepeatedMonthlyDrivingAssertion $monthlyAssertion */
             foreach ($assertionPlan->getRepeatedDrivingAssertions() as $monthlyAssertion) {
                 if ($monthlyAssertion->getRelativeWeekAsText() === 'first') {
                     $assertionDTO->monthlyFirstWeeklySelector[] = $monthlyAssertion->getWeekdayAsText();
                 } else {
                     if ($monthlyAssertion->getRelativeWeekAsText() === 'second') {
                         $assertionDTO->monthlySecondWeeklySelector[] = $monthlyAssertion->getWeekdayAsText();
                     } else {
                         if ($monthlyAssertion->getRelativeWeekAsText() === 'third') {
                             $assertionDTO->monthlyThirdWeeklySelector[] = $monthlyAssertion->getWeekdayAsText();
                         } else {
                             if ($monthlyAssertion->getRelativeWeekAsText() === 'fourth') {
                                 $assertionDTO->monthlyFourthWeeklySelector[] = $monthlyAssertion->getWeekdayAsText();
                             } else {
                                 if ($monthlyAssertion->getRelativeWeekAsText() === 'last') {
                                     $assertionDTO->monthlyLastWeeklySelector[] = $monthlyAssertion->getWeekdayAsText();
                                 }
                             }
                         }
                     }
                 }
                 $assertionDTO->monthlyShiftSelections->add($this->createShiftSelectionDTO($monthlyAssertion->getRelativeWeekAsText(), $monthlyAssertion->getWeekdayAsText(), $monthlyAssertion->getShiftTypes()->toArray()));
             }
         } else {
             // todo frequency === 'unique'
         }
     }
     return $assertionDTO;
 }