name : SellersController.php
<?php

namespace App\Http\Controllers\Admin\Store;

use App\Http\Controllers\Controller;
use App\Models\Group;
use App\Models\GroupUser;
use App\Models\Product;
use App\Models\ProductOrder;
use App\User;
use Illuminate\Http\Request;
use Illuminate\Support\Facades\DB;

class SellersController extends Controller
{
    public function index(Request $request)
    {
        $this->authorize('admin_store_products_sellers');

        $query = User::query()
            ->whereHas('products');

        $users = $this->handleFilters($request, $query)
            ->with([
                'products'
            ])
            ->withCount([
                'products as virtual_products_count' => function ($query) {
                    $query->where('type', Product::$virtual);
                },
                'products as physical_products_count' => function ($query) {
                    $query->where('type', Product::$physical);
                },
                'productOrdersAsSeller as pending_orders_count' => function ($query) {
                    $query->whereNotNull('sale_id');
                    $query->where('status', ProductOrder::$waitingDelivery);
                }
            ])->paginate(10);

        $userGroups = Group::where('status', 'active')
            ->orderBy('created_at', 'desc')
            ->get();

        foreach ($users as $user) {
            $user->total_sales = $this->getTotalSales($user);
            $user->virtual_products_sales = $this->getTotalSales($user, Product::$virtual);
            $user->physical_products_sales = $this->getTotalSales($user, Product::$physical);
        }


        $data = [
            'pageTitle' => trans('update.products_sellers'),
            'users' => $users,
            'userGroups' => $userGroups,
        ];

        return view('admin.store.sellers.index', $data);
    }

    private function getTotalSales($user, $productType = null)
    {
        $types = [Product::$virtual, Product::$physical];

        if ($productType == Product::$virtual) {
            $types = [Product::$virtual];
        } else if ($productType == Product::$physical) {
            $types = [Product::$physical];
        }

        $productIds = $user->products->whereIn('type', $types)->pluck('id')->toArray();

        $sale = ProductOrder::whereIn('product_id', $productIds)
            ->join('sales', 'sales.product_order_id', 'product_orders.id')
            ->select(DB::raw("sum(amount) as total"))
            ->whereNull('sales.refund_at')
            ->whereNotNull('product_orders.sale_id')
            ->first();

        return $sale->total ?? 0;
    }

    private function handleFilters(Request $request, $query)
    {
        $full_name = $request->get('full_name');
        $group_id = $request->get('group_id');
        $role_name = $request->get('role_name');

        if (!empty($full_name)) {
            $query->where('full_name', 'like', "%$full_name%");
        }

        if (!empty($group_id)) {
            $userIds = GroupUser::where('group_id', $group_id)->pluck('user_id')->toArray();

            $query->whereIn('id', $userIds);
        }

        if (!empty($role_name)) {
            $query->where('role_name', $role_name);
        }

        return $query;
    }
}

© 2025 UnknownSec
Courses | Anyleson - Learning Platform
INR (₹)
India Rupee
$
United States Dollar

Courses

17 Courses
Course
Full Stack Web Development

Full Stack Web Development

in Web Development
83:20 Hours
10 Oct 2024
₹28,318.82
Course
Installment and Secure Host

Installment and Secure Host

in Business Strategy
5.00
1:30 Hours
16 Mar 2023
₹118
Course
New Update Features

New Update Features

in Language
4.00
1:30 Hours
21 Jun 2022
Free
Not conducted
Bestseller
New In-App Live System

New In-App Live System

in Communications
5.00
2:30 Hours
1 Mar 2026
₹11.80
Featured
New Learning Page

New Learning Page

in Lifestyle
5.00
3:30 Hours
1 Mar 2022
Free
Finished
How to Travel Around the World

How to Travel Around the World

in Lifestyle
5.00
2:30 Hours
2 Mar 2022
₹29.50

Type

More options