/** ------------------------- * 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; }