get(); } public function paginated(int $perPage = 25, string $search = ''): LengthAwarePaginator { return Department::query() ->select(['id', 'code', 'name', 'degree_level']) ->with(['currentLeader.lecturer.user.profile']) ->when($search, fn ($q) => $q->where('name', 'like', "%{$search}%")->orWhere('code', 'like', "%{$search}%")) ->latest() ->paginate($perPage); } public function create(array $data): Department { $department = Department::create([ 'code' => $data['code'], 'name' => $data['name'], 'degree_level' => $data['degree_level'] ?? null, ]); $this->syncLeadership($department, $data['lecturer_id'] ?? null, $data['leadership_started_at'] ?? null); return $department; } public function update(Department $department, array $data): Department { $department->code = $data['code']; $department->name = $data['name']; $department->degree_level = $data['degree_level'] ?? null; $department->update(); $this->syncLeadership($department, $data['lecturer_id'] ?? null, $data['leadership_started_at'] ?? null); return $department; } private function syncLeadership(Department $department, ?int $lecturerId, ?string $startedAt): void { $currentLeader = DepartmentLeadership::query() ->where('department_id', $department->id) ->whereNull('ended_at') ->first(); if (! $lecturerId) { $currentLeader?->update(['ended_at' => now()]); return; } if ($currentLeader && $currentLeader->lecturer_id === $lecturerId) { $currentLeader->update(['started_at' => $startedAt ?? $currentLeader->started_at]); return; } $currentLeader?->update(['ended_at' => now()]); $department->leaderships()->create([ 'lecturer_id' => $lecturerId, 'started_at' => $startedAt ?? now(), ]); } public function delete(Department $department): bool { return $department->delete(); } }