@extends('layouts.user') @section('title', 'Operation Dashboard') @section('content')
@can('view schedules')
Todays Schedule
{{ str_pad($todaysScheduleCount, 2, '0', STR_PAD_LEFT) }}
@endcan @can('view schedules')
Upcoming Schedule
{{ str_pad($upcomingScheduleCount, 2, '0', STR_PAD_LEFT) }}
@endcan @can('view employees')
Expired Licenses
{{ str_pad($expiredLicenses->total(), 2, '0', STR_PAD_LEFT) }}
@endcan @can('view employees')
Active Employees
{{ str_pad($employeeCount, 2, '0', STR_PAD_LEFT) }}
@endcan @can('view sites')
Total Sites
{{ str_pad($siteCount, 2, '0', STR_PAD_LEFT) }}
@endcan @can('view routes')
Strategic Routes
{{ str_pad($routeCount, 2, '0', STR_PAD_LEFT) }}
@endcan
@can('view schedules')

Patroller Operations

Today's Schedule
{{ str_pad($todaysPatrollerCount ?? 0, 2, '0', STR_PAD_LEFT) }}
Upcoming
{{ str_pad($upcomingPatrollerCount ?? 0, 2, '0', STR_PAD_LEFT) }}
Active Jobs
{{ str_pad($activePatrollerCount ?? 0, 2, '0', STR_PAD_LEFT) }}
Pending Start (Today)
{{ str_pad($pendingPatrollerCount ?? 0, 2, '0', STR_PAD_LEFT) }}
Completed (Today)
{{ str_pad($completedPatrollerCount ?? 0, 2, '0', STR_PAD_LEFT) }}
@endcan

Live Activity Feed

Monitoring Live Signals

Establishing Secure Feed...

@can('view schedules') @if(isset($cancellationRequests) && $cancellationRequests->count() > 0)

Pending Cancellation Requests

@foreach($cancellationRequests as $schedule) @foreach($schedule->employees as $emp)
{{ $emp->first_name }} {{ $emp->last_name }} requests to cancel Duty #{{ $schedule->duty_number }}
{{ $schedule->site->name }} • {{ $schedule->from_datetime->format('M d, H:i') }}
@if($emp->pivot->cancellation_reason)
"{{ $emp->pivot->cancellation_reason }}"
@endif
Requested {{ \Carbon\Carbon::parse($emp->pivot->cancellation_requested_at)->diffForHumans() }}
@csrf
@csrf
@endforeach @endforeach
@endif @endcan @can('view schedules') @if(isset($patrollerCancellationRequests) && $patrollerCancellationRequests->count() > 0)

Pending Patroller Cancellation Requests

@foreach($patrollerCancellationRequests as $schedule) @foreach($schedule->employees as $emp)
{{ $emp->first_name }} {{ $emp->last_name }} requests to cancel Patrol Duty #{{ $schedule->duty_number }}
{{ $schedule->route->name ?? 'N/A' }} • {{ \Carbon\Carbon::parse($schedule->from_time)->format('M d, H:i') }}
@if($emp->pivot->cancellation_reason)
"{{ $emp->pivot->cancellation_reason }}"
@endif
Requested {{ \Carbon\Carbon::parse($emp->pivot->cancellation_requested_at)->diffForHumans() }}
@csrf
@csrf
@endforeach @endforeach
@endif @endcan @can('view schedules')

Active Jobs

{{ $activeJobs->total() }} Live
@forelse($activeJobs as $job) @empty @endforelse
Duty # Site Employee(s) Shift Time Started At
#{{ $job->duty_number }} {{ $job->site->name }} @foreach($job->employees as $emp)
{{ substr($emp->first_name, 0, 1) }}
{{ $emp->first_name }} {{ $emp->last_name }}
@endforeach
{{ $job->from_datetime->format('H:i') }} - {{ $job->to_datetime->format('H:i') }} @foreach($job->employees as $emp) @if($emp->pivot->actual_start_at)
{{ \Carbon\Carbon::parse($emp->pivot->actual_start_at)->format('H:i') }}
@else
Not checked in
@endif @endforeach
No active jobs currently running.
@if($activeJobs->hasPages())
{{ $activeJobs->appends(['scheduled_jobs_page' => request('scheduled_jobs_page')])->links() }}
@endif

Scheduled Today (Pending Start)

