/**
  * @param WorkingDay $workingDay
  * @return bool
  */
 public function checkIfWorkingDayIsBankHoliday(WorkingDay $workingDay)
 {
     $day = $workingDay->getDate();
     $qb = parent::createQueryBuilder('e');
     $qb->where('e.date = :day')->andWhere('e.isDeleted = 0')->setParameter('day', $day->format('Y-m-d'));
     if ($qb->getQuery()->getResult()) {
         return true;
     } else {
         return false;
     }
 }
 /** -------------------------
  * Create all Driving Assertions for a working day in new production plan
  * Errors are displayed in the controller
  *
  * @param WorkingDay $workingDay
  * @return array with error messages
  */
 public function createAllDrivingAssertionsForNewWorkingDay(WorkingDay $workingDay)
 {
     $errors = array();
     /** @var RepeatedDrivingAssertionPlanRepository $repeatedDrivingAssertionPlanRepository */
     $repeatedDrivingAssertionPlanRepository = $this->container->get('repeateddrivingassertionplan_repository');
     $repeatedPlansInRange = $repeatedDrivingAssertionPlanRepository->findPlanForDate($workingDay->getDate());
     /** @var RepeatedDrivingAssertionPlan $plan */
     foreach ($repeatedPlansInRange as $plan) {
         if ($plan->getDriver()->isActive()) {
             $this->handleRepeatedDrivingAssertionsForWorkingDay($plan, $workingDay, $errors);
         }
     }
     return $errors;
 }
 /**
  * @param WorkingDay $workingDay
  * @param $workingMonthId
  * @return MonthlyPlanEditDTO
  */
 public function workingDayToEditDTO(WorkingDay $workingDay, $workingMonthId)
 {
     $dto = new MonthlyPlanEditDTO();
     $dto->workingMonthId = $workingMonthId;
     $dto->workingDayId = $workingDay->getId();
     $dto->workingMonthDateString = $workingDay->getWorkingMonth()->getDateString();
     $dto->workingDayWeekdayString = $workingDay->getWeekDayAsString();
     $dto->workingDayDateString = $workingDay->getDateString();
     $dto->workingDayDate = $workingDay->getDate();
     $today = new \DateTime();
     $today->setTime(0, 0, 0);
     $dto->editMode = $workingDay->getDate() < $today ? 'show' : 'edit';
     $vehicleRepo = $this->container->get('vehicle_repository');
     $vehicles = $vehicleRepo->findAllNotDeleted();
     $dto->allVehicles = $this->workingDayToEditVehiclesDTO($vehicles, $workingDay->getDate());
     $shifts = $workingDay->getShiftsOrderedByStartTime();
     /** @var Shift $shift */
     foreach ($shifts as $shift) {
         $shiftDTO = new MonthlyPlanEditShiftDTO();
         $shiftDTO->shiftId = $shift->getId();
         $shiftDTO->shiftDisplayName = $shift->getShiftType()->getName();
         $shiftDTO->shiftTitle = $this->getShiftTitle($shift->getStatusString(), $shift->getManuallyEdited());
         $shiftDTO->iconColor = $this->getMonthlyPlanGetShiftDTO($shift)->iconColor;
         $pools = $shift->getDrivingPoolsAsArray();
         foreach ($pools as $pool) {
             $shiftDTO->assignedPools[] = $this->getAssignedPools($pool, $dto->allVehicles);
         }
         $shiftDTO->spareVehicles = $this->getSpareVehicles($shift, $dto->allVehicles);
         $shiftDTO->spareDrivers = $this->getSpareDrivers($shift);
         $dto->shifts[] = $shiftDTO;
     }
     return $dto;
 }
 /**
  * Set the active vehicle DTOs for the daily plan view
  *
  * @param \Tixi\ApiBundle\Interfaces\Dispo\DailyView\DailyPlanEditDTO $dto
  * @param WorkingDay $workingDay
  * @param mixed $drivingMissions DrivingMission[]
  */
 private function setVehicleDTOs(DailyPlanEditDTO $dto, WorkingDay $workingDay, $drivingMissions)
 {
     $tr = $this->container->get('translator');
     /** @var VehicleRepository $vehicleRepository */
     $vehicleRepository = $this->container->get('vehicle_repository');
     $vehicles = $vehicleRepository->fetchVehiclesAndChildren();
     /** @var Vehicle $vehicle */
     foreach ($vehicles as $vehicle) {
         $vehicleDto = new DailyPlanEditVehicleDTO();
         $vehicleDto->hasErrorMessage = self::NO;
         $errors = array();
         $vehicleDto->vehicleId = $vehicle->getId();
         $vehicleDto->vehicleName = $vehicle->getName();
         $supervisor = $vehicle->getSupervisor();
         $vehicleDto->inService = $this->inService($vehicle, $workingDay->getDate());
         $vehicleDto->vehicleTitle = null !== $supervisor ? $tr->trans('dailyplan.field.supervisor') . ': ' . $supervisor->getNameStringForContact() . '&#013;' : '';
         $depot = $vehicle->getDepot();
         $vehicleDto->vehicleTitle .= null !== $depot ? $tr->trans('dailyplan.field.depot') . ': ' . $depot->getAddress()->toString() . '&#013;' : '';
         $parking = $vehicle->getParking();
         $vehicleDto->vehicleTitle .= null !== $parking ? $tr->trans('dailyplan.field.parking') . ': ' . $parking : '';
         if ($vehicleDto->inService === 'yes') {
             $vehicleDto->vehicleTitle .= '&#013;' . $tr->trans('dailyplan.warning.in.service');
         }
         if (count($errors) > 0) {
             $vehicleDto->hasErrorMessage = self::YES;
             $vehicleDto->vehicleTitle = $this->setErrorMessagesInTitle($errors, $vehicleDto->vehicleTitle);
         }
         // add vehicle to dto (conditionally)
         if ($vehicle->getCompanyOwned()) {
             // add all company owned vehicles
             $dto->vehicles[$vehicle->getId()] = $vehicleDto;
         } else {
             // add vehicle only if it's assigned to a driving pool
             /** @var Shift $shift */
             foreach ($workingDay->getShifts() as $shift) {
                 /** @var DrivingPool $drivingPool */
                 foreach ($shift->getDrivingPoolsAsArray() as $drivingPool) {
                     $vehicleInPool = $drivingPool->getVehicle();
                     if (null !== $vehicleInPool) {
                         if ($vehicleInPool->getId() == $vehicle->getId()) {
                             $dto->vehicles[$vehicle->getId()] = $vehicleDto;
                             break 2;
                         }
                     }
                 }
             }
         }
     }
 }
 /**
  * @param WorkingDay $workingDay
  * @param mixed $status
  * @return mixed|void
  */
 public function handleNewWorkingDay(WorkingDay $workingDay, $status)
 {
     /** @var RepeatedDrivingOrderPlanRepository $repeatedDrivingOrderPlanRepository */
     $repeatedDrivingOrderPlanRepository = $this->container->get('repeateddrivingorderplan_repository');
     $repeatedDrivingOrderPlans = $repeatedDrivingOrderPlanRepository->fetchAllForDate($workingDay->getDate());
     // matching, hydrated
     /** @var RepeatedDrivingOrderPlan $repeatedDrivingOrderPlan */
     foreach ($repeatedDrivingOrderPlans as $repeatedDrivingOrderPlan) {
         /* plan range conditions satisfied (in query) */
         /** @var RepeatedDrivingOrder $repeatedDrivingOrder */
         $repeatedDrivingOrder = $repeatedDrivingOrderPlan->getRepeatedDrivingOrdersAsArray()[0];
         if ($repeatedDrivingOrder->matching($workingDay->getDate())) {
             /* weekday condition satisfied */
             $this->handleNewRepeatedDrivingOrdersForDate($repeatedDrivingOrderPlan, $workingDay->getDate(), $status);
         }
     }
     return array();
 }
 /** ------------------------------------------------------------------------
  * Assign Vehicles for the new WorkingMonth to empty DrivingPools RANDOMLY.
  *
  * Prerequisite:
  * + DrivingAssertions for WorkingDay already exist.
  *
  * Constraints:
  * + Vehicle which are not available on the working day are not assigned.
  * + Drivers with >1 shift in the working day must not need to change vehicles.
  * + Drivers who supervise one or more vehicles shall drive one of these.
  * + Driver preferences for a vehicle type shall be honored.
  *
  * Notes:
  * + Some drivers may not be assigned due to overbooking, previous assignments,
  *   or the driver preferences or a combination of all this.
  * + The planner then needs to fix this manually.
  *
  * @param WorkingDay $workingDay with all (hydrated) child objects
  * @return array|null
  */
 public function assignVehiclesToPools(WorkingDay $workingDay)
 {
     $shifts = $workingDay->getShiftsAsArray();
     $vehicles = $this->getAvailableVehiclesForDay($workingDay->getDate());
     $vehicleManager = new DispositionManageVehicles($vehicles, $shifts);
     $vehicleManager->setContainer($this->container);
     $dtos = $vehicleManager->getAvailableDrivers();
     /** @var DispositionResourcesDTO $dto */
     foreach ($dtos as $dto) {
         if ($dto->countShifts() >= 2) {
             $vehicleManager->assignVehicleToDriverAndDrivingPools($dto, $shifts);
             /* first priority: multiple shifts */
         }
     }
     reset($dtos);
     /** @var DispositionResourcesDTO $dto */
     foreach ($dtos as $dto) {
         if ($dto->countShifts() == 1 and $dto->getDriver()->hasSupervisedVehicles()) {
             $vehicleManager->assignVehicleToDriverAndDrivingPools($dto, $shifts);
             /* second priority: supervisors */
         }
     }
     reset($dtos);
     /** @var DispositionResourcesDTO $dto */
     foreach ($dtos as $dto) {
         if ($dto->countShifts() == 1 and !$dto->getDriver()->hasSupervisedVehicles()) {
             $vehicleManager->assignVehicleToDriverAndDrivingPools($dto, $shifts);
             /* third priority: all others */
         }
     }
     $vehicleManager->assignVehicleToEmptyDrivingPools($shifts);
     return array();
 }