fix attendance
This commit is contained in:
@@ -20,31 +20,21 @@ class SemesterRangeService
|
||||
|
||||
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);
|
||||
$config = $this->ensureAttendanceConfigs($schoolYear);
|
||||
|
||||
return [
|
||||
Carbon::create($startYear, 9, 1)->toDateString(),
|
||||
Carbon::create($endYear, 5, 31)->toDateString(),
|
||||
Carbon::parse($config['fall_semester_start'])->toDateString(),
|
||||
Carbon::parse($config['last_school_day'])->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');
|
||||
$config = $this->ensureAttendanceConfigs($schoolYear);
|
||||
$fallStart = $config['fall_semester_start'];
|
||||
$springStart = $config['spring_semester_start'];
|
||||
$lastDay = $config['last_school_day'];
|
||||
|
||||
if ($semester === 'Fall' && $fallStart && $springStart) {
|
||||
return [
|
||||
@@ -60,20 +50,7 @@ class SemesterRangeService
|
||||
];
|
||||
}
|
||||
|
||||
// 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,
|
||||
};
|
||||
return null;
|
||||
}
|
||||
|
||||
public function buildSundayList(string $startDate, string $endDate): array
|
||||
@@ -102,7 +79,54 @@ class SemesterRangeService
|
||||
return [(int)$m[1], (int)$m[2]];
|
||||
}
|
||||
|
||||
$configured = trim((string) Configuration::getConfig('school_year'));
|
||||
if (preg_match('/^\s*(\d{4})\s*-\s*(\d{4})\s*$/', $configured, $m)) {
|
||||
return [(int) $m[1], (int) $m[2]];
|
||||
}
|
||||
|
||||
$year = (int) date('Y');
|
||||
$derived = $year . '-' . ($year + 1);
|
||||
Configuration::setConfigValueByKey('school_year', $derived);
|
||||
|
||||
return [$year, $year + 1];
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Ensure the attendance range config keys exist in `configuration`.
|
||||
*
|
||||
* @return array{
|
||||
* school_year:string,
|
||||
* fall_semester_start:string,
|
||||
* spring_semester_start:string,
|
||||
* last_school_day:string
|
||||
* }
|
||||
*/
|
||||
protected function ensureAttendanceConfigs(string $schoolYear): array
|
||||
{
|
||||
[$startYear, $endYear] = $this->parseSchoolYear($schoolYear);
|
||||
|
||||
$resolvedSchoolYear = trim($schoolYear);
|
||||
if ($resolvedSchoolYear === '') {
|
||||
$resolvedSchoolYear = sprintf('%04d-%04d', $startYear, $endYear);
|
||||
}
|
||||
|
||||
$defaults = [
|
||||
'school_year' => $resolvedSchoolYear,
|
||||
'fall_semester_start' => Carbon::create($startYear, 9, 1)->toDateString(),
|
||||
'spring_semester_start' => Carbon::create($endYear, 1, 25)->toDateString(),
|
||||
'last_school_day' => Carbon::create($endYear, 5, 31)->toDateString(),
|
||||
];
|
||||
|
||||
$resolved = [];
|
||||
foreach ($defaults as $key => $defaultValue) {
|
||||
$value = trim((string) Configuration::getConfig($key));
|
||||
if ($value === '') {
|
||||
Configuration::setConfigValueByKey($key, $defaultValue);
|
||||
$value = $defaultValue;
|
||||
}
|
||||
$resolved[$key] = $value;
|
||||
}
|
||||
|
||||
return $resolved;
|
||||
}
|
||||
}
|
||||
|
||||
@@ -6,6 +6,7 @@ use App\Models\AttendanceDay;
|
||||
use App\Models\Configuration;
|
||||
use App\Models\StaffAttendance;
|
||||
use App\Models\TeacherClass;
|
||||
use Carbon\Carbon;
|
||||
use Illuminate\Contracts\Auth\Authenticatable;
|
||||
use App\Models\ClassSection;
|
||||
use Illuminate\Support\Facades\DB;
|
||||
@@ -181,7 +182,34 @@ class StaffAttendanceService
|
||||
public function monthData(?string $semester, ?string $schoolYear): array
|
||||
{
|
||||
$semester = $semester ?: (string)$this->configuration->getConfig('semester');
|
||||
$schoolYear = $schoolYear ?: (string)$this->configuration->getConfig('school_year');
|
||||
[
|
||||
'school_year' => $schoolYear,
|
||||
'current_year' => $currentYear,
|
||||
'school_years' => $schoolYears,
|
||||
'missing_year' => $missingYear,
|
||||
'is_current_year' => $isCurrentYear,
|
||||
] = $this->resolveMonthSchoolYearContext($schoolYear);
|
||||
|
||||
if ($schoolYear === '') {
|
||||
return [
|
||||
'filters' => [
|
||||
'semester' => $semester,
|
||||
'school_year' => '',
|
||||
'range_start' => null,
|
||||
'range_end' => null,
|
||||
'range_label' => 'School Year',
|
||||
'month_label' => 'School Year',
|
||||
],
|
||||
'sundays' => [],
|
||||
'noSchoolDays' => [],
|
||||
'sections' => [],
|
||||
'admins' => [],
|
||||
'schoolYears' => $schoolYears,
|
||||
'currentYear' => $currentYear,
|
||||
'isCurrentYear' => false,
|
||||
'missingYear' => $missingYear,
|
||||
];
|
||||
}
|
||||
|
||||
[$rangeStart, $rangeEnd] = $this->semesterRangeService->getSchoolYearRange($schoolYear);
|
||||
$semesterNorm = $this->semesterRangeService->normalizeSemester($semester);
|
||||
@@ -193,6 +221,8 @@ class StaffAttendanceService
|
||||
}
|
||||
}
|
||||
|
||||
$rangeLabel = $this->buildRangeLabel($schoolYear, $semesterNorm, $rangeStart, $rangeEnd);
|
||||
|
||||
$days = $this->semesterRangeService->buildSundayList($rangeStart, $rangeEnd);
|
||||
|
||||
$assignedBySection = $semesterNorm !== ''
|
||||
@@ -411,14 +441,115 @@ class StaffAttendanceService
|
||||
'school_year' => $schoolYear,
|
||||
'range_start' => $rangeStart,
|
||||
'range_end' => $rangeEnd,
|
||||
'range_label' => $rangeLabel,
|
||||
'month_label' => $rangeLabel,
|
||||
],
|
||||
'sundays' => $days,
|
||||
'noSchoolDays' => $noSchoolDays,
|
||||
'sections' => $sections,
|
||||
'admins' => $admins,
|
||||
'schoolYears' => $schoolYears,
|
||||
'currentYear' => $currentYear,
|
||||
'isCurrentYear' => $isCurrentYear,
|
||||
'missingYear' => $missingYear,
|
||||
];
|
||||
}
|
||||
|
||||
/**
|
||||
* Match the legacy month page behavior:
|
||||
* - prefer the requested year
|
||||
* - else use configured school year
|
||||
* - else fall back to the latest year present in staff_attendance / teacher_class
|
||||
*
|
||||
* @return array{
|
||||
* school_year:string,
|
||||
* current_year:string,
|
||||
* school_years:array<int,string>,
|
||||
* missing_year:bool,
|
||||
* is_current_year:bool
|
||||
* }
|
||||
*/
|
||||
protected function resolveMonthSchoolYearContext(?string $requestedSchoolYear): array
|
||||
{
|
||||
$requestedSchoolYear = trim((string) $requestedSchoolYear);
|
||||
$currentYear = trim((string) $this->configuration->getConfig('school_year'));
|
||||
|
||||
$schoolYears = [];
|
||||
|
||||
try {
|
||||
$schoolYears = DB::table('staff_attendance')
|
||||
->select('school_year')
|
||||
->distinct()
|
||||
->whereNotNull('school_year')
|
||||
->orderByDesc('school_year')
|
||||
->pluck('school_year')
|
||||
->map(static fn ($value) => trim((string) $value))
|
||||
->filter()
|
||||
->values()
|
||||
->all();
|
||||
} catch (\Throwable) {
|
||||
$schoolYears = [];
|
||||
}
|
||||
|
||||
if ($schoolYears === []) {
|
||||
try {
|
||||
$schoolYears = DB::table('teacher_class')
|
||||
->select('school_year')
|
||||
->distinct()
|
||||
->whereNotNull('school_year')
|
||||
->orderByDesc('school_year')
|
||||
->pluck('school_year')
|
||||
->map(static fn ($value) => trim((string) $value))
|
||||
->filter()
|
||||
->values()
|
||||
->all();
|
||||
} catch (\Throwable) {
|
||||
$schoolYears = [];
|
||||
}
|
||||
}
|
||||
|
||||
if ($currentYear !== '' && !in_array($currentYear, $schoolYears, true)) {
|
||||
array_unshift($schoolYears, $currentYear);
|
||||
}
|
||||
|
||||
$schoolYears = array_values(array_unique(array_filter($schoolYears, static fn ($value) => $value !== '')));
|
||||
|
||||
if ($currentYear === '' && $schoolYears !== []) {
|
||||
$currentYear = (string) $schoolYears[0];
|
||||
Configuration::setConfigValueByKey('school_year', $currentYear);
|
||||
}
|
||||
|
||||
$resolvedYear = $requestedSchoolYear !== ''
|
||||
? $requestedSchoolYear
|
||||
: ($currentYear !== '' ? $currentYear : ($schoolYears[0] ?? ''));
|
||||
|
||||
if ($resolvedYear !== '' && !in_array($resolvedYear, $schoolYears, true)) {
|
||||
array_unshift($schoolYears, $resolvedYear);
|
||||
}
|
||||
|
||||
return [
|
||||
'school_year' => $resolvedYear,
|
||||
'current_year' => $currentYear,
|
||||
'school_years' => array_values(array_unique($schoolYears)),
|
||||
'missing_year' => $currentYear === '',
|
||||
'is_current_year' => $currentYear !== '' && $resolvedYear === $currentYear,
|
||||
];
|
||||
}
|
||||
|
||||
protected function buildRangeLabel(string $schoolYear, string $semesterNorm, string $rangeStart, string $rangeEnd): string
|
||||
{
|
||||
if ($semesterNorm === '') {
|
||||
return 'School Year ' . $schoolYear;
|
||||
}
|
||||
|
||||
return sprintf(
|
||||
'%s %s–%s',
|
||||
$semesterNorm,
|
||||
Carbon::parse($rangeStart)->format('d/m'),
|
||||
Carbon::parse($rangeEnd)->format('d/m')
|
||||
);
|
||||
}
|
||||
|
||||
public function adminsAttendanceData(?string $date, ?string $semester, ?string $schoolYear): array
|
||||
{
|
||||
$date = $date ?: now()->toDateString();
|
||||
|
||||
Reference in New Issue
Block a user