radfusion/app/Http/Controllers/Staff/AssignmentController.php
2025-01-11 02:12:18 +06:00

76 lines
2.8 KiB
PHP

<?php
namespace App\Http\Controllers\Staff;
use App\DAL\Radiologists;
use App\Domain\ACL\Permission;
use App\Domain\ACL\Role;
use App\Domain\Report\ReportStatus;
use App\Http\Controllers\HashidControllerBase;
use App\Http\Requests\AssignPhysicianRequest;
use App\Models\Study;
use App\Models\User;
use App\Services\AuditTrail\Activity;
use Carbon\Carbon;
class AssignmentController extends HashidControllerBase
{
public function show()
{
abort_unless(auth()->user()->may(Permission::AssignRadiologist), 403);
$this->decodeKeys();
$study = Study::with('assignedPhysicians')->findOrFail($this->key);
$rads = User::active()->role(Role::Radiologist)->get(['id', 'display_name', 'profile_photo_path', 'first_name', 'last_name', 'created_at']);
$stats = Radiologists::worklist_stats(3, ReportStatus::Finalized->value);
foreach ($stats as $rad) {
$found = $rads->where('id', $rad->id)->first();
if ($found) {
$found->info['workload'] = $rad->workload;
$found->info['last_seen'] = ($rad->last_seen ?? Carbon::now()->addHours(-random_int(1, 36)))->diffForHumans();
}
}
return view('staff.studies.assign-form', compact('study', 'rads'));
}
public function remove(AssignPhysicianRequest $request)
{
abort_unless(auth()->user()->may(Permission::AssignRadiologist), 403);
$this->decodeKeys();
$study = Study::with('assignedPhysicians')->findOrFail($this->key);
$user = User::active()->findOrFail($request->input('rad_id'));
if ($study->isAssigned($user)) {
$study->assignedPhysicians()->detach($user->id);
if ($study->assignedPhysicians->count() === 0) {
$study->update(['assigned_at' => null]);
}
audit()
->did(Activity::Unassign_Physician)
->notes("Unassigned: {$user->display_name}")
->on($study)
->log();
}
return redirect()->route('staff.worklist.index')->with('success', 'Removed assignment');
}
public function save(AssignPhysicianRequest $request)
{
abort_unless(auth()->user()->may(Permission::AssignRadiologist), 403);
$this->decodeKeys();
$study = Study::with('assignedPhysicians')->findOrFail($this->key);
$rad = User::active()->findOrFail($request->input('rad_id'));
$study->assignedPhysicians()->attach($rad->id);
$study->update(['assigned_at' => now()]);
audit()
->did(Activity::Assign_Physician)
->on($study)
->notes("Assigned: {$rad->display_name}")
->log();
return redirect()->route('staff.worklist.index')->with('success', "Assigned study to {$rad->display_name}");
}
}