Compare commits

...

4 Commits

Author SHA1 Message Date
0da8e2bc34 misc 2025-01-31 01:09:48 +06:00
049d59d39c wip - workflow steps 2025-01-31 00:42:58 +06:00
1f7764481c heroicon 2025-01-31 00:12:24 +06:00
4462bb1cfb minor 2025-01-30 21:29:33 +06:00
6 changed files with 39 additions and 34 deletions

View File

@ -18,18 +18,18 @@ enum WorkflowLevel: int
case Archived = 200; case Archived = 200;
case Cancelled = 240; case Cancelled = 240;
public function description(): string public function describe(): string
{ {
return match ($this) { return match ($this) {
self::Received => 'Study Received', self::Received => 'Study Received',
self::Unassigned => 'Unassigned', self::Unassigned => 'Unassigned study',
self::Assigned => 'Assigned', self::Assigned => 'Pending read',
self::Dictated => 'Dictated', self::Dictated => 'Dictated',
self::Transcribed => 'Transcribed', self::Transcribed => 'Transcribed',
self::Repetition => 'Repetition', self::Repetition => 'Repeat interpretation',
self::ReadInProgress => 'Read In Progress', self::ReadInProgress => 'Read In Progress',
self::DraftAvailable => 'Draft interpretation available', self::DraftAvailable => 'Draft available',
self::Finalized => 'Repoort finalized', self::Finalized => 'Report finalized',
self::UnderReview => 'Under Review', self::UnderReview => 'Under Review',
self::Published => 'Report published', self::Published => 'Report published',
self::Archived => 'Study archived', self::Archived => 'Study archived',

View File

@ -44,7 +44,10 @@ public function remove(AssignPhysicianRequest $request)
$study->assignedPhysicians()->detach($rad->id); $study->assignedPhysicians()->detach($rad->id);
if ($study->assignedPhysicians()->count() === 0) { if ($study->assignedPhysicians()->count() === 0) {
$study->update(['assigned_at' => null]); $study->update([
'workflow_level' => WorkflowLevel::Unassigned->value,
'assigned_at' => null,
]);
} }
audit() audit()
@ -64,7 +67,10 @@ public function save(AssignPhysicianRequest $request)
$rad = User::active()->findOrFail($request->input('rad_id')); $rad = User::active()->findOrFail($request->input('rad_id'));
$study->assignedPhysicians()->attach($rad->id); $study->assignedPhysicians()->attach($rad->id);
$study->update(['assigned_at' => now()]); $study->update([
'workflow_level' => WorkflowLevel::Assigned->value,
'assigned_at' => now(),
]);
audit() audit()
->did(Activity::Assign_Physician) ->did(Activity::Assign_Physician)
->on($study) ->on($study)

View File

@ -2,13 +2,13 @@
namespace App\Http\Controllers\Staff; namespace App\Http\Controllers\Staff;
use App\Http\Controllers\HashidControllerBase; use App\Http\Controllers\HashedStudyControllerBase;
use App\Models\Study; use App\Models\Study;
use App\Services\AuditTrail\Activity; use App\Services\AuditTrail\Activity;
use Closure; use Closure;
use Illuminate\Support\Str; use Illuminate\Support\Str;
class DicomViewerController extends HashidControllerBase class DicomViewerController extends HashedStudyControllerBase
{ {
public function stone() public function stone()
{ {
@ -22,8 +22,7 @@ public function ohif()
private function loadViewer(Closure $callback) private function loadViewer(Closure $callback)
{ {
$this->decodeKeys(); $study = $this->getStudy();
$study = Study::findOrFail($this->key);
$url = $callback($study); $url = $callback($study);
abort_if(blank($url), 404); abort_if(blank($url), 404);
$title = Str::limit($study->getPatientDemographic(), 40); $title = Str::limit($study->getPatientDemographic(), 40);

View File

@ -3,7 +3,6 @@
namespace App\Models; namespace App\Models;
use App\Domain\ACL\Permission; use App\Domain\ACL\Permission;
use App\Domain\Report\ReportStatus;
use App\Domain\Study\Priority; use App\Domain\Study\Priority;
use App\Domain\Study\WorkflowLevel; use App\Domain\Study\WorkflowLevel;
use App\Models\Traits\HasDepartment; use App\Models\Traits\HasDepartment;
@ -177,25 +176,26 @@ public function isArchived(): bool
public function getWorkflowLevelLedAttribute(): string public function getWorkflowLevelLedAttribute(): string
{ {
// todo: implement
$color = match ($this->workflow_level) {
WorkflowLevel::Unassigned => 'bg-white',
// ReportStatus::Opened => 'bg-secondary',
WorkflowLevel::DraftAvailable => 'bg-info',
WorkflowLevel::Finalized => 'bg-primary',
WorkflowLevel::Published => 'bg-success',
default => 'bg-light',
};
// <i class="fa-solid fa-spinner"></i>
$icon = match ($this->workflow_level) { $icon = match ($this->workflow_level) {
WorkflowLevel::Unassigned => 'spinner text-muted', WorkflowLevel::Received => 'download-2-line',
WorkflowLevel::DraftAvailable => 'pen-to-square', WorkflowLevel::Unassigned => 'checkbox-indeterminate-line',
WorkflowLevel::Finalized => 'badge-check', WorkflowLevel::Assigned => 'hourglass-2-line',
WorkflowLevel::Published => 'shield-check', WorkflowLevel::Dictated => 'speak-line',
default => 'spinner text-muted', WorkflowLevel::Transcribed => 'message-2-line',
WorkflowLevel::Repetition => 'repeat-line',
WorkflowLevel::ReadInProgress => 'battery-charge-line',
WorkflowLevel::DraftAvailable => 'draft-line',
WorkflowLevel::Finalized => 'folder-chart-line',
WorkflowLevel::UnderReview => 'eye-line',
WorkflowLevel::Published => 'graduation-cap-line',
WorkflowLevel::Archived => 'archive-line',
WorkflowLevel::Cancelled => 'close-circle-line',
default => 'cog-6-tooth',
}; };
return sprintf('<span class="badge badge-center rounded-pill %s"><i class="fa-solid fa-%s"></i></span>', $color, $icon); $descr = $this->workflow_level->describe();
return sprintf('<span class="text-gray" data-bs-toggle="tooltip" data-bs-placement="top" data-bs-original-title="%s" title="%s"><i class="ri-%s"></i></span>', $descr, $descr, $icon);
} }
public function getArchiveLink(): ?string public function getArchiveLink(): ?string
@ -370,14 +370,14 @@ public function isUnlocked(): bool
return $this->locked_at === null; return $this->locked_at === null;
} }
public function lockStudy(User|int|null $user = null, ?WorkflowLevel $status = null): void public function lockStudy(User|int|null $user = null, ?WorkflowLevel $level = null): void
{ {
$params = [ $params = [
'locking_physician_id' => me($user)->id, 'locking_physician_id' => me($user)->id,
'locked_at' => now(), 'locked_at' => now(),
]; ];
if ($status) { if ($level !== null) {
$params['workflow_level'] = $status->value; $params['workflow_level'] = $level->value;
} }
$this->update($params); $this->update($params);

View File

@ -112,7 +112,7 @@ public function check(): ?View
public function lockStudyIfRequired(): void public function lockStudyIfRequired(): void
{ {
if ($this->study->isUnlocked()) { if ($this->study->isUnlocked()) {
$this->study->lockStudy(); $this->study->lockStudy(level: WorkflowLevel::ReadInProgress);
audit() audit()
->on($this->study) ->on($this->study)
->did(Activity::Study_Lock) ->did(Activity::Study_Lock)

View File

@ -88,7 +88,7 @@
<label class="form-check form-check-danger mt-4"> <label class="form-check form-check-danger mt-4">
<input name="cancel_read" type="checkbox" class="form-check-input"/> <input name="cancel_read" type="checkbox" class="form-check-input"/>
<span class="form-check-label">Cancel interpretation by radiologist</span> <span class="form-check-label">No interpretation required</span>
</label> </label>
</div> </div>
</div> </div>