radiologist_id = $radiologist_id; } public function setStudyStatus(StudyLevelStatus $status): self { $this->studyStatus = $status; } private function applyRadiologist(Builder $query): Builder { if ($this->radiologist_id != null) { $rad = $this->radiologist_id; $query = $query->where(function ($query) use ($rad) { $query->Where('assigned_physician_id', '=', $rad); $query->orWhere('reading_physician_id', '=', $rad); }); } return $query; } protected function getStudiesQuery(): Builder { if ($this->archived === null) { return Study::active(); } return Study::query(); } private function applyStudyStatus(Builder $query): Builder { if ($this->studyStatus != null) { $query = $query->where('study_status', '=', $this->studyStatus->value); } return $query; } private function applyReportStatus(Builder $query): Builder { if ($this->reportStatus != null) { $query = $query->where('report_status', '=', $this->reportStatus->value); } return $query; } public function setReportStatus(ReportStatus $status): self { $this->reportStatus = $status; } protected static function reportCompleteQuery(Builder $query): Builder { return $query->where('report_status', '=', ReportStatus::Authorized->value); } protected function applySort(Builder $query): Builder { if (! empty($this->sortColumns)) { foreach ($this->sortColumns as $column => $dir) { $query = $query->orderBy($column, $dir); } return $query; } return $query ->orderByDesc('study_priority') ->orderByDesc('received_at'); } abstract protected function buildQuery(?int $user_id = null): Builder; public function get(?int $user_id = null): LengthAwarePaginator { $query = $this->buildQuery($user_id); $query = $this->applySort($query); $query = $this->applySearch($query); $query = $this->applyRadiologist($query); $query = $this->applyStudyStatus($query); $query = $this->applyReportStatus($query); $query = $this->applyArchived($query); $query = $this->applyLocked($query); return $query->paginate($this->getPageSize($user_id)); } public function setArchived(bool $archived): self { $this->archived = $archived; return $this; } public function setLocked(bool $locked): self { $this->locked = $locked; return $this; } public function setPerPage(int $size): self { $this->perPage = $size; return $this; } public function setSortOrder(string $order): self { $this->sortColumns = []; if (filled($order)) { $orders = explode(',', $order); foreach ($orders as $order) { $column = ltrim($order, '-'); $dir = ($order[0] == '-') ? 'desc' : 'asc'; $this->sortColumns[] = [$column => $dir]; } } return $this; } public function setSearchTerm(string $search): self { $this->searchTerm = trim(strtolower($search)); return $this; } private function getPageSize(?int $user_id = null): int { return $this->perPage ?? user_per_page($user_id); } private function applySearch(Builder $query): Builder { if (filled($this->searchTerm)) { $search = "%{$this->searchTerm}%"; $query = $query->where(function ($query) use ($search) { $query->orWhere('patient_name', 'like', $search); $query->orWhere('patient_id', 'like', $search); $query->orWhere('accession_number', 'like', $search); $query->orWhere('study_description', 'like', $search); $query->orWhere('body_part_examined', 'like', $search); }); } return $query; } private function applyArchived(Builder $query): Builder { if ($this->archived != null) { $query = $query->where('is_archived', $this->archived); } return $query; } private function applyLocked(Builder $query): Builder { if ($this->locked != null) { $query = $query->where('is_locked', $this->locked); } return $query; } }