count(); $totalPelanggan = User::where('role', 'pelanggan')->count(); $totalBookings = Booking::count(); $totalServices = TailorService::count(); // Get average rating for all tailors $averageRating = TailorRating::avg('rating') ?? 0; // Get bookings statistics $bookingStats = Booking::select('status', DB::raw('count(*) as total')) ->groupBy('status') ->get() ->pluck('total', 'status') ->toArray(); // Get recent bookings $recentBookings = Booking::with(['customer:id,name', 'tailor:id,name']) ->latest() ->take(5) ->get() ->map(function ($booking) { return [ 'id' => $booking->id, 'customer_name' => $booking->customer->name, 'tailor_name' => $booking->tailor->name, 'status' => $booking->status, 'created_at' => $booking->created_at ]; }); // Get monthly booking statistics for the last 6 months $monthlyStats = Booking::select( DB::raw('DATE_FORMAT(created_at, "%Y-%m") as month'), DB::raw('count(*) as total_bookings'), DB::raw('SUM(CASE WHEN status = "completed" THEN 1 ELSE 0 END) as completed_bookings') ) ->where('created_at', '>=', Carbon::now()->subMonths(6)) ->groupBy('month') ->orderBy('month') ->get(); // Get top rated tailors $topTailors = User::where('role', 'penjahit') ->withAvg('ratings as average_rating', 'rating') ->withCount('ratings') ->withCount('bookings') ->having('ratings_count', '>', 0) ->orderByDesc('average_rating') ->take(5) ->get() ->map(function ($tailor) { return [ 'id' => $tailor->id, 'name' => $tailor->name, 'average_rating' => round($tailor->average_rating, 1), 'total_ratings' => $tailor->ratings_count, 'total_bookings' => $tailor->bookings_count ]; }); // Get latest registered users (both tailors and customers) $recentUsers = User::whereIn('role', ['penjahit', 'pelanggan']) ->latest() ->take(5) ->select('id', 'name', 'role', 'created_at') ->get(); return response()->json([ 'status' => 'success', 'data' => [ 'summary' => [ 'total_penjahit' => $totalPenjahit, 'total_pelanggan' => $totalPelanggan, 'total_bookings' => $totalBookings, 'total_services' => $totalServices, 'average_rating' => round($averageRating, 1) ], 'booking_statistics' => [ 'by_status' => $bookingStats, 'monthly' => $monthlyStats ], 'recent_bookings' => $recentBookings, 'top_tailors' => $topTailors, 'recent_users' => $recentUsers ] ]); } catch (\Exception $e) { return response()->json([ 'status' => 'error', 'message' => 'Failed to retrieve dashboard data', 'error' => $e->getMessage() ], 500); } } }