/** -------------------------
  * Build new driving orders derived from repeated driving order plan,
  * for a new driving order plan.
  *
  * @param RepeatedDrivingOrderPlan $drivingOrderPlan
  * @param mixed $status
  * @return mixed|void
  */
 public function handleNewRepeatedDrivingOrder(RepeatedDrivingOrderPlan $drivingOrderPlan, $status)
 {
     /** @var RepeatedDrivingOrder $repeatedDrivingOrder */
     $repeatedDrivingOrder = $drivingOrderPlan->getRepeatedDrivingOrdersAsArray()[0];
     /** @var WorkingMonthRepository $workingMonthRepository */
     $workingMonthRepository = $this->container->get('workingmonth_repository');
     $prospectiveWorkingMonths = $workingMonthRepository->findProspectiveWorkingMonths();
     /** @var WorkingMonth $workingMonth */
     foreach ($prospectiveWorkingMonths as $workingMonth) {
         $workingDays = $workingMonth->getWorkingDays();
         /** @var WorkingDay $workingDay */
         foreach ($workingDays as $workingDay) {
             if ($drivingOrderPlan->matching($workingDay->getDate())) {
                 /* plan range conditions satisfied */
                 if ($repeatedDrivingOrder->matching($workingDay->getDate())) {
                     /* weekday condition satisfied */
                     $this->handleNewRepeatedDrivingOrdersForDate($drivingOrderPlan, $workingDay->getDate(), $status);
                 }
             }
         }
     }
 }
 /**
  * @param RepeatedDrivingOrderPlan $repeatedDrivingOrderPlan
  * @return DrivingOrderRegisterDTO
  */
 public function drivingOrderPlanToRegisterDTO(RepeatedDrivingOrderPlan $repeatedDrivingOrderPlan)
 {
     $registerDTO = new DrivingOrderRegisterDTO();
     /* read repeated driving order plan */
     $registerDTO->id = $repeatedDrivingOrderPlan->getId();
     $registerDTO->anchorDate = $repeatedDrivingOrderPlan->getAnchorDate();
     $registerDTO->lookaheadaddressFrom = $this->addressAssembler->addressToAddressLookaheadDTO($repeatedDrivingOrderPlan->getRoute()->getStartAddress());
     $registerDTO->lookaheadaddressTo = $this->addressAssembler->addressToAddressLookaheadDTO($repeatedDrivingOrderPlan->getRoute()->getTargetAddress());
     $registerDTO->zoneName = $repeatedDrivingOrderPlan->getZone()->getName();
     $registerDTO->isRepeated = true;
     $registerDTO->withHolidays = $repeatedDrivingOrderPlan->getWithHolidays();
     $registerDTO->compagnion = $repeatedDrivingOrderPlan->getCompanion();
     $registerDTO->memo = $repeatedDrivingOrderPlan->getMemo();
     $registerDTO->additionalTime = $repeatedDrivingOrderPlan->getAdditionalTime();
     $registerDTO->endDate = $repeatedDrivingOrderPlan->getEndingDate() != DateTimeService::getMaxDateTime() ? $repeatedDrivingOrderPlan->getEndingDate() : null;
     /* read repeated driving orders */
     $outwardTime = null;
     $returnTime = null;
     $repeatedOrders = $repeatedDrivingOrderPlan->getRepeatedDrivingOrdersAsArray();
     /** @var RepeatedDrivingOrder $repeatedOrder*/
     foreach ($repeatedOrders as $repeatedOrder) {
         /* normally there should be one or two rows in this array */
         $registerDTO->weekday = $repeatedOrder->getWeekday();
         $direction = $repeatedOrder->getDirection();
         if ($direction === RepeatedDrivingOrder::OUTWARD_DIRECTION) {
             $outwardTime = $repeatedOrder->getPickUpTime();
         } elseif ($direction === RepeatedDrivingOrder::RETURN_DIRECTION) {
             $returnTime = $repeatedOrder->getPickUpTime();
         }
         $registerDTO->repeatedOrderTime = $this->createOrUpdateOrderTimeDTO($outwardTime, $returnTime, $registerDTO->orderTime);
     }
     return $registerDTO;
 }