/** * @param Rate $rate * @param null $datePaxData * @return null|DatePaxData */ public function setupDatePaxData(Rate $rate, $datePaxData = null) { $newDatePax = false; if ($datePaxData === null) { $newDatePax = true; } if (!$datePaxData) { $datePaxData = new DatePaxData(); } else { $datePaxData = clone $datePaxData; } $initialLength = $datePaxData->getNbNights(); $minLength = max(1, $rate->getNbNightsMin()); $newStartdate = new \DateTime(sprintf('+ %s days', $rate->getRestriction())); if ($rate->isEarlyBooking() && $rate->getRestriction() && ($newDatePax || $datePaxData->minDate < $newStartdate)) { $datePaxData->minDate = $newStartdate; } $startingDate = clone $datePaxData->startingDate; $minDate = clone $datePaxData->minDate; if (($excludedDays = $rate->getExcludedArrivalDays()) && in_array($minDate->format('w'), $excludedDays)) { do { $minDate->add(new \DateInterval('P1D')); } while (in_array($minDate->format('w'), $excludedDays)); } $datePaxData->minDate = $minDate; if (!$minDate) { $datePaxData->minDate = $minDate = new \DateTime(); } if ($datePaxData->startingDate < $datePaxData->minDate) { $datePaxData->startingDate = $datePaxData->minDate; } /** @var \DateTime $endDate */ if ($startingDate < $minDate) { $endDate = clone $minDate; } else { $endDate = clone $startingDate; } $datePaxData->endingDate = $endDate->add(new \DateInterval(sprintf('P%sD', max($initialLength, $minLength)))); return $datePaxData; }