Duty Operations Hub

Duty Assignment Center

Dispatch sanitation duties to drivers with Shift Master integration, time overlap checks, and route lane sidebar preview.

@if(auth()->user()?->canManageDuties()) @endif
Today's Total
{{ number_format($todayTotal) }} Duties
Assigned / Scheduled
{{ number_format($todayUpcoming) }} Upcoming
Active on Field
{{ number_format($todayInProgress) }} Sweeping
Finished Duties
{{ number_format($todayCompleted) }} Completed
Overdue / Missed
{{ number_format($todayMissed) }} Missed
@if($showForm)
{{ $editingId ? 'Edit Driver Duty Assignment' : 'New Driver Duty Dispatch' }}

{{ $editingId ? 'Edit Driver Duty #' . $duty_code : 'Assign Duty to Driver' }}

@if(! $editingId)
@endif
{{ $dispatch_mode === 'recurring' ? 'Auto-Batch Duty ID Prefix' : 'Auto-Generated Duty ID' }} {{ $duty_code ?: 'DUTY-'.date('Ymd').'-AUTO' }}
{{ $editingId ? 'Assigned ID' : ($dispatch_mode === 'recurring' ? 'Auto-Batch Dispatch' : 'Auto Generated') }}
@error('shift_id') {{ $message }} @enderror
@if($dispatch_mode === 'recurring' && ! $editingId)

Recurring Schedule Date Range

@error('recurring_start_date') {{ $message }} @enderror
@error('recurring_end_date') {{ $message }} @enderror
@php $recSummary = $this->recurringScheduleSummary; @endphp
Auto-Dispatch Preview: {{ $recSummary['matching_count'] }} Duties
Route operating schedule: {{ $recSummary['operating_days_label'] }}
{{ $recSummary['total_days'] }} Days Date Window
@else
@error('shift_start_time') {{ $message }} @enderror
@error('shift_end_time') {{ $message }} @enderror
@endif
@error('route_id') {{ $message }} @enderror

Assigned Drivers & Vehicles ({{ count($assignments) }})

@foreach($assignments as $idx => $pair)
#{{ $idx + 1 }}
@if(count($assignments) > 1) @endif
@endforeach
@if($selectedRouteDetails)
Selected Route Details

{{ $selectedRouteDetails->name }}

{{ $selectedRouteDetails->code ?? 'N/A' }}
Total Route Distance
{{ number_format((float) $selectedRouteDetails->total_distance_km, 2) }} KM
Duty Day: {{ $targetDayName }}
{{ $routeRunsOnDay ? '✓ Scheduled Match' : '⚠️ Schedule Mismatch' }}
@if($routeRunsOnDay) This duty is assigned on {{ $targetDayName }}. Route operating days: {{ $selectedRouteDetails->formatted_operating_days }}. @else Duty is scheduled for {{ $targetDayName }}, but this route is configured for: {{ $selectedRouteDetails->formatted_operating_days }}. @endif
@if($selectedRouteDetails->description)
Route Instructions

{{ $selectedRouteDetails->description }}

@endif
Lanes & Stretches ({{ $selectedRouteDetails->lanes->count() }}) Sub-routes
@forelse($selectedRouteDetails->lanes as $lane)
@if($lane->image_url) {{ $lane->lane_name }} @else
@endif
{{ $lane->lane_name }} @if($lane->latitude && $lane->longitude) {{ number_format($lane->latitude, 6) }}°, {{ number_format($lane->longitude, 6) }}° @endif
{{ number_format((float) $lane->distance_km, 2) }} KM
@empty
No lanes configured for this route.
@endforelse
@else

No Route Selected

Select a sanitation route from the dropdown to view lane stretches, GPS coordinates, and photos in this sidebar.

@endif
@endif
@if($viewMode === 'calendar') @php $calGrid = $this->calendarGridData; @endphp
Duty Schedule Calendar

{{ $calGrid['month_name'] }}

