Files
alrahma_sunday_school_api/app/Services/Attendance/SemesterRangeService.php
T
2026-04-29 17:39:33 -04:00

108 lines
3.2 KiB
PHP

<?php
namespace App\Services\Attendance;
use App\Models\Configuration;
use Carbon\Carbon;
class SemesterRangeService
{
public function normalizeSemester(?string $semester): string
{
$value = strtolower(trim((string)$semester));
return match ($value) {
'fall', 'autumn' => '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];
}
}