@php $hour = now()->hour; $greeting = $hour < 12 ? 'Good morning' : ($hour < 17 ? 'Good afternoon' : 'Good evening'); $userName = explode(' ', auth()->user()->name)[0] ?? 'there'; $maxRevenue = collect($revenue_trend)->max('total') ?: 1; $maxMembers = collect($member_trend)->max('count') ?: 1; function fmtCurrency($n) { if ($n >= 100000) return '₹' . number_format($n / 100000, 1) . 'L'; if ($n >= 1000) return '₹' . number_format($n / 1000, 1) . 'K'; return '₹' . ($n ?? 0); } $stageBadge = [ 'new' => 'bg-blue-100 text-blue-700', 'contacted' => 'bg-yellow-100 text-yellow-700', 'trial' => 'bg-purple-100 text-purple-700', 'negotiation' => 'bg-orange-100 text-orange-700', 'won' => 'bg-green-100 text-green-700', 'lost' => 'bg-red-100 text-red-600', ]; $stageBar = [ 'new' => 'bg-blue-400', 'contacted' => 'bg-yellow-400', 'trial' => 'bg-purple-400', 'negotiation' => 'bg-orange-400', 'won' => 'bg-green-400', 'lost' => 'bg-red-400', ]; $totalLeads = collect($leads_by_stage)->sum(); @endphp Check-In New Member {{-- Page title --}}

Dashboard

{{ $greeting }}, {{ $userName }}! Here's your gym overview · {{ now()->locale('en')->isoFormat('dddd, MMMM D') }}

Collect Payment
{{-- KPI cards --}} @php $tone = [ 'orange' => 'bg-orange-500/10 text-orange-500', 'blue' => 'bg-blue-500/10 text-blue-500', 'green' => 'bg-green-500/10 text-green-500', 'purple' => 'bg-purple-500/10 text-purple-500', 'red' => 'bg-red-500/10 text-red-500', 'yellow' => 'bg-yellow-500/10 text-yellow-500', 'gray' => 'bg-gray-500/10 text-gray-400', ]; $subTone = [ 'orange' => 'text-orange-500', 'blue' => 'text-blue-500', 'green' => 'text-green-500', 'purple' => 'text-purple-500', 'red' => 'text-red-500', 'yellow' => 'text-yellow-500', 'gray' => 'text-gray-400', ]; $kpiCards = [ ['Active Members', $kpis['active_members'], 'orange', route('members.index'), 'Currently enrolled', 'M17 20h5v-2a3 3 0 00-5.356-1.857M17 20H7m10 0v-2c0-.656-.126-1.283-.356-1.857M7 20H2v-2a3 3 0 015.356-1.857M7 20v-2c0-.656.126-1.283.356-1.857m0 0a5.002 5.002 0 019.288 0M15 7a3 3 0 11-6 0 3 3 0 016 0z'], ['Today Check-ins', $kpis['today_checkins'], 'blue', route('attendance.monitor'), 'Live attendance', 'M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2m-6 9l2 2 4-4'], ['Today Revenue', fmtCurrency($kpis['today_revenue']), 'green', null, 'Collected today', 'M12 8c-1.657 0-3 .895-3 2s1.343 2 3 2 3 .895 3 2-1.343 2-3 2m0-8c1.11 0 2.08.402 2.599 1M12 8V7m0 1v8m0 0v1m0-1c-1.11 0-2.08-.402-2.599-1M21 12a9 9 0 11-18 0 9 9 0 0118 0z'], ['Month Revenue', fmtCurrency($kpis['month_revenue']), 'purple', null, 'Revenue this month', 'M9 19v-6a2 2 0 00-2-2H5a2 2 0 00-2 2v6a2 2 0 002 2h2a2 2 0 002-2zm0 0V9a2 2 0 012-2h2a2 2 0 012 2v10m-6 0a2 2 0 002 2h2a2 2 0 002-2m0 0V5a2 2 0 012-2h2a2 2 0 012 2v14a2 2 0 01-2 2h-2a2 2 0 01-2-2z'], ['Frozen', $kpis['frozen_members'], $kpis['frozen_members'] > 0 ? 'blue' : 'gray', route('members.index', ['status' => 'frozen']), 'Memberships on hold', 'M20.354 15.354A9 9 0 018.646 3.646 9.003 9.003 0 0012 21a9.003 9.003 0 008.354-5.646z'], ['Active Leads', $kpis['active_leads'], 'purple', route('leads.index'), 'In the pipeline', 'M16 7a4 4 0 11-8 0 4 4 0 018 0zM12 14a7 7 0 00-7 7h14a7 7 0 00-7-7z'], ['Overdue Invoices', $kpis['overdue_invoices'], $kpis['overdue_invoices'] > 0 ? 'red' : 'gray', route('invoices.index'), $kpis['overdue_invoices'] > 0 ? 'Needs attention' : 'All settled', 'M12 9v2m0 4h.01m-6.938 4h13.856c1.54 0 2.502-1.667 1.732-3L13.732 4c-.77-1.333-2.694-1.333-3.464 0L3.34 16c-.77 1.333.192 3 1.732 3z'], ['Pending Leaves', $kpis['pending_leaves'], $kpis['pending_leaves'] > 0 ? 'yellow' : 'gray', route('staff.index'), 'Awaiting approval', 'M8 7V3m8 4V3m-9 8h10M5 21h14a2 2 0 002-2V7a2 2 0 00-2-2H5a2 2 0 00-2 2v12a2 2 0 002 2z'], ]; @endphp
@foreach($kpiCards as [$label, $value, $color, $url, $sub, $path]) @if($url) @else @endif @endforeach
{{-- Summary row --}}
{{-- Lead pipeline --}}

