/** -------------------------
  * Assign dto->drivingAssertions to dto->shifts if empty driving pools are
  * available. Otherwise do nothing.
  *
  * @param DispositionResourcesDTO $dto
  * @return mixed
  * @throws \Exception
  */
 public function assignAssertionsToDrivingPools(DispositionResourcesDTO $dto)
 {
     if ($dto->countShifts() !== $dto->countDrivingAssertions()) {
         throw new \Exception('assignAssertionsToDrivingPools: ' . 'Unbalanced arrays: shifts(' . $dto->countShifts() . '), ' . 'assertions(' . $dto->countDrivingAssertions() . ')');
     }
     $success = false;
     /** @var Shift $shift */
     foreach ($dto->getShifts() as $idx => $shift) {
         /** @var DrivingAssertion $drivingAssertion */
         $drivingAssertion = $dto->getDrivingAssertions()->get($idx);
         /** @var DrivingPool $drivingPool */
         foreach ($shift->getDrivingPools() as $drivingPool) {
             if (!$drivingPool->hasAssociatedDriver()) {
                 /* assign driving assertion to empty driving pool */
                 $drivingAssertion->assignDrivingPool($drivingPool);
                 $success = true;
                 break;
                 // assertion-pool is a one to one association
             }
         }
     }
     return $success;
 }
 /**
  * If available, find one random vehicle which is compatible to Driver
  * and which is available in all defined shifts..
  *
  * @param DispositionResourcesDTO $dto
  * @return Vehicle|null
  */
 protected function findAvailableRandomVehicle(DispositionResourcesDTO $dto)
 {
     /** @var Vehicle $vehicle */
     foreach ($this->vehicles as $vehicle) {
         if ($vehicle->getCompanyOwned()) {
             if ($dto->getDriver()->isCompatibleWithVehicleCategory($vehicle->getCategory())) {
                 $count = 0;
                 /** @var Shift $shift */
                 foreach ($dto->getShifts() as $shift) {
                     if (!$this->resources[$shift->getId()][$vehicle->getId()]) {
                         $count += 1;
                         // resource not assigned (false)
                     }
                 }
                 if ($count == $dto->countShifts()) {
                     return $vehicle;
                 }
             }
         }
     }
     return null;
 }