'Fall', 'spring' => 'Spring', default => '', }; } public function getSchoolYearRange(string $schoolYear): array { $fallStart = Configuration::getConfig('fall_semester_start'); $lastDay = Configuration::getConfig('last_school_day'); if ($fallStart && $lastDay) { return [ Carbon::parse($fallStart)->toDateString(), Carbon::parse($lastDay)->toDateString(), ]; } [$startYear, $endYear] = $this->parseSchoolYear($schoolYear); return [ Carbon::create($startYear, 9, 1)->toDateString(), Carbon::create($endYear, 5, 31)->toDateString(), ]; } public function getSemesterRange(string $schoolYear, string $semester): ?array { $semester = $this->normalizeSemester($semester); $fallStart = Configuration::getConfig('fall_semester_start'); $springStart = Configuration::getConfig('spring_semester_start'); $lastDay = Configuration::getConfig('last_school_day'); if ($semester === 'Fall' && $fallStart && $springStart) { return [ Carbon::parse($fallStart)->toDateString(), Carbon::parse($springStart)->subDay()->toDateString(), ]; } if ($semester === 'Spring' && $springStart && $lastDay) { return [ Carbon::parse($springStart)->toDateString(), Carbon::parse($lastDay)->toDateString(), ]; } // Fallback to hardcoded logic when config keys are missing [$startYear, $endYear] = $this->parseSchoolYear($schoolYear); return match ($semester) { 'Fall' => [ Carbon::create($startYear, 9, 21)->toDateString(), Carbon::create($endYear, 1, 18)->toDateString(), ], 'Spring' => [ Carbon::create($endYear, 1, 25)->toDateString(), Carbon::create($endYear, 5, 31)->toDateString(), ], default => null, }; } public function buildSundayList(string $startDate, string $endDate): array { $start = Carbon::parse($startDate)->startOfDay(); $end = Carbon::parse($endDate)->startOfDay(); if ($start->dayOfWeek !== Carbon::SUNDAY) { $start = $start->next(Carbon::SUNDAY); } $dates = []; $cursor = $start->copy(); while ($cursor->lte($end)) { $dates[] = $cursor->toDateString(); $cursor->addWeek(); } return $dates; } protected function parseSchoolYear(string $schoolYear): array { if (preg_match('/^\s*(\d{4})\s*-\s*(\d{4})\s*$/', $schoolYear, $m)) { return [(int)$m[1], (int)$m[2]]; } $year = (int) date('Y'); return [$year, $year + 1]; } }