From 4c0b6a5bc8069eecb9c99a395eabea91703150b2 Mon Sep 17 00:00:00 2001 From: Dr Masroor Ehsan Date: Sat, 11 Jan 2025 12:52:19 +0600 Subject: [PATCH] filter --- app/DAL/Studies/RadiologistWorklist.php | 10 ++---- app/DAL/Studies/WorklistBase.php | 42 ++++++++++++++++++++----- app/Models/Study.php | 23 +++++++++++++- 3 files changed, 59 insertions(+), 16 deletions(-) diff --git a/app/DAL/Studies/RadiologistWorklist.php b/app/DAL/Studies/RadiologistWorklist.php index 3a0617e..6cf55e8 100644 --- a/app/DAL/Studies/RadiologistWorklist.php +++ b/app/DAL/Studies/RadiologistWorklist.php @@ -2,7 +2,8 @@ namespace App\DAL\Studies; -use Illuminate\Contracts\Database\Eloquent\Builder; +use App\Models\Study; +use Illuminate\Database\Eloquent\Builder; final class RadiologistWorklist extends WorklistBase { @@ -12,11 +13,6 @@ protected function buildQuery(?int $user_id = null): Builder $user_id = (int) ($user_id ?? auth()->id()); $this->setRadiologist($user_id); - $query = $query->where(function ($query) use ($user_id) { - $query->Where('assigned_physician_id', '=', $user_id); - $query->orWhere('reporting_physician_id', '=', $user_id); - }); - - return $query; + return Study::buildRadiologistQuery($query, $user_id); } } diff --git a/app/DAL/Studies/WorklistBase.php b/app/DAL/Studies/WorklistBase.php index fd9dd29..6e3e033 100644 --- a/app/DAL/Studies/WorklistBase.php +++ b/app/DAL/Studies/WorklistBase.php @@ -6,8 +6,8 @@ use App\Domain\Study\StudyLevelStatus; use App\Models\Study; use Carbon\Carbon; -use Illuminate\Contracts\Database\Eloquent\Builder; use Illuminate\Contracts\Pagination\LengthAwarePaginator; +use Illuminate\Database\Eloquent\Builder; abstract class WorklistBase implements IUserStudyLister { @@ -164,7 +164,7 @@ protected function getStudiesQuery(): Builder $q = Study::query(); } - return $q->with(['readingPhysician', 'dicomServer']); + return $q->with(['readingPhysician', 'dicomServer', 'assignedPhysicians', 'reports']); } protected function applySort(Builder $query): Builder @@ -186,12 +186,34 @@ abstract protected function buildQuery(?int $user_id = null): Builder; 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('reporting_physician_id', '=', $rad); + if ($this->radiologist_id !== null) { + $userId = $this->radiologist_id; + $query = Study::buildRadiologistQuery($query, $userId); + /* + $query->where(function (Builder $q) use ($userId) { + $q->where('reading_physician_id', $userId) + ->orWhere('locking_physician_id', $userId) + ->orWhere('approving_physician_id', $userId) + ->orWhereHas('assignedPhysicians', function (Builder $subQuery) use ($userId) { + $subQuery->where('user_id', $userId); + }); }); + */ + + /* + $query = $query->where(function ($qry) use ($rad) { + // TODO: $query->Where('assigned_physician_id', '=', $rad); + $qry->whereHas('assignedPhysicians', function ($subQuery) use ($rad) { + $subQuery->where('assignedPhysicians.user_id', '=', $rad); + })->with(['assignedPhysicians' => function ($q) use ($rad) { + $q->where('assignedPhysicians.user_id', '=', $rad); + }]); + + #$qry->orWhere('locking_physician_id', '=', $rad); + #$qry->orWhere('reading_physician_id', '=', $rad); + #$qry->orWhere('approving_physician_id', '=', $rad); + }); + */ } return $query; @@ -239,7 +261,11 @@ private function applySearch(Builder $query): Builder private function applyArchived(Builder $query): Builder { if ($this->archived != null) { - $query = $query->where('is_archived', $this->archived); + if ($this->archived) { + $query = $query->archived(); + } else { + $query = $query->active(); + } } return $query; diff --git a/app/Models/Study.php b/app/Models/Study.php index ce8da6c..f1a3a78 100644 --- a/app/Models/Study.php +++ b/app/Models/Study.php @@ -29,6 +29,19 @@ class Study extends BaseModel implements HasMedia public const string MEDIA_COLLECTION = 'attachments'; public const string FALLBACK_IMAGE = 'imgs/doc-pdf.png'; + public static function buildRadiologistQuery(Builder $query, int $userId): Builder + { + return $query->where(function (Builder $q) use ($userId) { + $q + ->where('reading_physician_id', $userId) + ->orWhere('locking_physician_id', $userId) + ->orWhere('approving_physician_id', $userId) + ->orWhereHas('assignedPhysicians', function (Builder $subQuery) use ($userId) { + $subQuery->where('user_id', $userId); + }); + }); + } + public function details(): HasOne { return $this->hasOne(StudyDetails::class); @@ -135,6 +148,13 @@ public function isAssigned(User|int|null $user = null): bool return $this->assignedPhysicians->contains(me($user)->id); } + public function isUserInStudyAssignmentsOrReadingPhysician(User|int|null $user = null): bool + { + $count = self::buildRadiologistQuery(self::where('id', $this->id), me($user)->id)->count(); + + return $count > 0; + } + public function isActive(): bool { return $this->archived_at === null; @@ -410,7 +430,8 @@ public function setReportStatus(ReportStatus $status, User|int|null $user = null public function canEditReport(): bool { - $this->report_status <= ReportStatus::Finalized; + // todo: check if the study disallows reporting + return $this->report_status <= ReportStatus::Finalized; } public function hasReports(): bool