@extends('layouts.app') @section('title', 'Admin Timesheet Report') @section('breadcrumb') Reports / Employee Timesheet Report @endsection @section('content')

Employee Timesheet Report

Full time log, task details, rate & earnings — filterable by date, job, and employee

Reset
Total Entries
{{ $totalEntries }}
Total Hours
{{ number_format($totalHours, 2) }}h
Total Earnings
${{ number_format($totalEarnings, 2) }}
Employees
{{ $employees->count() }}
Jobs Covered
{{ $jobsCoveredCount }}
@if($employeeSummary->count() > 0)

Employee Summary

@foreach($employeeSummary as $summary) @endforeach
Employee Role Hourly Rate Entries Hours Earnings
{{ strtoupper(substr($summary['name'],0,2)) }}
{{ $summary['name'] }}
{{ $summary['role'] }} ${{ number_format($summary['rate'], 2) }}/hr {{ $summary['entries'] }} {{ number_format($summary['hours'], 2) }}h ${{ number_format($summary['earnings'], 2) }}
Total {{ number_format($totalHours, 2) }}h ${{ number_format($totalEarnings, 2) }}
@endif

Job-wise Time Log Detail

{{ $totalEntries }} entries
@forelse($entries as $entry) @php $hrs = round($entry->duration_minutes / 60, 2); $rate = (float)($entry->user?->hourly_rate ?? 0); $amount = round($hrs * $rate, 2); @endphp @empty @endforelse
Date Employee Job Task Stage Start Stop Hours Rate Amount Status
{{ $entry->started_at?->format('d M Y') }}
{{ $entry->user?->name ?? '—' }}
{{ $entry->user?->role?->display_name ?? '' }}
{{ $entry->job?->job_number ?? '—' }} {{ $entry->taskType?->name ?? '—' }} @if($entry->job) {{ $entry->job->stageLabel() }} @else @endif {{ $entry->started_at?->format('H:i') }} {{ $entry->stopped_at?->format('H:i') ?? '—' }} {{ number_format($hrs, 2) }}h ${{ number_format($rate, 2) }} ${{ number_format($amount, 2) }} @php $badge = match($entry->status) { 'completed' => 'badge-green', 'running' => 'badge-blue', 'paused' => 'badge-yellow', default => 'badge-gray', }; @endphp {{ ucfirst($entry->status) }}
No time entries found for the selected filters.
@if(method_exists($entries, 'hasPages') && $entries->hasPages())
{{ $entries->appends(request()->query())->links() }}
@endif

Job-wise Stage Report

Task completion by employee per job, with time taken, rate and price

@forelse($jobStageRows as $row) @empty @endforelse @if(count($jobStageRows) > 0) @endif
Job Client Stage Employee Task Task Status Hours Logged Hourly Rate Total Price
{{ $row['job_number'] }} {{ $row['client'] }} {{ $row['stage_label'] }} {{ $row['employee'] }} {{ $row['task'] }} @php $badge = match($row['task_status']) { 'completed' => 'badge-green', 'in_progress' => 'badge-blue', 'paused' => 'badge-yellow', default => 'badge-gray', }; @endphp {{ ucfirst(str_replace('_',' ',$row['task_status'])) }} {{ number_format($row['hours'], 2) }}h ${{ number_format($row['rate'], 2) }} ${{ number_format($row['total_price'], 2) }}
No task assignments found for the selected period.
Total {{ number_format(collect($jobStageRows)->sum('hours'), 2) }}h ${{ number_format(collect($jobStageRows)->sum('total_price'), 2) }}
@endsection