@extends('layouts.app') @section('title', 'Attendance Management') @section('content')

Employees & HR

Attendance control

Manual, web, manager, import, biometric and API-ready records with preserved correction history.

@if(auth()->user()->employee_id)

My attendance today

Authenticated web punches are time-stamped and retained in the audit log.

@csrf
@endif
@foreach([['Total employees',$stats['total'],'slate'],['Present',$stats['present'],'emerald'],['Absent',$stats['absent'],'rose'],['Late',$stats['late'],'amber'],['On leave',$stats['on_leave'],'sky'],['Not checked in',$stats['not_checked_in'],'amber'],['Overtime',intdiv($stats['overtime_minutes'],60).'h '.($stats['overtime_minutes']%60).'m','violet']] as [$label,$value,$tone])

{{ $label }}

{{ $value }}

@endforeach
@if(auth()->check() && auth()->user()->hasPermission('attendance.manage'))

Record attendance

Scheduled time and payroll metrics are calculated from the assigned shift.

{{ $stats['overtime_minutes'] }} OT minutes today
@csrf

Import attendance CSV

Required headers: employee_code, attendance_date. Optional: check_in, check_out, status, notes. Maximum 1,000 rows.

@csrf
@if(session('attendance_import_errors'))
Rows needing attention
    @foreach(session('attendance_import_errors') as $importError)
  • {{ $importError }}
  • @endforeach
@endif
@endif @if($corrections->isNotEmpty())

Pending attendance corrections

@foreach($corrections as $correction)

{{ $correction->employee->full_name }}

{{ $correction->attendanceRecord->attendance_date->format('d M Y') }} · {{ $correction->reason }}

Requested
@if(auth()->check() && auth()->user()->hasPermission('attendance.approve'))
@csrf
@endif
@endforeach
@endif
@if($view === 'calendar')
@foreach(['Mon','Tue','Wed','Thu','Fri','Sat','Sun'] as $weekday){{ $weekday }}@endforeach
@for($blank = 1; $blank < $date->copy()->startOfMonth()->dayOfWeekIso; $blank++)@endfor @foreach($calendarDays as $calendarDay) @php($dayRecords = $calendarSummary->get($calendarDay->toDateString(), collect()))
{{ $calendarDay->day }}

{{ $dayRecords->whereIn('status',['present','late','early_leave','half_day','work_from_home','business_visit'])->count() }} present

{{ $dayRecords->where('status','absent')->count() }} absent

{{ $dayRecords->count() }} records

@endforeach
@endif
@forelse($records as $record) @empty@endforelse
EmployeeDate / shiftCheck inCheck outWorkedLateEarlyOTStatusAction
{{ $record->employee->full_name }}{{ $record->employee->employee_code }} · {{ $record->employee->branch?->name }}{{ $record->attendance_date->format('d M Y') }}{{ $record->shift?->name ?? 'No shift' }}{{ $record->actual_check_in?->format('H:i') ?? '—' }}{{ $record->actual_check_out?->format('H:i') ?? '—' }}{{ intdiv($record->worked_minutes,60) }}h {{ $record->worked_minutes%60 }}m{{ $record->late_minutes }}m{{ $record->early_leave_minutes }}m{{ $record->overtime_minutes }}m{{ str_replace('_',' ',$record->status) }}
@csrf
No attendance recordsUse Record Attendance or change the date and filters.
{{ $records->links() }}
@endsection