'boolean', 'is_archived' => 'boolean', 'study_status' => StudyLevelStatus::class, 'report_status' => ReportStatus::class, 'received_at' => 'datetime', 'reported_at' => 'datetime', 'assigned_at' => 'datetime', 'study_date' => 'datetime', ]; } public function details(): HasOne { return $this->hasOne(StudyDetails::class); } public function attachments(): HasMany { return $this->hasMany(StudyAttachment::class); } public function reports(): HasMany { return $this->hasMany(StudyReport::class); } public function shares(): HasMany { return $this->hasMany(SharedStudy::class); } public function scopeActive($query) { return $query->where('is_archived', false); } public function scopeArchived($query) { return $query->where('is_archived', true); } public function scopeUnlocked($query) { return $query->where('is_locked', false); } public function getHistoryLink(): string { $user = auth()->user(); if ($user->may(Permission::StudyHistoryEdit)) { return route('staff.history.edit', $this->hash); } if ($user->may(Permission::StudyHistoryView)) { return route('staff.history.view', $this->hash); } return '#'; } public function getMetadataLink(): string { $user = auth()->user(); if ($user->may(Permission::StudyMetadataEdit)) { return route('staff.meta.edit', $this->hash); } if ($user->may(Permission::StudyMetadataView)) { return route('staff.meta.view', $this->hash); } return '#'; } public function sexAge(): string { $dob = $this->patient_birthdate; $age = $dob ? (int) Carbon::make($dob)->diffInYears().'Y' : null; return "$age / {$this->patient_sex}"; } public function numInstances(): string { return "{$this->image_count} / {$this->series_count}"; } public function getArchiveLink(): ?string { if (auth()->user()->may(Permission::StudyDownload)) { return PacsUrlGen::archive($this->study_instance_uid); } return null; } public function getStoneLink(): ?string { if (auth()->user()->may(Permission::StudyDownload)) { return PacsUrlGen::stoneViewer($this->study_instance_uid); } return null; } public function getOhifLink(): ?string { if (auth()->user()->may(Permission::StudyDownload)) { return PacsUrlGen::ohifViewer($this->study_instance_uid); } return null; } public function getOhifSegmentationLink(): ?string { if (auth()->user()->may(Permission::StudyDownload)) { return PacsUrlGen::ohifSegmentation($this->study_instance_uid); } return null; } public function getOhifMprLink(): ?string { if (auth()->user()->may(Permission::StudyDownload)) { return PacsUrlGen::ohifViewerMpr($this->study_instance_uid); } return null; } public function links(): array { return [ 'history' => $this->getHistoryLink(), 'metadata' => $this->getMetadataLink(), 'zip' => $this->getArchiveLink(), 'stone' => $this->getStoneLink(), 'ohif' => $this->getOhifLink(), 'ohif.mpr' => $this->getOhifMprLink(), 'ohif.seg' => $this->getOhifSegmentationLink(), ]; } public function allowed(): array { return [ 'zip' => filled($this->getArchiveLink()), 'stone' => filled($this->getStoneLink()), 'ohif' => filled($this->getOhifLink()), 'ohif.mpr' => filled($this->getOhifMprLink()), 'ohif.seg' => filled($this->getOhifSegmentationLink()), ]; } }