fix attendance

This commit is contained in:
root
2026-06-04 20:49:14 -04:00
parent 6fa656bb6c
commit d28d11e2e5
15 changed files with 1101 additions and 44 deletions
@@ -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();