Gate specialty modules by staff role with view and refer levels.
Deploy Ladill Care / deploy (push) Successful in 37s

Give nurses, lab techs, pharmacists, and GPs broad access to day-to-day modules, keep restricted specialties for specialists (with support nurses), and let GPs view results or refer without full clinical edit.

Co-authored-by: Cursor <cursoragent@cursor.com>
This commit is contained in:
isaacclad
2026-07-18 18:03:47 +00:00
co-authored by Cursor
parent 7989ab9184
commit 2cff8fdd6c
13 changed files with 762 additions and 89 deletions
@@ -37,6 +37,12 @@ class DentistryWorkspaceController extends Controller
abort_unless($modules->memberCanAccess($organization, $this->member($request), 'dentistry'), 403);
}
protected function assertDentistryManage(Request $request, SpecialtyModuleService $modules): void
{
$organization = $this->organization($request);
abort_unless($modules->memberCanManage($organization, $this->member($request), 'dentistry'), 403);
}
protected function assertVisit(Request $request, Visit $visit): void
{
abort_unless($visit->organization_id === $this->organization($request)->id, 404);
@@ -50,7 +56,7 @@ class DentistryWorkspaceController extends Controller
DentalChartService $charts,
): RedirectResponse {
$this->authorizeAbility($request, 'consultations.manage');
$this->assertDentistryAccess($request, $modules);
$this->assertDentistryManage($request, $modules);
$this->assertVisit($request, $visit);
$validated = $request->validate([
@@ -93,7 +99,7 @@ class DentistryWorkspaceController extends Controller
DentalTreatmentPlanService $plans,
): RedirectResponse {
$this->authorizeAbility($request, 'consultations.manage');
$this->assertDentistryAccess($request, $modules);
$this->assertDentistryManage($request, $modules);
$this->assertVisit($request, $visit);
$validated = $request->validate([
@@ -128,7 +134,7 @@ class DentistryWorkspaceController extends Controller
DentalTreatmentPlanService $plans,
): RedirectResponse {
$this->authorizeAbility($request, 'consultations.manage');
$this->assertDentistryAccess($request, $modules);
$this->assertDentistryManage($request, $modules);
$this->assertVisit($request, $visit);
$organization = $this->organization($request);
@@ -153,7 +159,7 @@ class DentistryWorkspaceController extends Controller
DentalProcedureService $procedures,
): RedirectResponse {
$this->authorizeAbility($request, 'consultations.manage');
$this->assertDentistryAccess($request, $modules);
$this->assertDentistryManage($request, $modules);
$this->assertVisit($request, $visit);
$validated = $request->validate([
@@ -194,7 +200,7 @@ class DentistryWorkspaceController extends Controller
DentalVisitNoteService $notes,
): RedirectResponse {
$this->authorizeAbility($request, 'consultations.manage');
$this->assertDentistryAccess($request, $modules);
$this->assertDentistryManage($request, $modules);
$this->assertVisit($request, $visit);
$validated = $request->validate([
@@ -225,7 +231,7 @@ class DentistryWorkspaceController extends Controller
DentalProcedureService $procedures,
): RedirectResponse {
$this->authorizeAbility($request, 'consultations.manage');
$this->assertDentistryAccess($request, $modules);
$this->assertDentistryManage($request, $modules);
$this->assertVisit($request, $visit);
$validated = $request->validate([
@@ -335,7 +341,7 @@ class DentistryWorkspaceController extends Controller
DentalChartService $charts,
): RedirectResponse {
$this->authorizeAbility($request, 'consultations.manage');
$this->assertDentistryAccess($request, $modules);
$this->assertDentistryManage($request, $modules);
$this->assertVisit($request, $visit);
$validated = $request->validate([
@@ -371,7 +377,7 @@ class DentistryWorkspaceController extends Controller
DentalTreatmentPlanService $plans,
): RedirectResponse {
$this->authorizeAbility($request, 'consultations.manage');
$this->assertDentistryAccess($request, $modules);
$this->assertDentistryManage($request, $modules);
$this->assertVisit($request, $visit);
$validated = $request->validate([
@@ -408,7 +414,7 @@ class DentistryWorkspaceController extends Controller
DentalTreatmentPlanService $plans,
): RedirectResponse {
$this->authorizeAbility($request, 'consultations.manage');
$this->assertDentistryAccess($request, $modules);
$this->assertDentistryManage($request, $modules);
$this->assertVisit($request, $visit);
$organization = $this->organization($request);
@@ -435,7 +441,7 @@ class DentistryWorkspaceController extends Controller
DentalTreatmentPlanService $plans,
): RedirectResponse {
$this->authorizeAbility($request, 'consultations.manage');
$this->assertDentistryAccess($request, $modules);
$this->assertDentistryManage($request, $modules);
$this->assertVisit($request, $visit);
$validated = $request->validate([
@@ -473,7 +479,7 @@ class DentistryWorkspaceController extends Controller
DentalTreatmentPlanService $plans,
): RedirectResponse {
$this->authorizeAbility($request, 'consultations.manage');
$this->assertDentistryAccess($request, $modules);
$this->assertDentistryManage($request, $modules);
$this->assertVisit($request, $visit);
$organization = $this->organization($request);
@@ -503,7 +509,7 @@ class DentistryWorkspaceController extends Controller
DentalImagingService $imaging,
): RedirectResponse {
$this->authorizeAbility($request, 'consultations.manage');
$this->assertDentistryAccess($request, $modules);
$this->assertDentistryManage($request, $modules);
$this->assertVisit($request, $visit);
$organization = $this->organization($request);
@@ -532,7 +538,7 @@ class DentistryWorkspaceController extends Controller
SpecialtyVisitStageService $stages,
): RedirectResponse {
$this->authorizeAbility($request, 'consultations.manage');
$this->assertDentistryAccess($request, $modules);
$this->assertDentistryManage($request, $modules);
$this->assertVisit($request, $visit);
$validated = $request->validate([
@@ -564,7 +570,7 @@ class DentistryWorkspaceController extends Controller
DentalPerioService $perio,
): RedirectResponse {
$this->authorizeAbility($request, 'consultations.manage');
$this->assertDentistryAccess($request, $modules);
$this->assertDentistryManage($request, $modules);
$this->assertVisit($request, $visit);
$validated = $request->validate([
@@ -608,7 +614,7 @@ class DentistryWorkspaceController extends Controller
DentalLabCaseService $labCases,
): RedirectResponse {
$this->authorizeAbility($request, 'consultations.manage');
$this->assertDentistryAccess($request, $modules);
$this->assertDentistryManage($request, $modules);
$this->assertVisit($request, $visit);
$validated = $request->validate([
@@ -651,7 +657,7 @@ class DentistryWorkspaceController extends Controller
DentalLabCaseService $labCases,
): RedirectResponse {
$this->authorizeAbility($request, 'consultations.manage');
$this->assertDentistryAccess($request, $modules);
$this->assertDentistryManage($request, $modules);
$this->assertVisit($request, $visit);
$validated = $request->validate([
@@ -689,7 +695,7 @@ class DentistryWorkspaceController extends Controller
DentalRecallService $recalls,
): RedirectResponse {
$this->authorizeAbility($request, 'consultations.manage');
$this->assertDentistryAccess($request, $modules);
$this->assertDentistryManage($request, $modules);
$this->assertVisit($request, $visit);
$validated = $request->validate([
@@ -727,7 +733,7 @@ class DentistryWorkspaceController extends Controller
DentalRecallService $recalls,
): RedirectResponse {
$this->authorizeAbility($request, 'consultations.manage');
$this->assertDentistryAccess($request, $modules);
$this->assertDentistryManage($request, $modules);
$this->assertVisit($request, $visit);
$organization = $this->organization($request);
@@ -762,7 +768,7 @@ class DentistryWorkspaceController extends Controller
DentalRecallService $recalls,
): RedirectResponse {
$this->authorizeAbility($request, 'consultations.manage');
$this->assertDentistryAccess($request, $modules);
$this->assertDentistryManage($request, $modules);
$this->assertVisit($request, $visit);
$organization = $this->organization($request);