@extends('layouts.app') @section('content') {{-- ── Page Header ── --}}

My Attendance

Manage and track your work hours

Add
{{-- Filter Row --}}
{{-- ── Today Action Card ── --}}

Today's Overview

{{ today()->format('l, d M Y') }}

Check-in

{{ $today?->checkin_at ? $today->checkin_at->format('h:i A') : '--:--' }}

Check-out

{{ $today?->checkout_at ? $today->checkout_at->format('h:i A') : '--:--' }}

@if ($today?->net_worked_mins > 0)

Total

{{ round($today->net_worked_mins / 60, 1) }}h

@endif
@if (!$today || !$today->checkin_at)
@csrf
@elseif ($today->checkin_at && !$today->checkout_at)
@csrf
@else
Shift Completed
@endif
{{-- ── Stats Grid ── --}} {{-- ── Stats Grid ── --}}
{{-- Row 1: Count stats --}}
@php $statConfigs = [ [ 'label' => 'Total Days', 'val' => $stats['total_days'], 'icon' => 'icon-[tabler--calendar]', 'color' => 'bg-base-200 text-base-content', ], [ 'label' => 'Working Days', 'val' => $stats['working_days'], 'icon' => 'icon-[tabler--briefcase]', 'color' => 'bg-success/10 text-success', ], [ 'label' => 'Late Days', 'val' => $stats['late_days'], 'icon' => 'icon-[tabler--clock-exclamation]', 'color' => 'bg-warning/10 text-warning', ], [ 'label' => 'Leave Days', 'val' => $stats['leave_days'], 'icon' => 'icon-[tabler--user-off]', 'color' => 'bg-error/10 text-error', ], ]; @endphp @foreach ($statConfigs as $stat)

{{ $stat['label'] }}

{{ $stat['val'] }}

@endforeach
{{-- Row 2: Hours stats --}}
{{-- Actual vs Expected Hours (progress card) --}} @php $workedH = round($stats['total_worked_mins'] / 60, 1); $expectedH = $stats['total_expected_mins'] > 0 ? round($stats['total_expected_mins'] / 60, 1) : 0; $progress = $expectedH > 0 ? min(100, round(($workedH / $expectedH) * 100)) : 0; $progressColor = $progress >= 100 ? 'progress-success' : ($progress >= 70 ? 'progress-warning' : 'progress-error'); @endphp

Hours Progress

{{ $progress }}%

{{ $workedH }}h

worked of {{ $expectedH }}h expected

@php $diff = round($workedH - $expectedH, 1); @endphp

{{ $diff >= 0 ? '+' : '' }}{{ $diff }}h

{{ $diff >= 0 ? 'ahead' : 'behind' }}

{{-- Total Break --}} @php $breakH = floor($stats['total_break_mins'] / 60); $breakM = $stats['total_break_mins'] % 60; @endphp

Total Break

{{ $breakH }}h {{ $breakM }}m

{{ $stats['total_break_mins'] }} mins total

{{-- Late Time --}} @php $lateH = floor($stats['total_late_mins'] / 60); $lateM = $stats['total_late_mins'] % 60; @endphp

Late Time

{{ $lateH }}h {{ $lateM }}m

across {{ $stats['late_days'] }} late days

{{-- Row 3: On-time rate --}} @php $onTimeRate = $stats['working_days'] > 0 ? round(($stats['on_time_days'] / $stats['working_days']) * 100) : 0; @endphp

On-Time Rate

{{ $stats['on_time_days'] }} / {{ $stats['working_days'] }} days on time

{{ $onTimeRate }}%
{{-- ── Attendance Grid ── --}}
@forelse ($attendance as $record) @php $isToday = $record->date->isToday(); $totalMins = $record->sessions_sum_time_in_minutes ?? 0; $hours = floor($totalMins / 60); $minutes = $totalMins % 60; $breakFormatted = sprintf('%02d:%02d:00', $hours, $minutes); $breakColorClass = $totalMins > 60 ? 'text-error' : 'text-base-content/70'; @endphp
@if ($isToday)
TODAY
@endif
{{ $record->date->format('M') }} {{ $record->date->format('d') }}

{{ $record->date->format('l') }}

{{ $record->date->format('Y') }}

@php $statusClass = match ($record->status) { 'working' => 'badge-success', 'late' => 'badge-warning', 'leave' => 'badge-error', default => 'badge-ghost', }; @endphp {{ $record->status }}

Check-in

{{ $record->checkin_at?->format('h:i A') ?? '--:--' }}

Check-out

{{ $record->checkout_at?->format('h:i A') ?? '--:--' }}

Worked

{{ round($record->net_worked_mins / 60, 1) }}h

Late

{{ $record->late_minutes > 0 ? $record->late_minutes . 'm' : '0m' }}

Break

{{ $breakFormatted }}

@if ($record->notes)

Notes

"{{ $record->notes }}"

@endif
@csrf @method('DELETE')
@empty

No attendance records found.

@endforelse
@endsection