{{-- resources/views/dashboard.blade.php --}} @extends('layouts.app') @section('title', 'Dashboard') @section('page-header')

Dashboard

@if(auth()->user()->isSuperAdmin() || auth()->user()->isAdmin())
@csrf
@endif
@endsection @php // Defensive defaults — the controller always passes these, but we // guard against null so `?? 0` never masks a missing variable. $superAdmin = $superAdmin ?? []; $complianceRisk = $complianceRisk ?? []; $qualityManagement = $qualityManagement ?? []; $documentManagement = $documentManagement ?? []; $trainingManagement = $trainingManagement ?? []; @endphp @section('content')
{{-- HERO + WORK QUEUE --}}
Quality operations centre

Good to see you, {{ \Illuminate\Support\Str::of(auth()->user()->name)->explode(' ')->first() }}.

Keep documents moving, stay ahead of review dates, and resolve the work that needs your attention.

{{ auth()->user()->roles->first()->display_name ?? 'User' }} {{ now()->format('D, d M Y') }} Last synced {{ now()->format('H:i') }}
{{-- ═══════════════════════════════════════════════════════ SUPER ADMIN ONLY SECTIONS ═══════════════════════════════════════════════════════ --}} @if(auth()->user()->isSuperAdmin()) {{-- ───────────────────────────────────────────── TOP COMPLIANCE RISK (RAG cards) ───────────────────────────────────────────── --}} @if(!empty($complianceRisk))
Top Compliance Risks Auditor Priority
RAG thresholds: green < amber < red
@foreach($complianceRisk as $risk) @php $ragColor = $risk['rag'] === 'red' ? 'danger' : ($risk['rag'] === 'amber' ? 'warning' : 'success'); $ragIcon = $risk['rag'] === 'red' ? 'fa-exclamation-circle' : ($risk['rag'] === 'amber' ? 'fa-exclamation-triangle' : 'fa-check-circle'); $url = !empty($risk['route']) && \Route::has($risk['route']) ? route($risk['route'], $risk['query'] ?? []) : null; @endphp @endforeach
@endif {{-- ───────────────────────────────────────────── SYSTEM / SUPER ADMIN VIEW ───────────────────────────────────────────── --}} @if(!empty($superAdmin)) {{-- User & Role Management --}}
Total Users
{{ $superAdmin['totalUsers'] ?? ($superAdmin['users']['total'] ?? 0) }}
Active Users
{{ $superAdmin['activeUsers'] ?? ($superAdmin['users']['active'] ?? 0) }}
@php $totalUsers = $superAdmin['totalUsers'] ?? ($superAdmin['users']['total'] ?? 0); $activeUsers = $superAdmin['activeUsers'] ?? ($superAdmin['users']['active'] ?? 0); $pct = $totalUsers > 0 ? round(($activeUsers / $totalUsers) * 100) : 0; @endphp {{ $pct }}% active
Total Roles
{{ $superAdmin['totalRoles'] ?? ($superAdmin['users']['roles'] ?? 0) }}
{{-- System Health --}}
System Health Operational
Storage
@php $storage = $superAdmin['systemHealth']['storage'] ?? ($superAdmin['health']['storage'] ?? []); $usedPct = $storage['used_percent'] ?? 0; $bar = $usedPct > 80 ? 'danger' : ($usedPct > 60 ? 'warning' : 'success'); @endphp
{{ $usedPct }}% used · Free {{ $storage['free'] ?? '—' }}
Backup
@php $backup = $superAdmin['systemHealth']['backup'] ?? ($superAdmin['health']['backup'] ?? []); $bs = $backup['status'] ?? 'unknown'; @endphp {{ ucfirst($bs) }}
Last: {{ $backup['last_backup'] ?? '—' }}
Count: {{ $backup['backup_count'] ?? 0 }} backups
Integrations
@php $integrations = $superAdmin['systemHealth']['integrations'] ?? ($superAdmin['health']['integrations'] ?? []); @endphp @foreach($integrations as $integration) @php $st = $integration['status'] ?? 'not_configured'; $cls = $st === 'operational' ? 'success' : ($st === 'not_configured' ? 'secondary' : 'danger'); @endphp
{{ $integration['name'] }}
{{ $st === 'operational' ? 'Operational' : ucfirst(str_replace('_', ' ', $st)) }}
@endforeach
{{-- Audit Trail Heatmap --}}
Audit Trail Heatmap (Last 30 Days)
@php $ce = $superAdmin['criticalEvents'] ?? ($superAdmin['audit']['critical'] ?? []); @endphp
{{ $ce['document_edits'] ?? 0 }} Document Edits
{{ $ce['document_deletions'] ?? 0 }} Deletions
{{ $ce['failed_logins'] ?? 0 }} Failed Logins
{{ $ce['permission_changes'] ?? 0 }} Permission Changes
{{ $ce['sop_modifications'] ?? 0 }} SOP Modifications
{{-- Department Performance Scorecard --}}
Department Performance Scorecard
@php $rank = 1; @endphp @php $departments = $superAdmin['departmentPerformance'] ?? ($superAdmin['departments'] ?? []); @endphp @forelse($departments as $dept) @empty @endforelse
# Department Docs Approved Draft Rejected Overdue Expired Score Status
{{ $rank++ }} {{ $dept['department_name'] }}
{{ $dept['department_code'] }}
{{ $dept['total_documents'] }} {{ $dept['approved_documents'] }} {{ $dept['draft_documents'] }} {{ $dept['rejected_documents'] }} {{ $dept['overdue_reviews'] }} {{ $dept['expired_documents'] }} @php $scoreClass = $dept['compliance_score'] >= 90 ? 'text-success' : ($dept['compliance_score'] >= 75 ? 'text-primary' : ($dept['compliance_score'] >= 60 ? 'text-warning' : 'text-danger')); @endphp {{ $dept['compliance_score'] }}% @php $sc = ['excellent'=>'success','good'=>'primary','fair'=>'warning','poor'=>'danger','critical'=>'danger']; @endphp {{ ucfirst($dept['status']) }}
No department data available.
@endif {{-- ───────────────────────────────────────────── MODULE 1: QUALITY MANAGEMENT ───────────────────────────────────────────── --}} @if(!empty($qualityManagement))
Module 1 — Quality Management
Open Quality Events by Type
@foreach(($qualityManagement['open_events'] ?? []) as $e) @endforeach
CAPA Aging
@php $aging = $qualityManagement['capa_aging'] ?? ['0_30'=>0,'31_60'=>0,'60_plus'=>0]; @endphp
{{ $aging['0_30'] }}
0–30 days
{{ $aging['31_60'] }}
31–60 days
{{ $aging['60_plus'] }}
60+ days

