where('school_year', $schoolYear); } $semester = trim((string) ($filters['semester'] ?? '')); if ($semester !== '') { $query->where('semester', $semester); } $sortDir = strtolower((string) ($filters['sort_dir'] ?? 'asc')) === 'desc' ? 'desc' : 'asc'; $query->orderBy('date', $sortDir)->orderBy('id', 'asc'); return $query->get(); } public function findEvent(int $id): ?CalendarEvent { return CalendarEvent::query()->find($id); } public function filterEventsForAudience(Collection $events, ?string $audience): Collection { $audience = $audience !== null ? strtolower(trim($audience)) : null; if (! in_array($audience, ['parent', 'teacher', 'admin'], true)) { return $events; } return $events->filter(function (CalendarEvent $event) use ($audience) { $p = (int) $event->notify_parent; $t = (int) $event->notify_teacher; $a = (int) $event->notify_admin; $ns = (int) $event->no_school; $hasAny = ($p + $t + $a) > 0; if ($ns === 1) { return true; } if (! $hasAny) { return true; } if ($audience === 'parent') { return $p === 1; } if ($audience === 'teacher') { return $t === 1; } if ($audience === 'admin') { return $a === 1; } return true; })->values(); } }