radfusion/app/DAL/Studies/WorklistBase.php
2025-01-03 21:17:12 +06:00

195 lines
5.1 KiB
PHP

<?php
namespace App\DAL\Studies;
use App\Models\Enums\ReportStatus;
use App\Models\Enums\StudyLevelStatus;
use App\Models\Study;
use Illuminate\Contracts\Database\Eloquent\Builder;
use Illuminate\Contracts\Pagination\LengthAwarePaginator;
abstract class WorklistBase implements IUserStudyLister
{
private ?int $perPage = null;
private array $sortColumns = [];
private ?string $sortDir = null;
private ?string $searchTerm = null;
private ?int $radiologist_id = null;
private ?StudyLevelStatus $studyStatus = null;
private ?ReportStatus $reportStatus = null;
private ?bool $locked = null;
private ?bool $archived = null;
public function setRadiologist(int $radiologist_id): void
{
$this->radiologist_id = $radiologist_id;
}
public function setStudyStatus(StudyLevelStatus $status): void
{
$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): void
{
$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): void
{
$this->archived = $archived;
}
public function setLocked(bool $locked): void
{
$this->locked = $locked;
}
public function setPerPage(int $size): void
{
$this->perPage = $size;
}
public function setSortOrder(string $order): void
{
$this->sortColumns = [];
if (filled($order)) {
$orders = explode(',', $order);
foreach ($orders as $order) {
$column = ltrim($order, '-');
$dir = ($order[0] == '-') ? 'desc' : 'asc';
$this->sortColumns[] = [$column => $dir];
}
}
}
public function setSearchTerm(string $search): void
{
$this->searchTerm = trim(strtolower($search));
}
private function getPageSize(?int $user_id = null): int
{
return $this->perPage ?? $this->getPageSize($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;
}
}