@php $employeeOptions = $employees->pluck('name', 'id')->toArray(); $durationTypeOptions = [ 'single_day' => __('Specific Day'), 'range' => __('Date Range'), ]; $statusOptions = [ 'pending' => __('Pending manager review'), 'manager_approved' => __('Pending final approval'), 'approved' => __('Approved'), 'rejected' => __('Rejected'), 'cancelled' => __('Cancelled'), ]; $hasActiveFilters = filled($filterEmployee) || filled($filterDurationType) || filled($filterFrom) || filled($filterTo) || filled($filterStatus); @endphp

{{ __('Overtime') }}

@can('overtimes excel') @endcan @if(auth()->user()->can('overtimes request') || auth()->user()->can('overtimes create')) @endif
@if (session()->has('message'))
{{ session('message') }}
@endif
@unless($contextEmployeeId)
@endunless
{{ __('Records') }}
{{ number_format($summary['records']) }}
{{ __('Approved Hours') }}
{{ number_format($summary['total_hours'], 2) }}
{{ __('Approved Amount') }}
{{ number_format($summary['total_amount'], 2) }}
@foreach($statusOptions as $status => $label) @php $cardClass = match($status) { 'approved' => 'border-green-300 dark:border-green-800', 'rejected', 'cancelled' => 'border-red-300 dark:border-red-800', 'manager_approved' => 'border-blue-300 dark:border-blue-800', default => 'border-yellow-300 dark:border-yellow-800', }; @endphp
{{ $label }}
{{ number_format($statusSummary[$status] ?? 0) }}
@endforeach
@forelse($overtimes as $overtime) @empty @endforelse
# {{ __('Employee') }} {{ __('Duration Type') }} {{ __('Date') }} {{ __('Days') }} {{ __('Overtime Hours') }} {{ __('Hourly Wage') }} {{ __('Overtime Hourly Wage') }} {{ __('Total Amount') }} {{ __('Status') }} {{ __('Notes') }} {{ __('Actions') }}
{{ $loop->iteration + ($overtimes->currentPage() - 1) * $overtimes->perPage() }} {{ $overtime->employee->name ?? '—' }} {{ $durationTypeOptions[$overtime->duration_type] ?? __($overtime->duration_type) }} @if($overtime->duration_type === 'range') {{ $overtime->start_date?->format('Y-m-d') }} - {{ $overtime->end_date?->format('Y-m-d') }} @else {{ $overtime->date?->format('Y-m-d') }} @endif {{ $overtime->days_count }} {{ number_format((float) $overtime->total_hours, 2) }} ({{ number_format((float) $overtime->hours_per_day, 2) }} / {{ __('day') }}) {{ number_format((float) $overtime->hourly_wage, 2) }} {{ number_format((float) $overtime->overtime_hourly_wage, 2) }} {{ number_format((float) $overtime->total_amount, 2) }} @php $statusClass = match($overtime->status) { 'approved' => 'bg-green-100 text-green-800 dark:bg-green-900/40 dark:text-green-200', 'rejected', 'cancelled' => 'bg-red-100 text-red-800 dark:bg-red-900/40 dark:text-red-200', 'manager_approved' => 'bg-blue-100 text-blue-800 dark:bg-blue-900/40 dark:text-blue-200', default => 'bg-yellow-100 text-yellow-800 dark:bg-yellow-900/40 dark:text-yellow-200', }; @endphp {{ $statusOptions[$overtime->status] ?? $overtime->status }} @if($overtime->status === 'rejected' && $overtime->rejection_reason)
{{ __('Reason recorded') }}
@endif
{{ $overtime->notes ?: '—' }}
@can('overtimes edit') @if($overtime->status === 'pending') @endif @endcan @if($overtime->status === 'pending' && $this->isDirectManager($overtime)) @endif @if(in_array($overtime->status, ['pending', 'manager_approved']) && $this->canFinalApprove($overtime)) @endif @if(in_array($overtime->status, ['pending', 'manager_approved']) && $this->canReject($overtime)) @endif @if($overtime->created_by === auth()->id() && in_array($overtime->status, ['pending', 'manager_approved'])) @endif
{{ __('No records found.') }}
{{ $overtimes->links() }}
@if($confirmingDeletionId)

{{ __('Confirm Delete') }}

{{ __('Are you sure you want to delete this record?') }}

@endif

{{ $isEditMode ? __('Edit overtime request') : __('Submit overtime request') }}

@if ($errors->any())
    @foreach ($errors->all() as $error)
  • {{ $error }}
  • @endforeach
@endif
@if($contextEmployeeId || ! $this->canCreateForOthers())
{{ $employeeOptions[$contextEmployeeId] ?? auth()->user()->name }}
@else @endif
@if($duration_type === 'range')
@else
@endif
@if(!empty($preview))
{{ __('Monthly Salary') }}
{{ number_format($preview['monthly_salary'], 2) }}
{{ __('Daily Wage') }}
{{ number_format($preview['daily_wage'], 2) }}
{{ __('Hourly Wage') }}
{{ number_format($preview['hourly_wage'], 2) }}
{{ __('Overtime Hourly Wage') }}
{{ number_format($preview['overtime_hourly_wage'], 2) }}
{{ __('Days') }}
{{ $preview['days_count'] }}
{{ __('Total Hours') }}
{{ number_format($preview['total_hours'], 2) }}
{{ __('Daily Work Hours') }}
{{ number_format($preview['daily_work_hours'], 2) }}
{{ __('Total Amount') }}
{{ number_format($preview['total_amount'], 2) }}
@if(!empty($preview['attendance_evidence']))
{{ __('Attendance evidence') }}
@foreach($preview['attendance_evidence'] as $evidence) @php $availableMinutes = $evidence['available_minutes']; $availableDisplay = is_null($availableMinutes) ? '—' : sprintf('%02d:%02d', intdiv($availableMinutes, 60), $availableMinutes % 60); $verified = $evidence['status'] === 'verified'; @endphp @endforeach
{{ __('Date') }} {{ __('Scheduled end') }} {{ __('Actual check-out') }} {{ __('Available after-shift time') }} {{ __('Review result') }}
{{ $evidence['date'] }} {{ $evidence['scheduled_end'] ?? '—' }} {{ $evidence['check_out'] ?? '—' }} {{ $availableDisplay }} {{ $verified ? __('Supported by attendance') : __('Reason required') }}
@if(collect($preview['attendance_evidence'])->contains(fn ($day) => $day['status'] !== 'verified'))
{{ __('Some requested hours are not fully supported by attendance. Enter a clear reason before submitting.') }}
@endif
@endif @endif
@if($rejectingId)

{{ __('Reject overtime request') }}

@error('rejectionReason')
{{ $message }}
@enderror
@endif