{{ $scheduledJobsToday->total() }} Pending
@forelse($scheduledJobsToday as $job) @empty @endforelse
Duty # Time Site Assigned Guard Contact Actions
#{{ $job->duty_number }} {{ $job->from_datetime->format('H:i') }} {{ $job->from_datetime->diffForHumans() }} {{ $job->site->name }} @foreach($job->employees as $emp)
{{ substr($emp->first_name, 0, 1) }}
{{ $emp->first_name }} {{ $emp->last_name }}
@endforeach @if($job->employees->isEmpty()) Unassigned @endif
@foreach($job->employees as $emp)
{{ $emp->phone_number ?? '--' }}
@endforeach
@foreach($job->employees as $emp) @if($emp->phone_number) Call {{ $emp->first_name }} @endif @endforeach
No pending scheduled jobs for today.
@if($scheduledJobsToday->hasPages())
{{ $scheduledJobsToday->appends(['active_jobs_page' => request('active_jobs_page')])->links() }}
@endif

Completed Today

{{ $completedJobsToday->total() }} Done
@forelse($completedJobsToday as $job) @empty @endforelse
Duty # Site Employee(s) Shift Time Actual Hours
#{{ $job->duty_number }} {{ $job->site->name }} @foreach($job->employees as $emp)
{{ substr($emp->first_name, 0, 1) }}
{{ $emp->first_name }} {{ $emp->last_name }}
@endforeach
{{ $job->from_datetime->format('H:i') }} - {{ $job->to_datetime->format('H:i') }} @foreach($job->employees as $emp) @if($emp->pivot->actual_start_at && $emp->pivot->actual_end_at) @php $start = \Carbon\Carbon::parse($emp->pivot->actual_start_at); $end = \Carbon\Carbon::parse($emp->pivot->actual_end_at); $totalMinutes = $start->diffInMinutes($end); $hrs = floor($totalMinutes / 60); $mins = $totalMinutes % 60; @endphp
{{ sprintf('%02d:%02d', $hrs, $mins) }}
@else
Incomplete data
@endif @endforeach
No completed jobs yet today.
@if($completedJobsToday->hasPages())
{{ $completedJobsToday->appends(['completed_jobs_page' => request('completed_jobs_page')])->links() }}
@endif

Active Patroller Jobs

{{ $activePatrollerJobs->total() }} Live
@forelse($activePatrollerJobs as $job) @empty @endforelse
Duty # Route Patroller(s) Shift Time Started At
#{{ $job->duty_number }} {{ $job->route->name ?? 'N/A' }} @foreach($job->employees as $emp)
{{ substr($emp->first_name, 0, 1) }}
{{ $emp->first_name }} {{ $emp->last_name }}
@endforeach
{{ \Carbon\Carbon::parse($job->from_time)->format('H:i') }} - {{ \Carbon\Carbon::parse($job->to_time)->format('H:i') }}
{{ $job->job_started_at ? \Carbon\Carbon::parse($job->job_started_at)->format('H:i') : '--:--' }}
No active patroller jobs currently running.
@if($activePatrollerJobs->hasPages())
{{ $activePatrollerJobs->appends(['active_patroller_jobs_page' => request('active_patroller_jobs_page')])->links() }}
@endif

Scheduled Patroller Jobs (Pending)

{{ $scheduledPatrollerJobsToday->total() }} Pending
@forelse($scheduledPatrollerJobsToday as $job) @empty @endforelse
Duty # Route Patroller(s) Shift Time Actions
#{{ $job->duty_number }} {{ $job->route->name ?? 'N/A' }} @foreach($job->employees as $emp)
{{ substr($emp->first_name, 0, 1) }}
{{ $emp->first_name }} {{ $emp->last_name }}
@endforeach @if($job->employees->isEmpty()) Unassigned @endif
{{ \Carbon\Carbon::parse($job->from_time)->format('H:i') }} - {{ \Carbon\Carbon::parse($job->to_time)->format('H:i') }}
{{ \Carbon\Carbon::parse($job->from_time)->diffForHumans() }}
View
No pending patroller jobs for today.
@if($scheduledPatrollerJobsToday->hasPages())
{{ $scheduledPatrollerJobsToday->appends(['scheduled_patroller_jobs_page' => request('scheduled_patroller_jobs_page')])->links() }}
@endif

Completed Patroller Jobs (Today)

{{ $completedPatrollerJobsToday->total() }} Done
@forelse($completedPatrollerJobsToday as $job) @empty @endforelse
Duty # Route Patroller(s) Shift Time Ended At
#{{ $job->duty_number }} {{ $job->route->name ?? 'N/A' }} @foreach($job->employees as $emp)
{{ substr($emp->first_name, 0, 1) }}
{{ $emp->first_name }} {{ $emp->last_name }}
@endforeach
{{ \Carbon\Carbon::parse($job->from_time)->format('H:i') }} - {{ \Carbon\Carbon::parse($job->to_time)->format('H:i') }}
{{ $job->job_ended_at ? \Carbon\Carbon::parse($job->job_ended_at)->format('H:i') : '--:--' }}
No completed patroller jobs yet today.
@if($completedPatrollerJobsToday->hasPages())
{{ $completedPatrollerJobsToday->appends(['completed_patroller_jobs_page' => request('completed_patroller_jobs_page')])->links() }}
@endif
@endcan @can('view employees') @if((isset($upcomingBirthdays) && $upcomingBirthdays->count() > 0) || (isset($upcomingAnniversaries) && $upcomingAnniversaries->count() > 0))