Lead Pipeline

View all →
@if(!$totalLeads)

No leads yet.

@else
@foreach($leads_by_stage as $stage => $count) @php $badge = $stageBadge[$stage] ?? 'bg-gray-100 text-gray-700'; $bar = $stageBar[$stage] ?? 'bg-gray-400'; $pct = $totalLeads > 0 ? round(($count / $totalLeads) * 100) : 0; @endphp
{{ $stage }}
{{ $count }}
@endforeach
@endif
{{-- New members 6-month trend --}}

New Members

@foreach($member_trend as $m) @php $barH = max(3, ($m['count'] / $maxMembers) * 68); @endphp
{{ $m['label'] }}
@endforeach
{{-- Quick actions --}}
{{-- ─── Left col ──────────────────────────────────────────── --}}
{{-- Revenue 30-day bar chart --}}

Revenue — Last 30 Days

{{ fmtCurrency($kpis['month_revenue']) }} this month

@foreach($revenue_trend as $d) @php $barH = max(2, ($d['total'] / $maxRevenue) * 100); @endphp
@endforeach
{{ $revenue_trend[0]['date'] ?? '' }} {{ ($revenue_trend[count($revenue_trend)-1]['date'] ?? '') }}
{{-- Today's classes --}}

Today's Classes

Full schedule →
@if($today_classes->isEmpty())

No classes today

No sessions are scheduled for today.

@else
@foreach($today_classes as $s) @php $color = $s->schedule?->fitnessClass?->color ?? '#f97316'; $pct = $s->capacity > 0 ? min(100, ($s->booked_count / $s->capacity) * 100) : 0; $barColor = $s->booked_count >= $s->capacity ? 'bg-red-500' : ($pct >= 80 ? 'bg-orange-400' : 'bg-green-400'); @endphp

{{ $s->schedule?->fitnessClass?->name }}

{{ $s->start_time }} · {{ $s->trainer?->name ?? 'No trainer' }}

{{ $s->booked_count }}/{{ $s->capacity }}

Manage
@endforeach
@endif
{{-- Expiring memberships --}}

Expiring Memberships

@if($expiring->count()) {{ $expiring->count() }} @endif
Next 14 days
@if($expiring->isEmpty())

All clear

No memberships expiring in the next 14 days.

@else
@foreach($expiring as $m) @php $days = (int) ceil((strtotime($m->ends_at) - time()) / 86400); $expiryClass = $days <= 3 ? 'text-red-600 font-bold' : ($days <= 7 ? 'text-orange-500 font-semibold' : 'text-gray-600'); @endphp @endforeach
Member Plan Expires
{{ strtoupper(substr($m->member?->name ?? 'U', 0, 1)) }}
{{ $m->member?->name }}

{{ $m->member?->member_id }}

{{ $m->plan?->name }} {{ \Carbon\Carbon::parse($m->ends_at)->format('d M Y') }} ({{ $days }}d) Renew
@endif
{{-- ─── Right col ──────────────────────────────────────────── --}}
{{-- Recent check-ins --}}

Recent Check-ins

Live →
@if($recent_checkins->isEmpty())

No check-ins today

@else
@foreach($recent_checkins as $c)
{{ strtoupper(substr($c->member?->name ?? 'U', 0, 1)) }}

{{ $c->member?->name }}

{{ $c->member?->member_id }}

{{ \Carbon\Carbon::parse($c->check_in_at)->format('h:i A') }}
@endforeach
@endif