@php $eff = $qualityManagement['effectiveness'] ?? ['due'=>0,'passed'=>0,'failed'=>0,'rate'=>0]; @endphp
Effectiveness Failure Rate
{{ $eff['rate'] }}%
{{ $eff['failed'] }} failed of {{ $eff['passed'] + $eff['failed'] }} completed
Checks Due
{{ $eff['due'] }}
Root Cause Pareto — Top 5 Deviation Causes
@if(!empty($qualityManagement['pareto'])) @php $maxP = max(array_column($qualityManagement['pareto'], 'count')); @endphp @foreach($qualityManagement['pareto'] as $rc)
{{ $rc['label'] }}
{{ $rc['count'] }}
@endforeach @else
No root cause data available.
@endif
@endif {{-- ───────────────────────────────────────────── MODULE 2: DOCUMENT MANAGEMENT ───────────────────────────────────────────── --}} @if(!empty($documentManagement))
Module 2 — Document Management (DMS)
{{-- Funnel --}}
@foreach(($documentManagement['funnel'] ?? []) as $f) @endforeach
{{-- Donut chart --}}
Documents by Status
Draft Review Approved Expired Archived
{{-- Top SOPs --}}
Most Viewed / Downloaded SOPs
@if(\Route::has('lab-sop.index')) View All @endif
@if(!empty($documentManagement['top_sops']))
@foreach($documentManagement['top_sops'] as $i => $sop) @endforeach
# SOP Views Downloads
{{ $i + 1 }} {{ \Illuminate\Support\Str::limit($sop['name'], 40) }} {{ $sop['views'] }} {{ $sop['downloads'] }}
@else

No SOP data available.

@endif
@endif {{-- ───────────────────────────────────────────── MODULE 3: TRAINING MANAGEMENT (LMS) ───────────────────────────────────────────── --}} @if(!empty($trainingManagement))
Module 3 — Training Management (LMS)
Overall Training Compliance
{{ $trainingManagement['compliance_pct'] }}
Training Due in Next 7 Days
{{ $trainingManagement['due_next_7'] }}
Training Due in Next 30 Days
{{ $trainingManagement['due_next_30'] }}
Training Compliance by Department
@if(!empty($trainingManagement['by_department'])) @else
No department data available.
@endif
Users with Overdue Training
@if(\Route::has('training.trainings.index')) View All @endif
@if(!empty($trainingManagement['overdue_users']))
@foreach($trainingManagement['overdue_users'] as $u) @endforeach
Name Department SOP / Topic Days Overdue
{{ $u['name'] }} {{ $u['department'] }} {{ \Illuminate\Support\Str::limit($u['sop'], 30) }} {{ $u['days_overdue'] }}
@else

No overdue training.

@endif
@endif @endif {{-- END SUPER ADMIN --}}
{{-- /.qms-dashboard --}} @endsection @push('styles') @endpush @push('scripts') @endpush