/** * @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() . '
' : ''; $depot = $vehicle->getDepot(); $vehicleDto->vehicleTitle .= null !== $depot ? $tr->trans('dailyplan.field.depot') . ': ' . $depot->getAddress()->toString() . '
' : ''; $parking = $vehicle->getParking(); $vehicleDto->vehicleTitle .= null !== $parking ? $tr->trans('dailyplan.field.parking') . ': ' . $parking : ''; if ($vehicleDto->inService === 'yes') { $vehicleDto->vehicleTitle .= '
' . $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(); }