@auth @php $global=(bool)auth()->user()->is_platform_admin; $membership=\App\Models\Hms\Membership::where('user_id',auth()->id()) ->when(!$global,fn($q)=>$q->orderBy('id')) ->when($global && session('hms_organization_id'),fn($q)=>$q->where('organization_id',session('hms_organization_id'))) ->first(); if($global && session('hms_organization_id')) { $selectedOrg=\App\Models\Hms\Organization::find(session('hms_organization_id')); if($selectedOrg) $membership=(object)['organization_id'=>$selectedOrg->id,'facility_id'=>null,'role'=>'admin']; } $role=$membership?->role; $canAdmin=$global||$role==='admin'; $hasCustomAccess=($membership?->custom_access??false) && !$canAdmin; $canClinical=$role==='physician'; $canNurse=$role==='nurse'; $canLab=$role==='laboratory'; $canPharmacy=$role==='pharmacist'; $canReception=in_array($role,['receptionist','organization_manager'],true); if($hasCustomAccess){ $canClinical=$canClinical && \App\Services\Hms\OrganizationAccess::allows(auth()->user(),(int)$membership->organization_id,'hms.encounters.index'); $canNurse=$canNurse && \App\Services\Hms\OrganizationAccess::allows(auth()->user(),(int)$membership->organization_id,'hms.triage.index'); $canLab=$canLab && \App\Services\Hms\OrganizationAccess::allows(auth()->user(),(int)$membership->organization_id,'hms.laboratory.index'); $canPharmacy=$canPharmacy && \App\Services\Hms\OrganizationAccess::allows(auth()->user(),(int)$membership->organization_id,'hms.pharmacy.index'); } $queueCount=0; $admissionAlerts=0; if($membership && in_array($role,['nurse','organization_manager','admin'],true)){ $admissionAlerts=\App\Models\Hms\Admission::where('organization_id',$membership->organization_id) ->when($membership->facility_id,fn($q)=>$q->where('facility_id',$membership->facility_id)) ->where('status','recommended')->count(); } if($membership && ($canNurse||$canClinical||$canLab)){ $orgId=$membership->organization_id; $facilityId=$membership->facility_id; $visits=\App\Models\Hms\Appointment::where('organization_id',$orgId) ->when($facilityId,fn($q)=>$q->where('facility_id',$facilityId)); if($canNurse){ $queueCount=(clone $visits)->where('status','checked_in') ->whereNotIn('id',\App\Models\Hms\TriageRecord::where('organization_id',$orgId)->select('appointment_id'))->count(); }elseif($canClinical){ $queueCount=(clone $visits)->where('physician_user_id',auth()->id())->where('status','checked_in') ->whereIn('id',\App\Models\Hms\TriageRecord::where('organization_id',$orgId)->select('appointment_id'))->count(); $queueCount+=\App\Models\Hms\Encounter::where('organization_id',$orgId)->where('clinician_user_id',auth()->id())->where('status','open') ->when($facilityId,fn($q)=>$q->where('facility_id',$facilityId)) ->whereIn('id',\App\Models\Hms\LabOrder::where('organization_id',$orgId)->where('status','result_recorded')->select('encounter_id')) ->whereNotIn('id',\App\Models\Hms\LabOrder::where('organization_id',$orgId)->where('status','!=','result_recorded')->select('encounter_id'))->count(); }elseif($canLab){ $queueCount=\App\Models\Hms\LabOrder::where('organization_id',$orgId)->whereIn('status',['ordered','arrived']) ->whereIn('encounter_id',\App\Models\Hms\Encounter::where('organization_id',$orgId) ->when($facilityId,fn($q)=>$q->where('facility_id',$facilityId))->select('id'))->count(); } } $notificationItems=[]; if($membership){ $scopeOrg=$membership->organization_id; $scopeFacility=$membership->facility_id; if($admissionAlerts>0){ $notificationItems[]=['label'=>'Admission recommendations awaiting bed allocation','count'=>$admissionAlerts,'route'=>'hms.admissions.index']; } if($canNurse){ $pendingTriage=\App\Models\Hms\Appointment::where('organization_id',$scopeOrg) ->when($scopeFacility,fn($q)=>$q->where('facility_id',$scopeFacility)) ->where('status','checked_in') ->whereNotIn('id',\App\Models\Hms\TriageRecord::where('organization_id',$scopeOrg)->select('appointment_id'))->count(); if($pendingTriage>0)$notificationItems[]=['label'=>'Patients awaiting triage','count'=>$pendingTriage,'route'=>'hms.queues.index']; } if($canClinical){ $pendingConsultations=\App\Models\Hms\Appointment::where('organization_id',$scopeOrg) ->when($scopeFacility,fn($q)=>$q->where('facility_id',$scopeFacility)) ->where('physician_user_id',auth()->id())->where('status','checked_in') ->whereIn('id',\App\Models\Hms\TriageRecord::where('organization_id',$scopeOrg)->select('appointment_id'))->count(); if($pendingConsultations>0)$notificationItems[]=['label'=>'Patients awaiting consultation','count'=>$pendingConsultations,'route'=>'hms.queues.index']; } if($canLab){ $pendingLabs=\App\Models\Hms\LabOrder::where('organization_id',$scopeOrg)->whereIn('status',['ordered','arrived']) ->whereIn('encounter_id',\App\Models\Hms\Encounter::where('organization_id',$scopeOrg) ->when($scopeFacility,fn($q)=>$q->where('facility_id',$scopeFacility))->select('id'))->count(); if($pendingLabs>0)$notificationItems[]=['label'=>'Laboratory requests awaiting action','count'=>$pendingLabs,'route'=>'hms.queues.index']; } if($canPharmacy){ $pendingRx=\App\Models\Hms\Prescription::where('organization_id',$scopeOrg)->where('fulfillment','internal')->where('status','pending') ->whereIn('encounter_id',\App\Models\Hms\Encounter::where('organization_id',$scopeOrg) ->when($scopeFacility,fn($q)=>$q->where('facility_id',$scopeFacility))->select('id'))->count(); if($pendingRx>0)$notificationItems[]=['label'=>'Prescriptions awaiting dispensing','count'=>$pendingRx,'route'=>'hms.pharmacy.index']; } } if($membership && \Illuminate\Support\Facades\Schema::hasTable('hms_shift_requests')) { $pendingShiftRequests=\Illuminate\Support\Facades\DB::table('hms_shift_requests as r')->join('hms_shifts as s','s.id','=','r.shift_id') ->where('r.organization_id',$membership->organization_id) ->when($membership->facility_id,fn($q)=>$q->where('s.facility_id',$membership->facility_id)); if(in_array($role,['organization_manager','branch_manager'],true)){ $n=(clone $pendingShiftRequests)->whereIn('r.status',['pending','awaiting_approval'])->count(); if($n)$notificationItems[]=['label'=>'Shift requests awaiting approval','count'=>$n,'route'=>'hms.shifts.index']; } $n=(clone $pendingShiftRequests)->whereIn('r.type',['swap','coverage'])->where('r.status','open')->where('r.requester_id','!=',auth()->id()) ->whereExists(function($q)use($role){$q->selectRaw('1')->from('hms_shift_assignments as a')->whereColumn('a.shift_id','r.shift_id')->where('a.role',$role);}) ->count(); if($n)$notificationItems[]=['label'=>'Colleague shift swap / coverage offers','count'=>$n,'route'=>'hms.shifts.index']; } if($membership && \Illuminate\Support\Facades\Schema::hasTable('hms_staff_leaves') && in_array($role,['admin','organization_manager','branch_manager'],true)) { $leaveScope=\Illuminate\Support\Facades\DB::table('hms_staff_leaves')->where('organization_id',$membership->organization_id) ->when($membership->facility_id,fn($q,$id)=>$q->where('facility_id',$id)); $pending=(clone $leaveScope)->where('status','pending')->where('user_id','!=',auth()->id())->count(); if($pending)$notificationItems[]=['label'=>'Staff leave requests awaiting review','count'=>$pending,'route'=>'hms.staff-leave.index']; $needed=\Illuminate\Support\Facades\DB::table('hms_leave_covers as c')->join('hms_shifts as s','s.id','=','c.shift_id') ->where('s.organization_id',$membership->organization_id)->when($membership->facility_id,fn($q,$id)=>$q->where('s.facility_id',$id)) ->where('c.status','needed')->where('s.ends_at','>',now())->count(); if($needed)$notificationItems[]=['label'=>'Leave-related shifts requiring cover','count'=>$needed,'route'=>'hms.staff-leave.index']; } $chatMember=$membership && \Illuminate\Support\Facades\Schema::hasTable('hms_chat_rooms') ? \App\Services\Hms\ChatAccess::member((int)$membership->organization_id,(int)auth()->id()) : null; $chatUnread=$chatMember ? \App\Services\Hms\ChatAccess::unread($chatMember) : 0; if($chatUnread) $notificationItems[]=['label'=>'Unread staff chat messages','count'=>$chatUnread,'route'=>'hms.chat.index']; $notificationTotal=array_sum(array_column($notificationItems,'count')); $menu=[ ['route'=>'hms.dashboard','name'=>'Dashboard','icon'=>'home','show'=>true], ['route'=>'hms.help.index','name'=>'Help centre','icon'=>'audit','show'=>true], ['route'=>'hms.analytics','name'=>'Analysis & insights','icon'=>'audit','show'=>true], ['route'=>'hms.queues.index','name'=>'My queue','icon'=>'visit','show'=>$canNurse||$canClinical||$canLab||$role==='organization_manager'], ['route'=>'hms.shifts.index','name'=>'Shifts & swaps','icon'=>'calendar','show'=>true], ['route'=>'hms.presence.index','name'=>'Staff presence','icon'=>'users','show'=>(bool)$chatMember], ['route'=>'hms.chat.index','name'=>'Staff chat','icon'=>'users','show'=>(bool)$chatMember], ['route'=>'hms.staff-leave.index','name'=>'Staff leave','icon'=>'calendar','show'=>true], ['route'=>'hms.admissions.index','name'=>'Admissions & beds','icon'=>'building','show'=>in_array($role,['physician','nurse','organization_manager','admin','receptionist'],true)], ['route'=>'hms.visits.index','name'=>'Visits','icon'=>'visit','show'=>true], ['route'=>'hms.crm.index','name'=>'Patient CRM','icon'=>'users','show'=>$canReception||$canAdmin], ['route'=>'hms.patients.index','name'=>'Patients','icon'=>'patients','show'=>true], ['route'=>'hms.telemedicine.index','name'=>'Telemedicine','icon'=>'calendar','show'=>$canReception||$canClinical||$canAdmin], ['route'=>'hms.appointments.index','name'=>'Appointments','icon'=>'calendar','show'=>$canReception||$canClinical||$canNurse], ['route'=>'hms.triage.index','name'=>'Triage','icon'=>'heart','show'=>$canNurse||$canClinical], ['route'=>'hms.encounters.index','name'=>'Consultations','icon'=>'heart','show'=>$canClinical], ['route'=>'hms.sick-certificates.directory','name'=>'Sick-leave certificates','icon'=>'visit','show'=>$canClinical||$canAdmin], ['route'=>'hms.laboratory.index','name'=>'Laboratory','icon'=>'flask','show'=>$canLab||$canClinical], ['route'=>'hms.lab-tests.index','name'=>'Lab test catalogue','icon'=>'flask','show'=>$canAdmin||$role==='branch_manager'], ['route'=>'hms.pharmacy.index','name'=>'Pharmacy','icon'=>'pill','show'=>$canPharmacy||$canClinical], ['route'=>'hms.finance.index','name'=>'Billing & finance','icon'=>'audit','show'=>$canAdmin||$role==='organization_manager'||$role==='receptionist'], ['route'=>'hms.finance.operations','name'=>'Expenses & insurance','icon'=>'audit','show'=>$canAdmin||$role==='organization_manager'], ['route'=>'hms.finance.report','name'=>'Financial report','icon'=>'audit','show'=>$canAdmin||$role==='organization_manager'], ['route'=>'hms.inventory.index','name'=>'Inventory & procurement','icon'=>'building','show'=>$canAdmin||$role==='organization_manager'||$canPharmacy||$canLab||$role==='procurement_officer'], ['route'=>'hms.facilities.index','name'=>'Branches & facilities','icon'=>'building','show'=>$canAdmin||in_array($role,['organization_manager','branch_manager'],true)], ['route'=>'hms.departments.index','name'=>'Staff structure & heads','icon'=>'building','show'=>$canAdmin], ['route'=>'hms.outlook.index','name'=>'Outlook email & calendar','icon'=>'calendar','show'=>$canAdmin], ['route'=>'hms.microsoft.index','name'=>'Microsoft sign-in','icon'=>'users','show'=>$canAdmin], ['route'=>'hms.roles.index','name'=>'Roles & permissions','icon'=>'users','show'=>$canAdmin], ['route'=>'hms.staff.index','name'=>'Staff accounts','icon'=>'users','show'=>$canAdmin||$role==='organization_manager'], ['route'=>'hms.employees.index','name'=>'Employees','icon'=>'users','show'=>$canAdmin||in_array($role,['organization_manager','branch_manager'],true)], ['route'=>'hms.organization-settings','name'=>'Organisation settings','icon'=>'building','show'=>$canAdmin||$role==='organization_manager'], ['route'=>'hms.imports.index','name'=>'Data imports','icon'=>'audit','show'=>$canAdmin||in_array($role,['organization_manager','physician'],true)], ['route'=>'hms.history.index','name'=>'Historical records','icon'=>'audit','show'=>in_array($role,['physician','nurse','laboratory','pharmacist'],true)], ['route'=>'hms.audit.index','name'=>'Audit','icon'=>'audit','show'=>$canAdmin], ['route'=>'hms.organizations.index','name'=>'Organizations','icon'=>'building','show'=>$global] ]; if($hasCustomAccess){ $menu=array_map(function($item) use ($membership){ if(!in_array($item['route'],['hms.dashboard','hms.help.index'],true))$item['show']=\App\Services\Hms\OrganizationAccess::allows(auth()->user(),(int)$membership->organization_id,$item['route']); return $item; },$menu); $notificationItems=array_values(array_filter($notificationItems,fn($item)=>!isset(config('hms_permissions')[$item['route']]) || \App\Services\Hms\OrganizationAccess::allows(auth()->user(),(int)$membership->organization_id,$item['route']))); $notificationTotal=array_sum(array_column($notificationItems,'count')); } if($membership && !$global){ $menu=array_map(function($item) use ($membership){ $module=\App\Services\Hms\ModuleAccess::moduleForRoute($item['route']); if($module && !\App\Services\Hms\ModuleAccess::enabled((int)$membership->organization_id,$module))$item['show']=false; return $item; },$menu); } $menuBundles=[ 'Overview'=>['icon'=>'home','routes'=>['hms.dashboard','hms.help.index','hms.analytics','hms.queues.index']], 'Patient care'=>['icon'=>'heart','routes'=>['hms.patients.index','hms.appointments.index','hms.visits.index','hms.triage.index','hms.encounters.index','hms.sick-certificates.directory','hms.laboratory.index','hms.admissions.index','hms.telemedicine.index','hms.history.index','hms.crm.index']], 'Medicines & stock'=>['icon'=>'pill','routes'=>['hms.pharmacy.index','hms.inventory.index','hms.lab-tests.index']], 'Staff'=>['icon'=>'users','routes'=>['hms.employees.index','hms.staff.index','hms.shifts.index','hms.staff-leave.index','hms.presence.index','hms.chat.index']], 'Finance'=>['icon'=>'audit','routes'=>['hms.finance.index','hms.finance.operations','hms.finance.report']], 'Administration'=>['icon'=>'building','routes'=>['hms.organization-settings','hms.facilities.index','hms.departments.index','hms.roles.index','hms.microsoft.index','hms.outlook.index','hms.imports.index','hms.audit.index','hms.organizations.index']], ]; $activeMenuRoute=match(true){ request()->routeIs('hms.organization-settings','hms.organization-settings.*')=>'hms.organization-settings', request()->routeIs('hms.finance.operations','hms.finance.report')=>request()->route()->getName(), request()->routeIs('hms.finance.*')=>'hms.finance.index', request()->routeIs('hms.imports.*')=>'hms.imports.index', request()->routeIs('hms.history.*')=>'hms.history.index', request()->routeIs('hms.chat.*')=>'hms.chat.index', request()->routeIs('hms.presence.*')=>'hms.presence.index', request()->routeIs('hms.staff-leave.*')=>'hms.staff-leave.index', request()->routeIs('hms.sick-certificates.*')=>'hms.sick-certificates.directory', default=>(collect($menu)->first(fn($item)=>str_ends_with($item['route'],'.index') && request()->routeIs(str_replace('.index','.*',$item['route'])))['route']??request()->route()?->getName()), }; @endphp

@yield('title','Dashboard')

@if($global)
@csrf
@else {{ \App\Models\Hms\Organization::find($membership?->organization_id)?->name ?? 'No organization' }} @endif @if($chatMember) Staff chat{{ $chatUnread?' · '.$chatUnread.' unread':'' }} @endif {{ auth()->user()->name }}
@if(session('warning'))@endif @if(session('mail_status'))
{{ session('mail_status') }}
@endif @if(session('status'))
{{ session('status') }}
@endif @if($errors->any())
    @foreach($errors->all() as $error)
  • {{ $error }}
  • @endforeach
@endif @if($admissionAlerts>0 && !request()->routeIs('hms.admissions.index'))
{{ $admissionAlerts }} admission {{ $admissionAlerts===1?'recommendation':'recommendations' }} awaiting bed allocation.Allocate beds
@endif @yield('content')

HMS demonstration environment · Synthetic records only · Not for clinical use

@else
@yield('content')
@endauth @auth @endauth