109 lines
3.6 KiB
PHP
109 lines
3.6 KiB
PHP
<?php
|
|
|
|
namespace App\Http\Controllers\Staff;
|
|
|
|
use App\Domain\Study\WorkflowLevel;
|
|
use App\Http\Controllers\HashidControllerBase;
|
|
use App\Http\Requests\StoreReportRequest;
|
|
use App\Models\Study;
|
|
use App\Services\Report\ReportManager;
|
|
use App\Services\Report\StampService;
|
|
|
|
class ReportController extends HashidControllerBase
|
|
{
|
|
public function popup()
|
|
{
|
|
ReportManager::ensureDownloadAccess();
|
|
$this->decodeKeys();
|
|
$study = Study::with(['reports.radiologist', 'reports.study', 'assignedPhysicians'])->findOrFail($this->key);
|
|
if ($study->reports->isEmpty()) {
|
|
return view('content.pages.partials._alert-div',
|
|
[
|
|
'color' => 'secondary',
|
|
'heading' => 'Unread study',
|
|
'message' => 'This study has not been interpreted yet. No reports are available.',
|
|
]);
|
|
}
|
|
|
|
if (me()->isRadiologist()) {
|
|
// abort_unless($study->isAssigned(), 403);
|
|
abort_unless($study->isUserInStudyAssignmentsOrReadingPhysician(), 403);
|
|
}
|
|
$reports = $study->reports->sortByDesc('created_at');
|
|
|
|
return view('staff.reports.popup', compact('study', 'reports'));
|
|
}
|
|
|
|
public function save(StoreReportRequest $request)
|
|
{
|
|
ReportManager::ensureEditAccess();
|
|
$this->decodeKeys();
|
|
$manager = ReportManager::make($this->key);
|
|
$workflow_level = WorkflowLevel::from($request->integer('report_status'));
|
|
$report = $manager->createReport(request('content'), $workflow_level);
|
|
|
|
if ($workflow_level->value === WorkflowLevel::Finalized->value) {
|
|
$manager->finalizeReport($report);
|
|
}
|
|
|
|
return view('content.pages.close-window');
|
|
}
|
|
|
|
public function create()
|
|
{
|
|
ReportManager::ensureEditAccess();
|
|
$this->decodeKeys();
|
|
$manager = ReportManager::make($this->key);
|
|
|
|
$view = $manager->check();
|
|
if ($view) {
|
|
return $view;
|
|
}
|
|
|
|
$manager->lockStudyIfRequired();
|
|
$study = $manager->getStudy();
|
|
$report = $manager->latestReport();
|
|
|
|
// todo: study_status: Read in Progress
|
|
|
|
return view('staff.reports.create', compact('study', 'report'));
|
|
}
|
|
|
|
public function edit(string $uuid)
|
|
{
|
|
ReportManager::ensureEditAccess();
|
|
$manager = ReportManager::fromReport($uuid);
|
|
|
|
$view = $manager->check();
|
|
if ($view) {
|
|
return $view;
|
|
}
|
|
|
|
$manager->lockStudyIfRequired();
|
|
$study = $manager->getStudy();
|
|
$report = $manager->getReport();
|
|
|
|
return view('staff.reports.create', compact('study', 'report'));
|
|
}
|
|
|
|
public function view(string $uuid)
|
|
{
|
|
ReportManager::ensureDownloadAccess();
|
|
$manager = ReportManager::fromReport($uuid);
|
|
$title = 'Report Quick View ' . $manager->getStudy()->getPatientDemographic();
|
|
$report = $manager->getReportForViewing();
|
|
$copy_button = false;
|
|
if ($report->isFinalized()) {
|
|
$stamper = new StampService($report->read_by_id);
|
|
$signature = $stamper->hasSignatureImage() ? $stamper->signatureImageUrl() : null;
|
|
$notice = null;
|
|
$copy_button = true;
|
|
} else {
|
|
$signature = null;
|
|
$notice = 'This is a preliminary radiology interpretation that has not been finalized or approved by a radiologist. It is not intended for diagnostic purposes.';
|
|
}
|
|
|
|
return view('staff.reports.viewer.html-report', compact('report', 'title', 'signature', 'notice', 'copy_button'));
|
|
}
|
|
}
|