@php $returnRate = $totalLoans > 0 ? (int) round(($totalReturned / $totalLoans) * 100) : 0; $rangeLabel = 'All dates'; if ($startDate && $endDate) { $rangeLabel = \Illuminate\Support\Carbon::parse($startDate)->format('d M Y').' – '.\Illuminate\Support\Carbon::parse($endDate)->format('d M Y'); } elseif ($startDate) { $rangeLabel = 'From '.\Illuminate\Support\Carbon::parse($startDate)->format('d M Y'); } elseif ($endDate) { $rangeLabel = 'Until '.\Illuminate\Support\Carbon::parse($endDate)->format('d M Y'); } $quickRanges = [ ['label' => 'This month', 'start' => now('Asia/Jakarta')->startOfMonth(), 'end' => now('Asia/Jakarta')->endOfMonth()], ['label' => 'Last 30 days', 'start' => now('Asia/Jakarta')->subDays(29), 'end' => now('Asia/Jakarta')], ['label' => 'This year', 'start' => now('Asia/Jakarta')->startOfYear(), 'end' => now('Asia/Jakarta')->endOfYear()], ]; @endphp
Reset
Quick range @foreach ($quickRanges as $range) {{ $range['label'] }} @endforeach @if ($startDate || $endDate || $status) {{ $rangeLabel }}{{ $status ? ' · '.ucfirst($status) : '' }} @endif

Borrowing & return activity

{{ $rangeLabel }}{{ $status ? ' · '.ucfirst($status) : '' }} · {{ $loans->total() }} {{ \Illuminate\Support\Str::plural('record', $loans->total()) }}

Dates are based on the borrow date.

@if ($loans->isEmpty()) Clear filters @else
@foreach ($loans as $loan) @php($overdue = $loan->status === \App\Enums\LoanStatus::Borrowed && $loan->due_date->isBefore(today())) @endforeach
Book Member Librarian Borrowed Due Returned Method Status

{{ $loan->book?->title ?? '—' }}

{{ $loan->book?->author }}

{{ $loan->member?->name ?? '—' }}

{{ $loan->member?->email }}

{{ $loan->librarian?->name ?? '—' }} {{ $loan->borrow_date?->format('d M Y') ?? '—' }} {{ $loan->due_date?->format('d M Y') ?? '—' }} {{ $loan->return_date?->format('d M Y') ?? '—' }} {{ $loan->borrowing_method?->label() ?? '—' }} @if ($loan->status === \App\Enums\LoanStatus::Returned) Returned @elseif ($overdue) Overdue @else Borrowed @endif
@endif

Report generated on {{ now('Asia/Jakarta')->format('d M Y, H:i') }} WIB. Overdue status is calculated against today's date.