@can('hrm.overtime.view') Overtime @endcan @if (session('status'))
{{ session('status') }}
@endif @if (session('error'))
{{ session('error') }}
@endif
Each person holds one shift per weekday. Saving a new schedule replaces the days those people already had — select several staff to roster them in one go.
@csrf

Ctrl/Cmd-click to roster several people at once.

@error('user_ids')

{{ $message }}

@enderror

Working days

@foreach ($weekdays as $number => $label) @endforeach
@error('weekdays')

{{ $message }}

@enderror
@foreach ($weekdays as $number => $label)
{{ $label }}
@forelse ($assignments->get($number, collect()) as $assignment)

{{ $assignment->user?->name }}

{{ $assignment->shift?->name }} {{ substr($assignment->shift?->start_time ?? '', 0, 5) }}–{{ substr($assignment->shift?->end_time ?? '', 0, 5) }}

@csrf @method('DELETE')
@empty

No one rostered.

@endforelse
@endforeach
Late clock-ins are measured against the shift start plus its grace period.
@forelse ($shifts as $shift) @empty @endforelse
Shift Hours Grace Rostered Status Manage

{{ $shift->name }}

{{ substr($shift->start_time, 0, 5) }}–{{ substr($shift->end_time, 0, 5) }} @if ($shift->spans_midnight)· overnight@endif

{{ number_format($shift->durationHours(), 1) }} {{ $shift->grace_minutes }} min {{ $shift->assignments_count }}
Edit
@csrf @method('PUT')
Add the first shift pattern below — for example a day shift 08:00–17:00.
@csrf
Attendance on these dates is treated as holiday overtime at 2.0x.
@csrf
@forelse ($holidays as $holiday)

{{ $holiday->name }}

{{ $holiday->date->format('d M Y') }} · {{ $holiday->is_paid ? 'Paid' : 'Unpaid' }}

@csrf @method('DELETE')
@empty

No holidays recorded yet.

@endforelse