/**
  * Get json routing information for feasibility, for example:
  * /service/ride/repeatedFeasible?fromDate=01.06.2014&toDate=01.07.2025
  *      &weekday=1&time=12:23&direction=1&duration=23&additionalTime=2
  *
  * @Route("/ride/repeatedFeasible", name="tixiapp_service_ride_repeated_feasible")
  * @Method({"GET"})
  * @param Request $request
  * @return \Symfony\Component\HttpFoundation\JsonResponse
  */
 public function getRepeatedFeasibilityAction(Request $request)
 {
     /**@var $rideManagement RideManagement */
     $rideManagement = $this->container->get('tixi_app.ridemanagement');
     $fromDateStr = $request->get('fromDate');
     $toDateStr = $request->get('toDate');
     $timeStr = $request->get('time');
     $dayTime = \DateTime::createFromFormat('d.m.Y H:i', $fromDateStr . ' ' . $timeStr);
     if ($toDateStr !== '') {
         $toDate = \DateTime::createFromFormat('d.m.Y', $toDateStr);
     } else {
         $toDate = DateTimeService::getMaxDateTime();
     }
     if (!$dayTime) {
         $response = new JsonResponse();
         $response->setData(array('status' => '-1'));
         return $response;
     }
     $weekday = $request->get('weekday');
     $direction = $request->get('direction');
     $duration = $request->get('duration');
     $additionalTime = $request->get('additionalTime');
     try {
         $isFeasible = $rideManagement->checkRepeatedFeasibility($dayTime, $toDate, $weekday, $direction, $duration, $additionalTime);
     } catch (\Exception $e) {
         $response = new JsonResponse();
         $response->setData(array('status' => '-1'));
         return $response;
     }
     $response = new JsonResponse();
     $response->setData(array('status' => '0', 'isFeasible' => $isFeasible));
     return $response;
 }
 /**
  * @param string $subject
  * @param \DateTime $anchorDate
  * @param string $frequency
  * @param boolean $withHolidays
  * @param \DateTime $endingDate
  * @param string $memo
  * @return RepeatedDrivingAssertionPlan
  */
 public static function registerRepeatedAssertionPlan($subject, \DateTime $anchorDate, $frequency, $withHolidays, \DateTime $endingDate = null, $memo = null)
 {
     $endingDate = null !== $endingDate ? $endingDate : DateTimeService::getMaxDateTime();
     $assertion = new RepeatedDrivingAssertionPlan();
     $assertion->setSubject($subject);
     $assertion->setMemo($memo);
     $assertion->setAnchorDate($anchorDate);
     $assertion->setEndingDate($endingDate);
     $assertion->setFrequency($frequency);
     $assertion->setWithHolidays($withHolidays);
     return $assertion;
 }
 /** -------------------------
  * Get one flat Driving Assertion Plan (one dimensional array)
  *
  * @param RepeatedDrivingAssertionPlan $assertionPlan
  * @param RepeatedDrivingAssertion[] $repeatedAssertions
  * @return DrivingAssertionManagementDTO[]
  * @throws \Exception
  */
 protected function flatAssertionPlan($assertionPlan, $repeatedAssertions)
 {
     $asserts = array();
     $frequency = $assertionPlan->getFrequency();
     if ($frequency == 'weekly') {
         /** @var  RepeatedWeeklyDrivingAssertion $weeklyAssertion */
         foreach ($repeatedAssertions as $weeklyAssertion) {
             /** @var ShiftType $shiftType */
             foreach ($weeklyAssertion->getShiftTypes() as $shiftType) {
                 $dto = new DrivingAssertionManagementDTO();
                 $dto->planId = $assertionPlan->getId();
                 $dto->anchordate = $assertionPlan->getAnchorDate();
                 $dto->enddate = !is_null($assertionPlan->getEndingDate()) ? $assertionPlan->getEndingDate() : DateTimeService::getMaxDateTime();
                 $dto->weekdayAsText = WeekdayService::$numericToWeekdayConverter[$weeklyAssertion->getWeekday()];
                 $dto->shiftTypeName = $shiftType->getName();
                 $asserts[] = $dto;
             }
         }
     } elseif ($frequency == 'monthly') {
         /** @var  RepeatedMonthlyDrivingAssertion $monthlyAssertion */
         foreach ($repeatedAssertions as $monthlyAssertion) {
             /** @var ShiftType $shiftType */
             foreach ($monthlyAssertion->getShiftTypes() as $shiftType) {
                 $dto = new DrivingAssertionManagementDTO();
                 $dto->planId = $assertionPlan->getId();
                 $dto->anchordate = $assertionPlan->getAnchorDate();
                 $dto->enddate = !is_null($assertionPlan->getEndingDate()) ? $assertionPlan->getEndingDate() : DateTimeService::getMaxDateTime();
                 $dto->weekdayAsText = $monthlyAssertion->getWeekdayAsText();
                 $dto->shiftTypeName = $shiftType->getName();
                 $asserts[] = $dto;
             }
         }
     } else {
         throw new \Exception("Driving Assertion Plan error, " . "illegal frequency({$frequency}) encountered!");
     }
     // exit
     return $asserts;
 }
 /**
  * @param RepeatedDrivingAssertionPlan $assertionPlan
  * @return RepeatedDrivingAssertionEmbeddedListDTO
  */
 protected function assertionPlanToEmbeddedListDTO(RepeatedDrivingAssertionPlan $assertionPlan)
 {
     $dto = new RepeatedDrivingAssertionEmbeddedListDTO();
     $dto->id = $assertionPlan->getId();
     $dto->subject = $assertionPlan->getSubject();
     $dto->anchorDate = $assertionPlan->getAnchorDate()->format('d.m.Y');
     $dto->endDate = $assertionPlan->getEndingDate() != DateTimeService::getMaxDateTime() ? $assertionPlan->getEndingDate()->format('d.m.Y') : 'repeateddrivingassertion.validtillrecalled';
     $dto->frequency = $assertionPlan->getFrequency();
     return $dto;
 }
 /**
  * @param RepeatedDrivingOrderPlan $orderPlan
  * @return RepeatedDrivingOrderEmbeddedListDTO
  */
 public function orderPlanToEmbeddedListDTOs(RepeatedDrivingOrderPlan $orderPlan)
 {
     $dto = new RepeatedDrivingOrderEmbeddedListDTO();
     $dto->id = $orderPlan->getId();
     $dto->isDeleted = !$orderPlan->isActive();
     $dto->anchorDate = $orderPlan->getAnchorDate()->format('d.m.Y');
     $dto->endDate = $orderPlan->getEndingDate() != DateTimeService::getMaxDateTime() ? $orderPlan->getEndingDate()->format('d.m.Y') : 'repeateddrivingorder.validtillrecalled';
     /** @var Passenger $passenger */
     $passenger = $orderPlan->getPassenger();
     $dto->passengerId = $passenger->getId();
     $repeatedDrivingOrders = $orderPlan->getRepeatedDrivingOrders();
     /** @var RepeatedDrivingOrder $repeatedDrivingOrder */
     foreach ($repeatedDrivingOrders as $repeatedDrivingOrder) {
         if ($repeatedDrivingOrder->getDirection() == RepeatedDrivingOrder::OUTWARD_DIRECTION) {
             $dto->weekDay = $this->convertWeekDay($repeatedDrivingOrder->getWeekday());
             $dto->outwardTime = $this->dateTimeService->convertToLocalTimeString($repeatedDrivingOrder->getPickUpTime());
         } else {
             $dto->returnTime = $this->dateTimeService->convertToLocalTimeString($repeatedDrivingOrder->getPickUpTime());
         }
     }
     return $dto;
 }
 /**
  * @param \DateTime $anchorDate
  * @param null $withHolidays
  * @param null $companion
  * @param \DateTime $endingDate
  * @param null $memo
  * @param null $additionalTime
  * @return RepeatedDrivingOrderPlan
  */
 public static function registerRepeatedDrivingOrderPlan(\DateTime $anchorDate, $withHolidays = null, $companion = null, \DateTime $endingDate = null, $memo = null, $additionalTime = null)
 {
     $correctedWithHolidays = null !== $withHolidays ? $withHolidays : false;
     $correctedCompanion = null !== $companion ? $companion : 0;
     $correctedAdditionalTime = null !== $additionalTime ? $additionalTime : 0;
     $correctedEndingDate = $endingDate !== null ? $endingDate : DateTimeService::getMaxDateTime();
     $correctedMemo = $memo !== null ? $memo : '';
     $rdPlan = new RepeatedDrivingOrderPlan();
     $rdPlan->setAnchorDate($anchorDate);
     $rdPlan->setEndingDate($correctedEndingDate);
     $rdPlan->setWithHolidays($correctedWithHolidays);
     $rdPlan->setCompanion($correctedCompanion);
     $rdPlan->setMemo($correctedMemo);
     $rdPlan->setAdditionalTime($correctedAdditionalTime);
     return $rdPlan;
 }