Gate specialty mutate CTAs on Care abilities, not only module manage.
Deploy Ladill Care / deploy (push) Successful in 1m3s

Nurses can manage limited specialties but lack consultations.manage, so
hide Start/stage/chart edits that 403 while keeping queue/vitals/billing
aligned with what those routes actually authorize.

Co-authored-by: Cursor <cursoragent@cursor.com>
This commit is contained in:
isaacclad
2026-07-18 18:45:00 +00:00
co-authored by Cursor
parent 9e32eb32c5
commit 8a5330d3d2
20 changed files with 312 additions and 38 deletions
@@ -77,7 +77,13 @@ class EmergencyWorkspaceController extends Controller
SpecialtyModuleService $modules,
EmergencyVitalsService $vitals,
): RedirectResponse {
$this->authorizeAbility($request, 'consultations.manage');
$permissions = app(\App\Services\Care\CarePermissions::class);
$member = $this->member($request);
abort_unless(
$permissions->can($member, 'vitals.manage')
|| $permissions->can($member, 'consultations.manage'),
403,
);
$this->assertEmergencyManage($request, $modules);
$this->assertVisit($request, $visit);
@@ -637,8 +637,20 @@ class SpecialtyModuleController extends Controller
$services = $shell->provisionedServices($organization, $module);
$permissions = app(\App\Services\Care\CarePermissions::class);
// Match every ability that mutate routes actually check — module canManage alone is not enough.
$canConsult = $permissions->can($member, 'consultations.manage') && $canManageSpecialty;
$canAdvanceStage = $canConsult;
$canStartConsultation = $canConsult;
$canCallNext = $canManageSpecialty;
$canManageClinical = $canManageSpecialty;
$canManageVitals = $canManageSpecialty && (
$permissions->can($member, 'vitals.manage')
|| $permissions->can($member, 'consultations.manage')
);
$canManageQueue = $permissions->can($member, 'appointments.manage') && $canManageSpecialty;
$canBookAppointments = $permissions->can($member, 'appointments.manage');
$canViewPatients = $permissions->can($member, 'patients.view');
$canViewAppointments = $permissions->can($member, 'appointments.view');
$branchLabel = $branchId
? (string) (\App\Models\Branch::owned($owner)->whereKey($branchId)->value('name') ?? '')
: '';
@@ -880,7 +892,15 @@ class SpecialtyModuleController extends Controller
'practitionerScope' => $practitionerScope,
'lockToPractitioner' => $practitionerScope !== null,
'canConsult' => $canConsult,
'canAdvanceStage' => $canAdvanceStage,
'canStartConsultation' => $canStartConsultation,
'canCallNext' => $canCallNext,
'canManageClinical' => $canManageClinical,
'canManageVitals' => $canManageVitals,
'canManageQueue' => $canManageQueue,
'canBookAppointments' => $canBookAppointments,
'canViewPatients' => $canViewPatients,
'canViewAppointments' => $canViewAppointments,
'canManageSpecialty' => $canManageSpecialty,
'canViewSpecialty' => $canViewSpecialty,
'canReferSpecialty' => $canReferSpecialty,