Celebrations & Milestones

@if(isset($upcomingBirthdays) && $upcomingBirthdays->count() > 0)

Upcoming Birthdays

@foreach($upcomingBirthdays as $emp)
{{ substr($emp->first_name, 0, 1) }}{{ substr($emp->last_name, 0, 1) }}
{{ $emp->first_name }} {{ $emp->last_name }}
Turns {{ \Carbon\Carbon::parse($emp->dob)->age + 1 }} on {{ \Carbon\Carbon::parse($emp->dob)->format('M d') }}
@if(\Carbon\Carbon::parse($emp->dob)->format('m-d') == now()->format('m-d')) Today! @else {{ \Carbon\Carbon::parse($emp->dob)->format('M d') }} @endif
@endforeach
@endif @if(isset($upcomingAnniversaries) && $upcomingAnniversaries->count() > 0)

Work Anniversaries

@foreach($upcomingAnniversaries as $emp) @php $years = (int) \Carbon\Carbon::parse($emp->employment_date)->diffInYears(now()->addDays(7)); $years = $years == 0 ? 1 : $years; // Show 1 year if it's their first @endphp
{{ substr($emp->first_name, 0, 1) }}{{ substr($emp->last_name, 0, 1) }}
{{ $emp->first_name }} {{ $emp->last_name }}
{{ $years }} Year{{ $years > 1 ? 's' : '' }} on {{ \Carbon\Carbon::parse($emp->employment_date)->format('M d') }}
@if(\Carbon\Carbon::parse($emp->employment_date)->format('m-d') == now()->format('m-d')) Today! @else {{ \Carbon\Carbon::parse($emp->employment_date)->format('M d') }} @endif
@endforeach
@endif
@endif @endcan @if(isset($guardApplications) && $guardApplications->count() > 0)

Guard Applications

{{ $guardApplications->count() }} New
@foreach($guardApplications as $applicant) @endforeach
Name Email / Phone Message Resume Applied Date Actions
{{ $applicant->full_name }}
{{ $applicant->email }} {{ $applicant->phone }}
{{ $applicant->message ?? 'No message provided.' }}
@if($applicant->resume_path) Download @else No file @endif {{ optional($applicant->created_at)->format('M d, Y') ?? 'N/A' }}
@endif
@can('view employees')
@if(isset($expiredLicenses) && $expiredLicenses->count() > 0)

Expired Employee Licenses

@foreach($expiredLicenses as $license)
{{ substr($license->employee->first_name ?? '?', 0, 1) }}{{ substr($license->employee->last_name ?? '?', 0, 1) }}
{{ $license->employee->first_name }} {{ $license->employee->last_name }}
{{ $license->type ?? 'Unknown License' }} • {{ $license->identification_number ?? 'N/A' }}
Expired
{{ \Carbon\Carbon::parse($license->expiry_date)->format('M d, Y') }}
({{ \Carbon\Carbon::parse($license->expiry_date)->diffForHumans() }})
Resolve
@endforeach
@if($expiredLicenses->hasPages())
{{ $expiredLicenses->appends(request()->query())->links() }}
@endif @endif
@endcan @can('view schedules')
@forelse($lateCheckins as $schedule) @foreach($schedule->employees as $employee) @if($employee->pivot->actual_start_at && \Carbon\Carbon::parse($employee->pivot->actual_start_at)->gt(\Carbon\Carbon::parse($schedule->from_datetime)->addMinutes($lateTolerance))) @php $checkin = \Carbon\Carbon::parse($employee->pivot->actual_start_at); $scheduled = \Carbon\Carbon::parse($schedule->from_datetime); $diff = $scheduled->diffInMinutes($checkin); @endphp
{{ substr($employee->first_name, 0, 1) }}{{ substr($employee->last_name, 0, 1) }}

{{ $employee->first_name }} {{ $employee->last_name }} started shift {{ number_format($diff, 2) }} min late

Site: {{ $schedule->site->name ?? 'Unknown Site' }}

Scheduled
{{ $scheduled->format('H:i') }}
Actual
{{ $checkin->format('H:i') }}
{{ $scheduled->format('M d, Y') }} {{ $schedule->duty_number }}
@endif @endforeach @empty

All Clear!

No late check-ins detected within the last 7 days.

@endforelse
@endcan
@endsection