Mon
Tue
Wed
Thu
Fri
Sat
Sun
@foreach($calGrid['weeks'] as $week)
@foreach($week as $day)
{{ $day['day_number'] }}
@foreach($day['duties'] as $duty)
status !== 'in_progress' && auth()->user()?->canManageDuties()) wire:click="edit({{ $duty->id }})" @endif class="p-1.5 rounded-xl border text-[10.5px] leading-tight space-y-1 shadow-2xs transition {{ $duty->status !== 'in_progress' ? 'hover:scale-[1.02] cursor-pointer' : 'cursor-default' }} {{ $duty->status === 'in_progress' ? 'bg-amber-50 border-amber-300 text-amber-950' : ($duty->status === 'completed' ? 'bg-emerald-50 border-emerald-300 text-emerald-950' : ($duty->status === 'missed' ? 'bg-rose-50 border-rose-300 text-rose-950' : 'bg-slate-50 border-slate-200 text-slate-900')) }}" >
{{ $duty->duty_code }}
{{ $duty->route?->name ?? 'Sanitation Route' }}
{{ $duty->employee?->full_name }} {{ $duty->formatted_shift_window }}
@endforeach
@endforeach
@endforeach
@else
@if($search) @endif
@if($search || $statusFilter || $shiftFilter || $routeFilter || $dateFilter || $employeeFilter || $vehicleFilter || $datePreset !== 'today') @endif
@forelse($duties as $index => $duty) @empty @endforelse
# Duty Code Date & Shift Driver Vehicle Route Status Actions
{{ $duties->firstItem() + $index }} {{ $duty->duty_code }}
{{ $duty->duty_date?->format('d M Y') }} {{ $duty->duty_date?->format('D') }} {{ $duty->formatted_shift_window }}
{{ substr($duty->employee?->first_name ?? 'D', 0, 1) }}{{ substr($duty->employee?->last_name ?? '', 0, 1) }}
{{ $duty->employee?->full_name ?? 'Unassigned' }} @if($duty->assignments->count() > 1) +{{ $duty->assignments->count() - 1 }} Drivers @else {{ $duty->employee?->employee_code }} @endif
{{ $duty->vehicle?->vehicle_number ?? '—' }} @if($duty->assignments->count() > 1) {{ $duty->assignments->count() }} Fleet Vehicles @endif
{{ $duty->route?->name ?? '—' }} {{ $duty->multi_driver_status_label }} @if($duty->assignments->count() > 1)
@foreach($duty->assignments as $a)
{{ $a->employee?->first_name ?: 'Driver' }} ({{ $a->vehicle?->vehicle_number ?: 'Vehicle' }}) {{ ucfirst($a->status ?: 'Assigned') }}
@endforeach
@endif
@if($duty->photos->count() > 0) @endif @if($duty->status === 'completed') @endif @if(auth()->user()?->canManageDuties() && $duty->status !== 'in_progress') @endif @if(auth()->user()?->canManageDuties() && ! in_array($duty->status, ['completed', 'in_progress', 'cancelled'])) @endif

No driver duty assignments found.

Click "Assign New Duty" above to assign driver duties.

@if($duties->hasPages())
{{ $duties->links() }}
@endif
@endif @if($showPhotosModal && $selectedDutyForPhotosModel)

Field Photos — Duty #{{ $selectedDutyForPhotosModel->duty_code }}

{{ $selectedDutyForPhotosModel->route?->name ?? 'Sanitation Route' }} • {{ $selectedDutyForPhotosModel->employee?->full_name }}

Uploaded Inspection Photos ({{ $selectedDutyForPhotosModel->photos->count() }})

@forelse($selectedDutyForPhotosModel->photos as $photo)
Duty photo
{{ $photo->caption ?: 'Field verification photo' }}
{{ $photo->taken_at ? $photo->taken_at->format('d M, h:i A') : $photo->created_at?->format('d M, h:i A') }} {{ $photo->stage }}
@empty
No photos uploaded yet for this duty shift.
@endforelse
@endif