year, $this->monthNameToNumber($month)); $period = CarbonPeriod::create($date->startOfMonth(), $date->endOfMonth()); $holidays = $yearPeriod->holidays()->pluck("date"); return $this->generateCalendar($period, $holidays); } protected function monthNameToNumber($name): int { return match ($name) { default => CarbonInterface::JANUARY, "february" => CarbonInterface::FEBRUARY, "march" => CarbonInterface::MARCH, "april" => CarbonInterface::APRIL, "may" => CarbonInterface::MAY, "june" => CarbonInterface::JUNE, "july" => CarbonInterface::JULY, "august" => CarbonInterface::AUGUST, "september" => CarbonInterface::SEPTEMBER, "october" => CarbonInterface::OCTOBER, "november" => CarbonInterface::NOVEMBER, "december" => CarbonInterface::DECEMBER, }; } protected function generateCalendar(CarbonPeriod $period, Collection $holidays): array { $calendar = []; $vacations = $this->getVacationsForPeriod($period); foreach ($period as $day) { $vacationsForDay = $vacations[$day->toDateString()] ?? new Collection(); $calendar[] = [ "date" => $day->toDateString(), "dayOfMonth" => $day->translatedFormat("j"), "dayOfWeek" => $day->translatedFormat("D"), "isToday" => $day->isToday(), "isWeekend" => $day->isWeekend(), "isHoliday" => $holidays->contains($day), "vacations" => $vacationsForDay->pluck("user_id"), ]; } return $calendar; } protected function getVacationsForPeriod(CarbonPeriod $period): Collection { return Vacation::query() ->whereBetween("date", [$period->start, $period->end]) ->whereRelation("vacationRequest", "state", VacationRequestState::Approved->value) ->get() ->groupBy(fn(Vacation $vacation) => $vacation->date->toDateString()); } }