$this->getUserMetrics(), 'bookingMetrics' => $this->getBookingMetrics(), 'timelineMetrics' => $this->getTimelineMetrics(), 'postMetrics' => $this->getPostMetrics(), 'chartData' => $this->getChartData(), ]; } public function updatedChartPeriod(): void { // Reset custom range when switching to preset if ($this->chartPeriod !== 'custom') { $this->customStartMonth = null; $this->customEndMonth = null; } } public function setCustomRange(): void { if ($this->customStartMonth && $this->customEndMonth) { $this->chartPeriod = 'custom'; } } private function getChartData(): array { $service = app(AnalyticsService::class); $months = match ($this->chartPeriod) { '6m' => 6, '12m' => 12, 'custom' => $this->getCustomMonthCount(), default => 6, }; $startDate = $this->chartPeriod === 'custom' && $this->customStartMonth ? Carbon::parse($this->customStartMonth)->startOfMonth() : now()->subMonths($months - 1)->startOfMonth(); return [ 'labels' => $service->getMonthLabels($startDate, $months), 'newClients' => $service->getMonthlyNewClients($startDate, $months), 'consultations' => $service->getMonthlyConsultations($startDate, $months), 'consultationBreakdown' => $service->getConsultationTypeBreakdown($startDate, $months), 'noShowRates' => $service->getMonthlyNoShowRates($startDate, $months), ]; } private function getCustomMonthCount(): int { if (! $this->customStartMonth || ! $this->customEndMonth) { return 6; } return Carbon::parse($this->customStartMonth) ->diffInMonths(Carbon::parse($this->customEndMonth)) + 1; } private function getUserMetrics(): array { return Cache::remember('admin.metrics.users', 300, fn () => [ 'total_active' => User::query() ->where('status', UserStatus::Active) ->whereIn('user_type', [UserType::Individual, UserType::Company]) ->count(), 'individual' => User::query() ->where('user_type', UserType::Individual) ->where('status', UserStatus::Active) ->count(), 'company' => User::query() ->where('user_type', UserType::Company) ->where('status', UserStatus::Active) ->count(), 'deactivated' => User::query() ->where('status', UserStatus::Deactivated) ->whereIn('user_type', [UserType::Individual, UserType::Company]) ->count(), 'new_this_month' => User::query() ->whereIn('user_type', [UserType::Individual, UserType::Company]) ->whereMonth('created_at', now()->month) ->whereYear('created_at', now()->year) ->count(), ]); } private function getBookingMetrics(): array { return Cache::remember('admin.metrics.bookings', 300, function () { $total = Consultation::query() ->whereIn('status', [ConsultationStatus::Completed, ConsultationStatus::NoShow]) ->count(); $noShows = Consultation::query() ->where('status', ConsultationStatus::NoShow) ->count(); return [ 'pending' => Consultation::query() ->where('status', ConsultationStatus::Pending) ->count(), 'today' => Consultation::query() ->whereDate('booking_date', today()) ->where('status', ConsultationStatus::Approved) ->count(), 'this_week' => Consultation::query() ->whereBetween('booking_date', [now()->startOfWeek(), now()->endOfWeek()]) ->whereIn('status', [ConsultationStatus::Approved, ConsultationStatus::Pending]) ->count(), 'this_month' => Consultation::query() ->whereMonth('booking_date', now()->month) ->whereYear('booking_date', now()->year) ->count(), 'free' => Consultation::query() ->where('consultation_type', ConsultationType::Free) ->count(), 'paid' => Consultation::query() ->where('consultation_type', ConsultationType::Paid) ->count(), 'no_show_rate' => $total > 0 ? round(($noShows / $total) * 100, 1) : 0, ]; }); } private function getTimelineMetrics(): array { return Cache::remember('admin.metrics.timelines', 300, fn () => [ 'active' => Timeline::query() ->where('status', TimelineStatus::Active) ->count(), 'archived' => Timeline::query() ->where('status', TimelineStatus::Archived) ->count(), 'updates_this_week' => TimelineUpdate::query() ->where('created_at', '>=', now()->subWeek()) ->count(), ]); } private function getPostMetrics(): array { return Cache::remember('admin.metrics.posts', 300, fn () => [ 'total_published' => Post::query() ->where('status', PostStatus::Published) ->count(), 'this_month' => Post::query() ->where('status', PostStatus::Published) ->whereMonth('published_at', now()->month) ->whereYear('published_at', now()->year) ->count(), ]); } }; ?>
{{ __('admin_metrics.title') }} {{ __('admin_metrics.subtitle') }}
{{-- User Metrics Card --}}
{{ __('admin_metrics.clients') }}
{{ __('admin_metrics.total_active') }} {{ $userMetrics['total_active'] }}
{{ __('admin_metrics.individual') }} {{ $userMetrics['individual'] }}
{{ __('admin_metrics.company') }} {{ $userMetrics['company'] }}
{{ __('admin_metrics.deactivated') }} {{ $userMetrics['deactivated'] }}
{{ __('admin_metrics.new_this_month') }} {{ $userMetrics['new_this_month'] }}
{{-- Booking Metrics Card --}}
{{ __('admin_metrics.consultations') }}
{{ __('admin_metrics.pending_requests') }} {{ $bookingMetrics['pending'] }}
{{ __('admin_metrics.today') }} {{ $bookingMetrics['today'] }}
{{ __('admin_metrics.this_week') }} {{ $bookingMetrics['this_week'] }}
{{ __('admin_metrics.this_month') }} {{ $bookingMetrics['this_month'] }}
{{ __('admin_metrics.free') }} {{ $bookingMetrics['free'] }}
{{ __('admin_metrics.paid') }} {{ $bookingMetrics['paid'] }}
{{ __('admin_metrics.no_show_rate') }} {{ $bookingMetrics['no_show_rate'] }}%
{{-- Timeline Metrics Card --}}
{{ __('admin_metrics.timelines') }}
{{ __('admin_metrics.active_cases') }} {{ $timelineMetrics['active'] }}
{{ __('admin_metrics.archived') }} {{ $timelineMetrics['archived'] }}
{{ __('admin_metrics.updates_this_week') }} {{ $timelineMetrics['updates_this_week'] }}
{{-- Posts Metrics Card --}}
{{ __('admin_metrics.posts') }}
{{ __('admin_metrics.total_published') }} {{ $postMetrics['total_published'] }}
{{ __('admin_metrics.published_this_month') }} {{ $postMetrics['this_month'] }}
{{-- Analytics Charts Section --}}
{{ __('admin_metrics.analytics_charts') }} {{-- Date Range Selector --}}
{{ __('admin_metrics.last_6_months') }} {{ __('admin_metrics.last_12_months') }} {{-- Custom Range --}}
- {{ __('admin_metrics.apply') }}
{{-- Monthly Trends Chart --}}
{{ __('admin_metrics.monthly_trends') }} @if (array_sum($chartData['newClients']) === 0 && array_sum($chartData['consultations']) === 0)
{{ __('admin_metrics.no_data_available') }}
@else
@endif
{{-- Consultation Breakdown Chart --}}
{{ __('admin_metrics.consultation_breakdown') }} @if ($chartData['consultationBreakdown']['free'] === 0 && $chartData['consultationBreakdown']['paid'] === 0)
{{ __('admin_metrics.no_data_available') }}
@else
@endif
{{-- No-show Rate Chart --}}
{{ __('admin_metrics.noshow_rate_trend') }} @if (array_sum($chartData['noShowRates']) === 0)
{{ __('admin_metrics.no_data_available') }}
@else
@endif
@script @endscript