/** -------------------------
  * Create driving assertions for a working day
  * Called for a new repeated driving assertion plan or new working day
  *
  * @param RepeatedDrivingAssertionPlan$repeatedDrivingAssertionPlan
  * @param WorkingDay $workingDay
  * @param array $errors
  */
 protected function handleRepeatedDrivingAssertionsForWorkingDay($repeatedDrivingAssertionPlan, $workingDay, &$errors)
 {
     /** @var DrivingAssertionRepository $drivingAssertionRepository */
     $drivingAssertionRepository = $this->container->get('drivingassertion_repository');
     $driver = $repeatedDrivingAssertionPlan->getDriver();
     $shifts = $workingDay->getShifts();
     /** @var Shift $shift */
     foreach ($shifts as $shift) {
         if ($this->matching($shift, $repeatedDrivingAssertionPlan)) {
             if (!$driver->hasDrivingAssertionForShift($shift)) {
                 $drivingAssertion = DrivingAssertion::registerDrivingAssertion($driver, $shift);
                 $drivingAssertion->assignedRepeatedDrivingAssertionPlan($repeatedDrivingAssertionPlan);
                 $repeatedDrivingAssertionPlan->assignDrivingAssertion($drivingAssertion);
                 $drivingAssertionRepository->store($drivingAssertion);
             } else {
                 $daPlanId = $this->getPlanIdFor($driver, $shift);
                 if (is_null($repeatedDrivingAssertionPlan->getId()) or $daPlanId != $repeatedDrivingAssertionPlan->getId()) {
                     $errors[] = $this->translate('repeateddrivingassertion.error.occupied') . " " . $workingDay->getDate()->format('d.m.Y') . " " . $this->translate($workingDay->getWeekDayAsString()) . " " . $shift->getShiftType()->getName();
                 }
             }
         }
     }
 }
 /**
  * Set all pool DTOs for the current date
  *
  * @param DailyPlanEditDTO $dto
  * @param WorkingDay $workingDay
  * @param string $errorMessage
  * @return array DailyPlanEditPoolDTO[]
  */
 private function setPoolDTOs(DailyPlanEditDTO $dto, WorkingDay $workingDay, &$errorMessage)
 {
     $dto->pools = array();
     $tr = $this->container->get('translator');
     /** @var Shift $shift */
     foreach ($workingDay->getShifts() as $shift) {
         /** @var DrivingPool $drivingPool */
         foreach ($shift->getDrivingPools() as $drivingPool) {
             $poolDTO = new DailyPlanEditPoolDTO();
             $errors = array();
             $poolDTO->hasErrorMessage = self::NO;
             $poolDTO->poolId = $drivingPool->getId();
             $vehicle = $drivingPool->getVehicle();
             if (null === $vehicle) {
                 $errorMessage .= "<p>" . $tr->trans('dailyplan.error.no.vehicle') . " (" . $shift->getShiftType()->getName() . ")" . "</p>";
                 continue;
                 // show available vehicles only
             }
             $poolDTO->vehicleId = $vehicle->getId();
             /** @var Driver $driver */
             $driver = $drivingPool->getDriver();
             $poolDTO->title = $shift->getShiftType()->getName() . ', ' . $tr->trans('dailyplan.field.poolId') . $drivingPool->getId() . '&#013;' . $tr->trans('dailyplan.field.driver') . ': ';
             if (null !== $driver) {
                 $poolDTO->driverId = $driver->getId();
                 $poolDTO->title .= $driver->getNameStringForContact();
             } else {
                 // no driver assigned
                 $poolDTO->driverId = 0;
                 $poolDTO->title .= $tr->trans('dailyplan.warning.no.driver');
                 if ($drivingPool->hasAssociatedDrivingMissions()) {
                     $errors[] = $tr->trans('dailyplan.error.no.driver');
                 }
             }
             if ($shift->getManuallyEdited()) {
                 // manual edited shift may contain errors ...
                 $poolDTO->hasErrorMessage = self::YES;
                 $poolDTO->title .= '&#013;' . $tr->trans('dailyplan.error.beware') . ":" . '&#013;' . $tr->trans('dailyplam.error.manual.shift');
             }
             $start = $drivingPool->getShift()->getStart();
             $poolDTO->shiftBeginMin = $this->dateTimeService->getMinutesOfDay($this->dateTimeService->convertToLocalDateTime($start));
             $end = $drivingPool->getShift()->getEnd();
             $poolDTO->shiftEndMin = $this->dateTimeService->getMinutesOfDay($this->dateTimeService->convertToLocalDateTime($end));
             $poolDTO->isManual = self::NO;
             // todo shared-ride code here ...
             if (count($errors) > 0) {
                 $poolDTO->hasErrorMessage = self::YES;
                 $poolDTO->title = $this->setErrorMessagesInTitle($errors, $poolDTO->title);
             }
             $dto->pools[] = $poolDTO;
         }
     }
 }