git-svn-id: http://78.47.251.156/svn/dev/sterntours-3@3362 f459cee4-fb09-11de-96c3-f9c5f16c3c76
This commit is contained in:
valentin.wacker 2017-12-05 15:26:00 +00:00
parent f53087fde1
commit c2d6038228
7 changed files with 250 additions and 259 deletions

View file

@ -35,23 +35,31 @@ class LodgingCalendarService
setlocale(LC_TIME, "german");
$yearTurned = false;
$yearsTurned = 0;
for($m = $currentMonth; $m < ($currentMonth + $months); $m++)
{
if($m < 13)
$actualMonth = $m % 12;
if($actualMonth == 0)
{
$actualMonth = $m;
$actualCurrentYear = $currentYear;
}
else
{
$actualMonth = $m % 12;
$actualCurrentYear = $currentYear + 1;
$actualMonth = 12;
$yearTurned = true;
}
$date = getdate(mktime(0,0,0, $actualMonth, 1, $actualCurrentYear));
$actualYear = $currentYear + $yearsTurned;
if($yearTurned)
{
$yearsTurned = $yearsTurned + 1;
$yearTurned = false;
}
$date = getdate(mktime(0,0,0, $actualMonth, 1, $actualYear));
$weekDay = $weekDays[$date['wday']];
$numberDays = $this->daysInMonth($actualMonth, $actualCurrentYear);
$numberDays = $this->daysInMonth($actualMonth, $actualYear);
$data = null;
$actualStartingWeekDay = $date['wday'];
@ -105,8 +113,8 @@ class LodgingCalendarService
$calendar[] = [
'numberDays' => $numberDays,
'monthNumber' => $actualMonth,
'monthName' => utf8_encode(strftime("%B", mktime(0, 0, 0, $actualMonth, 1, $actualCurrentYear))),
'year' => $actualCurrentYear,
'monthName' => utf8_encode(strftime("%B", mktime(0, 0, 0, $actualMonth, 1, $actualYear))),
'year' => $actualYear,
'startWeekDay' => $weekDay,
'data' => $data,
'marked' => 0
@ -127,23 +135,31 @@ class LodgingCalendarService
setlocale(LC_TIME, "german");
$yearTurned = false;
$yearsTurned = 0;
for($m = $currentMonth; $m < ($currentMonth + $months); $m++)
{
if($m < 13)
$actualMonth = $m % 12;
if($actualMonth == 0)
{
$actualMonth = $m;
$actualCurrentYear = $currentYear;
}
else
{
$actualMonth = $m % 12;
$actualCurrentYear = $currentYear + 1;
$actualMonth = 12;
$yearTurned = true;
}
$date = getdate(mktime(0,0,0, $actualMonth, 1, $actualCurrentYear));
$actualYear = $currentYear + $yearsTurned;
if($yearTurned)
{
$yearsTurned = $yearsTurned + 1;
$yearTurned = false;
}
$date = getdate(mktime(0,0,0, $actualMonth, 1, $actualYear));
$weekDay = $weekDays[$date['wday']];
$numberDays = $this->daysInMonth($actualMonth, $actualCurrentYear);
$numberDays = $this->daysInMonth($actualMonth, $actualYear);
/** @var CalendarDayState[] $data */
$data = null;
@ -160,7 +176,7 @@ class LodgingCalendarService
$day->setIsReservationBegin(false);
$day->setIsReservationEnd(false);
$datetime = new \DateTime();
$datetime->setTimestamp(mktime(0,0,0, $actualMonth, $d, $actualCurrentYear));
$datetime->setTimestamp(mktime(0,0,0, $actualMonth, $d, $actualYear));
$day->setDate($datetime);
$data[] = $day;
@ -169,8 +185,8 @@ class LodgingCalendarService
$calendar[] = [
'numberDays' => $numberDays,
'monthNumber' => $actualMonth,
'monthName' => utf8_encode(strftime("%B", mktime(0, 0, 0, $actualMonth, 1, $actualCurrentYear))),
'year' => $actualCurrentYear,
'monthName' => utf8_encode(strftime("%B", mktime(0, 0, 0, $actualMonth, 1, $actualYear))),
'year' => $actualYear,
'startWeekDay' => $weekDay,
'data' => $data,
'marked' => 0
@ -193,7 +209,9 @@ class LodgingCalendarService
$curMonthDate->setDate($curMonthDate->format('Y'), $curMonthDate->format('n'), 1);
$seasonMonthDate = new \DateTime($latestSeason->getToDate()->format('Y-m-d'));
$seasonMonthDate->setDate($seasonMonthDate->format('Y'), $seasonMonthDate->format('n'), 1);
return 2 + intval($seasonMonthDate->diff($curMonthDate)->format('%m'));
$dateInterval = $seasonMonthDate->diff($curMonthDate);
$month = intval($dateInterval->format('%m')) + (intval($dateInterval->format('%y')) * 12);
return 2 + $month;
}
@ -224,12 +242,12 @@ class LodgingCalendarService
return $ret;
}
private function getMonthIndex($calendar, $month)
private function getMonthIndex($calendar, $month, $year)
{
$result = 0;
for($i = 0; $i < count($calendar); $i++)
{
if($calendar[$i]['monthNumber'] == $month)
if($calendar[$i]['monthNumber'] == $month && $calendar[$i]['year'] == $year)
{
$result = $i;
break;
@ -262,185 +280,191 @@ class LodgingCalendarService
$todayYear = $today->format('Y');
if($startMonth < $todayMonth && $startYear == $todayYear)
if ($endMonth >= $todayMonth || ($todayMonth == 12 && $endMonth >= 1 && ($todayYear < $endYear))) //($toDate > $today)
{
$startDay = 1;
$startMonth = $today->format('n');
$startYear = $today->format('Y');
}
$startCalendarIndex = $this->getMonthIndex($calendar, $startMonth);
$endCalendarIndex = $this->getMonthIndex($calendar, $endMonth);
// anfang und ende innerhalb eines monats
if($startCalendarIndex == $endCalendarIndex)
{
/** @var CalendarDayState[] $data */
$data = $calendar[$startCalendarIndex]['data'];
$calendar[$startCalendarIndex]['marked'] = 1;
$startIndex = $startDay - 1;
$endIndex = $endDay - 1;
for ($i = $startIndex; $i <= $endIndex; $i++)
if($fromDate < $today)
{
if ($reservationMode)
{
if ($i == $startIndex)
{
$data[$i]->setIsReserved(true);
$data[$i]->setIsReservationBegin(true);
$data[$i]->setReservation($reservation);
$data[$i]->setIsInSeason(true);
$data[$i]->setIsBookable(false);
}
elseif ($i == $endIndex)
{
$data[$i]->setIsReserved(true);
$data[$i]->setIsReservationEnd(true);
$data[$i]->setReservation($reservation);
$data[$i]->setIsInSeason(true);
$data[$i]->setIsBookable(false);
//$data[$i]->setIsBookable(true);
}
else
{
$data[$i]->setIsReserved(true);
$data[$i]->setReservation($reservation);
$data[$i]->setIsInSeason(true);
$data[$i]->setIsBookable(false);
}
}
else
{
$data[$i]->setIsReserved(false);
$data[$i]->setPrice($price);
$data[$i]->setIsInSeason(true);
$data[$i]->setIsBookable(false);
}
$startDay = 1;
$startMonth = $today->format('n');
$startYear = $today->format('Y');
}
$calendar[$startCalendarIndex]['data'] = $data;
}
else
{
// erster monat
/** @var CalendarDayState[] $data */
$data = $calendar[$startCalendarIndex]['data'];
// wenn sich der Kalender über mehrere Jahre zieht, könnte es hier zu Problemen kommen
$startCalendarIndex = $this->getMonthIndex($calendar, $startMonth, $startYear);
$endCalendarIndex = $this->getMonthIndex($calendar, $endMonth, $endYear);
$calendar[$startCalendarIndex]['marked'] = 1;
$startIndex = $startDay - 1;
$endIndex = count($data) - 1;
for($i = $startIndex; $i <= $endIndex; $i++)
{
if ($reservationMode)
{
if ($i == $startIndex)
{
$data[$i]->setIsReserved(true);
$data[$i]->setIsReservationBegin(true);
$data[$i]->setReservation($reservation);
$data[$i]->setIsInSeason(true);
$data[$i]->setIsBookable(false);
}
else
{
$data[$i]->setIsReserved(true);
$data[$i]->setReservation($reservation);
$data[$i]->setIsInSeason(true);
$data[$i]->setIsBookable(false);
}
}
else
{
$data[$i]->setIsReserved(false);
$data[$i]->setPrice($price);
$data[$i]->setIsInSeason(true);
$data[$i]->setIsBookable(false);
}
}
$calendar[$startCalendarIndex]['data'] = $data;
// letzter monat
/** @var CalendarDayState[] $data */
$data = $calendar[$endCalendarIndex]['data'];
$calendar[$endCalendarIndex]['marked'] = 1;
$startIndex = 0;
$endIndex = $endDay - 1;
for($i = $startIndex; $i <= $endIndex; $i++)
{
if ($reservationMode)
{
if ($i == $endIndex)
{
$data[$i]->setIsReserved(true);
$data[$i]->setIsReservationEnd(true);
$data[$i]->setReservation($reservation);
$data[$i]->setIsInSeason(true);
$data[$i]->setIsBookable(false);
//$data[$i]->setIsBookable(true);
}
else
{
$data[$i]->setIsReserved(true);
$data[$i]->setReservation($reservation);
$data[$i]->setIsInSeason(true);
$data[$i]->setIsBookable(false);
}
}
else
{
$data[$i]->setIsReserved(false);
$data[$i]->setPrice($price);
$data[$i]->setIsInSeason(true);
$data[$i]->setIsBookable(false);
}
}
$calendar[$endCalendarIndex]['data'] = $data;
// alle monate dazwischen
for($i = $startCalendarIndex + 1; $i < $endCalendarIndex; $i++)
// anfang und ende innerhalb eines monats
if($startCalendarIndex == $endCalendarIndex)
{
/** @var CalendarDayState[] $data */
$data = $calendar[$i]['data'];
$data = $calendar[$startCalendarIndex]['data'];
$calendar[$i]['marked'] = 1;
$calendar[$startCalendarIndex]['marked'] = 1;
$startIndex = 0;
$endIndex = count($data) - 1;
for($j = $startIndex; $j <= $endIndex; $j++)
// hier geht man von ungepaddeten Kalendermonaten aus
$startIndex = $startDay - 1;
$endIndex = $endDay - 1;
for ($i = $startIndex; $i <= $endIndex; $i++)
{
if ($reservationMode)
{
$data[$j]->setIsReserved(true);
$data[$j]->setReservation($reservation);
$data[$j]->setIsInSeason(true);
$data[$j]->setIsBookable(false);
if ($i == $startIndex)
{
$data[$i]->setIsReserved(true);
$data[$i]->setIsReservationBegin(true);
$data[$i]->setReservation($reservation);
$data[$i]->setIsInSeason(true);
$data[$i]->setIsBookable(false);
}
elseif ($i == $endIndex)
{
$data[$i]->setIsReserved(true);
$data[$i]->setIsReservationEnd(true);
$data[$i]->setReservation($reservation);
$data[$i]->setIsInSeason(true);
$data[$i]->setIsBookable(false);
//$data[$i]->setIsBookable(true);
}
else
{
$data[$i]->setIsReserved(true);
$data[$i]->setReservation($reservation);
$data[$i]->setIsInSeason(true);
$data[$i]->setIsBookable(false);
}
}
else
{
$data[$j]->setIsReserved(false);
$data[$j]->setPrice($price);
$data[$j]->setIsInSeason(true);
$data[$j]->setIsBookable(false);
$data[$i]->setIsReserved(false);
$data[$i]->setPrice($price);
$data[$i]->setIsInSeason(true);
$data[$i]->setIsBookable(false);
}
}
$calendar[$i]['data'] = $data;
$calendar[$startCalendarIndex]['data'] = $data;
}
else
{
// erster monat
/** @var CalendarDayState[] $data */
$data = $calendar[$startCalendarIndex]['data'];
$calendar[$startCalendarIndex]['marked'] = 1;
$startIndex = $startDay - 1;
$endIndex = count($data) - 1;
for($i = $startIndex; $i <= $endIndex; $i++)
{
if ($reservationMode)
{
if ($i == $startIndex)
{
$data[$i]->setIsReserved(true);
$data[$i]->setIsReservationBegin(true);
$data[$i]->setReservation($reservation);
$data[$i]->setIsInSeason(true);
$data[$i]->setIsBookable(false);
}
else
{
$data[$i]->setIsReserved(true);
$data[$i]->setReservation($reservation);
$data[$i]->setIsInSeason(true);
$data[$i]->setIsBookable(false);
}
}
else
{
$data[$i]->setIsReserved(false);
$data[$i]->setPrice($price);
$data[$i]->setIsInSeason(true);
$data[$i]->setIsBookable(false);
}
}
$calendar[$startCalendarIndex]['data'] = $data;
// letzter monat
/** @var CalendarDayState[] $data */
$data = $calendar[$endCalendarIndex]['data'];
$calendar[$endCalendarIndex]['marked'] = 1;
$startIndex = 0;
$endIndex = $endDay - 1;
for($i = $startIndex; $i <= $endIndex; $i++)
{
if ($reservationMode)
{
if ($i == $endIndex)
{
$data[$i]->setIsReserved(true);
$data[$i]->setIsReservationEnd(true);
$data[$i]->setReservation($reservation);
$data[$i]->setIsInSeason(true);
$data[$i]->setIsBookable(false);
//$data[$i]->setIsBookable(true);
}
else
{
$data[$i]->setIsReserved(true);
$data[$i]->setReservation($reservation);
$data[$i]->setIsInSeason(true);
$data[$i]->setIsBookable(false);
}
}
else
{
$data[$i]->setIsReserved(false);
$data[$i]->setPrice($price);
$data[$i]->setIsInSeason(true);
$data[$i]->setIsBookable(false);
}
}
$calendar[$endCalendarIndex]['data'] = $data;
// alle monate dazwischen
for($i = $startCalendarIndex + 1; $i < $endCalendarIndex; $i++)
{
/** @var CalendarDayState[] $data */
$data = $calendar[$i]['data'];
$calendar[$i]['marked'] = 1;
$startIndex = 0;
$endIndex = count($data) - 1;
for($j = $startIndex; $j <= $endIndex; $j++)
{
if ($reservationMode)
{
$data[$j]->setIsReserved(true);
$data[$j]->setReservation($reservation);
$data[$j]->setIsInSeason(true);
$data[$j]->setIsBookable(false);
}
else
{
$data[$j]->setIsReserved(false);
$data[$j]->setPrice($price);
$data[$j]->setIsInSeason(true);
$data[$j]->setIsBookable(false);
}
}
$calendar[$i]['data'] = $data;
}
}
}
return $calendar;
}
private function mergeCalendars($calendar, $extensionCalendar, $withFromTo = false)
// in der Regel: calendar = pricesCalendar; extensionCalendar = reservationsCalendar
private function mergeCalendars($calendar, $extensionCalendar)
{
for($i = 0; $i < count($calendar); $i++)
{
@ -454,71 +478,23 @@ class LodgingCalendarService
for($j = 0; $j < $endIndex; $j++)
{
if ($withFromTo)
{
if ($extensionCalendarData[$j]->getIsInSeason())
{
//$calendarData[$j] = $extensionCalendarData[$j];
$price = $extensionCalendarData[$j]->getPrice();
$calendarData[$j]->setIsInSeason(true);
$calendarData[$j]->setPrice($price);
}
}
if ($extensionCalendarData[$j]->getIsReserved())
{
// braucht man das überhaupt noch?
if ($withFromTo)
$price = $calendarData[$j]->getPrice();
//$isInSeason = $calendarData[$j]->getIsInSeason();
$reservation = $calendarData[$j]->getReservation();
$calendarData[$j] = $extensionCalendarData[$j];
if ($calendarData[$j]->getIsReservationEnd() && $extensionCalendarData[$j]->getIsReservationBegin())
{
// zweite runde $actuallyReservableDaysCalendar merge mit $reservationsCalendar
if (!($calendarData[$j]->getIsBookable() && $extensionCalendarData[$j]->getIsReservationEnd()))
{
//$calendarData[$j] = $extensionCalendarData[$j];
$price = $calendarData[$j]->getPrice();
//$calendarData[$j] = $extensionCalendarData[$j];// todo
$calendarData[$j]->setIsBookable(false);
$calendarData[$j]->setIsReserved(true);
$calendarData[$j]->setReservation($extensionCalendarData[$j]->getReservation());
$calendarData[$j]->setIsReservationBegin($extensionCalendarData[$j]->getIsReservationBegin());
$calendarData[$j]->setIsReservationEnd($extensionCalendarData[$j]->getIsReservationEnd());
if ($calendarData[$j]->getIsReservationEnd() && $extensionCalendarData[$j]->getIsReservationBegin())
{
$calendarData[$j]->setIsReservationBegin(false);
$calendarData[$j]->setIsReservationEnd(false);
}
$calendarData[$j]->setIsInSeason(true);
$calendarData[$j]->setPrice($price);
}
$calendarData[$j]->setReservation($reservation);
$calendarData[$j]->setIsReservationBegin(false);
$calendarData[$j]->setIsReservationEnd(false);
}
else
{
// erste runde $pricesCalendar merge mit $reservationsCalendar
$price = $calendarData[$j]->getPrice();
$isInSeason = $calendarData[$j]->getIsInSeason();
$reservation = $calendarData[$j]->getReservation();
$calendarData[$j] = $extensionCalendarData[$j];
if ($calendarData[$j]->getIsReservationEnd() && $extensionCalendarData[$j]->getIsReservationBegin())
{
$calendarData[$j]->setReservation($reservation);
$calendarData[$j]->setIsReservationBegin(false);
$calendarData[$j]->setIsReservationEnd(false);
}
/** @var FewoPrice $price */
$calendarData[$j]->setIsInSeason(true);
$calendarData[$j]->setPrice($price);
}
/** @var FewoPrice $price */
$calendarData[$j]->setIsInSeason(true);
$calendarData[$j]->setPrice($price);
}
}
@ -698,15 +674,14 @@ class LodgingCalendarService
foreach($reservations as $reservation)
{
$reservationId = $reservation->getId();
$appendix = ','.$reservationId;
$fromDate = $reservation->getFromDate();
$toDate = $reservation->getToDate();
$reservationsCalendar = $this->markCalendarDays($reservationsCalendar, $fromDate, $toDate, true, null, $reservation); //TODO fast fertig
$reservationsCalendar = $this->markCalendarDays($reservationsCalendar, $fromDate, $toDate,
true, null, $reservation); //TODO fast fertig
}
$mergedPricesAndReservationsCalendar = $this->mergeCalendars($pricesCalendar, $reservationsCalendar, false);
$mergedPricesAndReservationsCalendar = $this->mergeCalendars($pricesCalendar, $reservationsCalendar);
$actuallyReservableDaysCalendar = $this->filterReservableDays($lodging, $mergedPricesAndReservationsCalendar);
//$resultCalendar = $this->mergeCalendars($actuallyReservableDaysCalendar, $reservationsCalendar, true);