You can not select more than 25 topics
			Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
		
		
		
		
		
			
		
			
				
					
					
						
							313 lines
						
					
					
						
							13 KiB
						
					
					
				
			
		
		
	
	
							313 lines
						
					
					
						
							13 KiB
						
					
					
				<?php
 | 
						|
 | 
						|
namespace App\Http\Controllers\Admin;
 | 
						|
 | 
						|
use App\Http\Controllers\Controller;
 | 
						|
use App\Models\DeliveryMan;
 | 
						|
use App\Models\Food;
 | 
						|
use App\Models\Order;
 | 
						|
use App\Models\Restaurant;
 | 
						|
use App\Models\User;
 | 
						|
use App\Models\Wishlist;
 | 
						|
use App\Models\OrderTransaction;
 | 
						|
use App\Models\SubscriptionTransaction;
 | 
						|
use Carbon\Carbon;
 | 
						|
use Illuminate\Http\Request;
 | 
						|
use Illuminate\Support\Facades\DB;
 | 
						|
 | 
						|
class DashboardController extends Controller
 | 
						|
{
 | 
						|
    public function dashboard(Request $request)
 | 
						|
    {
 | 
						|
        $params = [
 | 
						|
            'zone_id' => $request['zone_id'] ?? 'all',
 | 
						|
            'statistics_type' => $request['statistics_type'] ?? 'overall',
 | 
						|
            'user_overview' => $request['user_overview'] ?? 'overall',
 | 
						|
            'business_overview' => $request['business_overview'] ?? 'overall',
 | 
						|
        ];
 | 
						|
        session()->put('dash_params', $params);
 | 
						|
        $data = self::dashboard_data();
 | 
						|
        $total_sell = $data['total_sell'];
 | 
						|
        $total_subs = $data['total_subs'];
 | 
						|
        $commission = $data['commission'];
 | 
						|
        return view('admin-views.dashboard', compact('data', 'total_sell','total_subs' ,'commission', 'params'));
 | 
						|
    }
 | 
						|
 | 
						|
    public function order(Request $request)
 | 
						|
    {
 | 
						|
        $params = session('dash_params');
 | 
						|
        foreach ($params as $key => $value) {
 | 
						|
            if ($key == 'statistics_type') {
 | 
						|
                $params['statistics_type'] = $request['statistics_type'];
 | 
						|
            }
 | 
						|
        }
 | 
						|
        session()->put('dash_params', $params);
 | 
						|
 | 
						|
        if ($params['zone_id'] != 'all') {
 | 
						|
            $restaurant_ids = Restaurant::where(['zone_id' => $params['zone_id']])->pluck('id')->toArray();
 | 
						|
        } else {
 | 
						|
            $restaurant_ids = Restaurant::pluck('id')->toArray();
 | 
						|
        }
 | 
						|
        $data = self::order_stats_calc($params['zone_id']);
 | 
						|
        return response()->json([
 | 
						|
            'view' => view('admin-views.partials._dashboard-order-stats', compact('data'))->render(),
 | 
						|
            'order_stats_top' => view('admin-views.partials._order-statics', compact('data'))->render()
 | 
						|
        ], 200);
 | 
						|
    }
 | 
						|
 | 
						|
    public function zone(Request $request)
 | 
						|
    {
 | 
						|
        $params = session('dash_params');
 | 
						|
        foreach ($params as $key => $value) {
 | 
						|
            if ($key == 'zone_id') {
 | 
						|
                $params['zone_id'] = $request['zone_id'];
 | 
						|
            }
 | 
						|
        }
 | 
						|
        session()->put('dash_params', $params);
 | 
						|
 | 
						|
        $data = self::dashboard_data();
 | 
						|
        $total_subs = $data['total_subs'];
 | 
						|
        $total_sell = $data['total_sell'];
 | 
						|
        $commission = $data['commission'];
 | 
						|
        $popular = $data['popular'];
 | 
						|
        $top_deliveryman = $data['top_deliveryman'];
 | 
						|
        $top_rated_foods = $data['top_rated_foods'];
 | 
						|
        $top_restaurants = $data['top_restaurants'];
 | 
						|
        $top_sell = $data['top_sell'];
 | 
						|
 | 
						|
        return response()->json([
 | 
						|
            'popular_restaurants' => view('admin-views.partials._popular-restaurants', compact('popular'))->render(),
 | 
						|
            'top_deliveryman' => view('admin-views.partials._top-deliveryman', compact('top_deliveryman'))->render(),
 | 
						|
            'top_rated_foods' => view('admin-views.partials._top-rated-foods', compact('top_rated_foods'))->render(),
 | 
						|
            'top_restaurants' => view('admin-views.partials._top-restaurants', compact('top_restaurants'))->render(),
 | 
						|
            'top_selling_foods' => view('admin-views.partials._top-selling-foods', compact('top_sell'))->render(),
 | 
						|
 | 
						|
            'order_stats' => view('admin-views.partials._dashboard-order-stats', compact('data'))->render(),
 | 
						|
            'stat_zone' => view('admin-views.partials._zone-change', compact('data'))->render(),
 | 
						|
            'order_stats_top' => view('admin-views.partials._order-statics', compact('data'))->render(),
 | 
						|
            'user_overview' => view('admin-views.partials._user-overview-chart', compact('data'))->render(),
 | 
						|
            'monthly_graph' => view('admin-views.partials._monthly-earning-graph', compact('total_sell','total_subs', 'commission'))->render(),
 | 
						|
        ], 200);
 | 
						|
    }
 | 
						|
 | 
						|
    public function user_overview(Request $request)
 | 
						|
    {
 | 
						|
        $params = session('dash_params');
 | 
						|
        foreach ($params as $key => $value) {
 | 
						|
            if ($key == 'user_overview') {
 | 
						|
                $params['user_overview'] = $request['user_overview'];
 | 
						|
            }
 | 
						|
        }
 | 
						|
        session()->put('dash_params', $params);
 | 
						|
 | 
						|
        $data = self::user_overview_calc($params['zone_id']);
 | 
						|
 | 
						|
        return response()->json([
 | 
						|
            'view' => view('admin-views.partials._user-overview-chart', compact('data'))->render()
 | 
						|
        ], 200);
 | 
						|
    }
 | 
						|
 | 
						|
    public function order_stats_calc($zone_id)
 | 
						|
    {
 | 
						|
        $params = session('dash_params');
 | 
						|
 | 
						|
 | 
						|
        if ($params['statistics_type'] == 'today') {
 | 
						|
            $searching_for_dm = Order::SearchingForDeliveryman()->whereDate('created_at', Carbon::now());
 | 
						|
            $accepted_by_dm = Order::AccepteByDeliveryman()->whereDate('accepted', Carbon::now());
 | 
						|
            $preparing_in_rs = Order::Preparing()->whereDate('processing', Carbon::now());
 | 
						|
            $picked_up = Order::FoodOnTheWay()->whereDate('picked_up', Carbon::now());
 | 
						|
            $delivered = Order::Delivered()->whereDate('delivered', Carbon::now());
 | 
						|
            $canceled = Order::where(['order_status' => 'canceled'])->whereDate('canceled', Carbon::now());
 | 
						|
            $refund_requested = Order::where(['order_status' => 'refund_requested'])->whereDate('refund_requested', Carbon::now());
 | 
						|
            $refunded = Order::where(['order_status' => 'refunded'])->whereDate('refunded', Carbon::now());
 | 
						|
        } else {
 | 
						|
            $searching_for_dm = Order::SearchingForDeliveryman();
 | 
						|
            $accepted_by_dm = Order::AccepteByDeliveryman();
 | 
						|
            $preparing_in_rs = Order::Preparing();
 | 
						|
            $picked_up = Order::FoodOnTheWay();
 | 
						|
            $delivered = Order::Delivered();
 | 
						|
            $canceled = Order::Canceled();
 | 
						|
            $refund_requested = Order::failed();
 | 
						|
            $refunded = Order::Refunded();
 | 
						|
        }
 | 
						|
 | 
						|
        if(is_numeric($zone_id))
 | 
						|
        {
 | 
						|
            $searching_for_dm = $searching_for_dm->Notpos()->OrderScheduledIn(30)->where('zone_id', $zone_id)->count();
 | 
						|
            $accepted_by_dm = $accepted_by_dm->Notpos()->where('zone_id', $zone_id)->count();
 | 
						|
            $preparing_in_rs = $preparing_in_rs->Notpos()->where('zone_id', $zone_id)->count();
 | 
						|
            $picked_up = $picked_up->Notpos()->where('zone_id', $zone_id)->count();
 | 
						|
            $delivered = $delivered->Notpos()->where('zone_id', $zone_id)->count();
 | 
						|
            $canceled = $canceled->Notpos()->where('zone_id', $zone_id)->count();
 | 
						|
            $refund_requested = $refund_requested->Notpos()->where('zone_id', $zone_id)->count();
 | 
						|
            $refunded = $refunded->Notpos()->where('zone_id', $zone_id)->count();
 | 
						|
        }
 | 
						|
        else
 | 
						|
        {
 | 
						|
            $searching_for_dm = $searching_for_dm->Notpos()->OrderScheduledIn(30)->count();
 | 
						|
            $accepted_by_dm = $accepted_by_dm->Notpos()->count();
 | 
						|
            $preparing_in_rs = $preparing_in_rs->Notpos()->count();
 | 
						|
            $picked_up = $picked_up->Notpos()->count();
 | 
						|
            $delivered = $delivered->Notpos()->count();
 | 
						|
            $canceled = $canceled->Notpos()->count();
 | 
						|
            $refund_requested = $refund_requested->Notpos()->count();
 | 
						|
            $refunded = $refunded->Notpos()->count();
 | 
						|
        }
 | 
						|
 | 
						|
 | 
						|
        $data = [
 | 
						|
            'searching_for_dm' => $searching_for_dm,
 | 
						|
            'accepted_by_dm' => $accepted_by_dm,
 | 
						|
            'preparing_in_rs' => $preparing_in_rs,
 | 
						|
            'picked_up' => $picked_up,
 | 
						|
            'delivered' => $delivered,
 | 
						|
            'canceled' => $canceled,
 | 
						|
            'refund_requested' => $refund_requested,
 | 
						|
            'refunded' => $refunded
 | 
						|
        ];
 | 
						|
 | 
						|
 | 
						|
        return $data;
 | 
						|
 | 
						|
 | 
						|
    }
 | 
						|
 | 
						|
    public function user_overview_calc($zone_id)
 | 
						|
    {
 | 
						|
        $params = session('dash_params');
 | 
						|
        //zone
 | 
						|
        if(is_numeric($zone_id))
 | 
						|
        {
 | 
						|
            $customer = User::where('zone_id', $zone_id);
 | 
						|
            $restaurants = Restaurant::where(['zone_id' => $zone_id]);
 | 
						|
            $delivery_man = DeliveryMan::where('zone_id', $zone_id)->Zonewise();
 | 
						|
        }
 | 
						|
        else
 | 
						|
        {
 | 
						|
            $customer = User::whereNotNull('id');
 | 
						|
            $restaurants = Restaurant::whereNotNull('id');
 | 
						|
            $delivery_man = DeliveryMan::Zonewise();
 | 
						|
        }
 | 
						|
        //user overview
 | 
						|
        if ($params['user_overview'] == 'overall') {
 | 
						|
            $customer = $customer->count();
 | 
						|
            $restaurants = $restaurants->count();
 | 
						|
            $delivery_man = $delivery_man->count();
 | 
						|
        } else {
 | 
						|
            $customer = $customer->whereMonth('created_at', date('m'))
 | 
						|
                ->whereYear('created_at', date('Y'))->count();
 | 
						|
            $restaurants = $restaurants->whereMonth('created_at', date('m'))
 | 
						|
                ->whereYear('created_at', date('Y'))->count();
 | 
						|
            $delivery_man = $delivery_man->whereMonth('created_at', date('m'))
 | 
						|
                ->whereYear('created_at', date('Y'))->count();
 | 
						|
        }
 | 
						|
        $data = [
 | 
						|
            'customer' => $customer,
 | 
						|
            'restaurants' => $restaurants,
 | 
						|
            'delivery_man' => $delivery_man
 | 
						|
        ];
 | 
						|
        return $data;
 | 
						|
    }
 | 
						|
 | 
						|
 | 
						|
    public function dashboard_data()
 | 
						|
    {
 | 
						|
        $params = session('dash_params');
 | 
						|
        $data_os = self::order_stats_calc($params['zone_id']);
 | 
						|
        $data_uo = self::user_overview_calc($params['zone_id']);
 | 
						|
 | 
						|
        $popular = Wishlist::with(['restaurant'])
 | 
						|
        ->whereHas('restaurant')
 | 
						|
        ->when(is_numeric($params['zone_id']), function($q)use($params){
 | 
						|
            return $q->whereHas('restaurant', function($query)use($params){
 | 
						|
                return $query->where('zone_id', $params['zone_id']);
 | 
						|
            });
 | 
						|
        })
 | 
						|
        ->select('restaurant_id', DB::raw('COUNT(restaurant_id) as count'))->groupBy('restaurant_id')->orderBy('count', 'DESC')->limit(6)->get();
 | 
						|
        $top_sell = Food::withoutGlobalScopes()
 | 
						|
            ->when(is_numeric($params['zone_id']),function($q)use($params){
 | 
						|
                return $q->whereHas('restaurant', function($query)use($params){
 | 
						|
                    return $query->where('zone_id', $params['zone_id']);
 | 
						|
                });
 | 
						|
            })
 | 
						|
            ->orderBy("order_count", 'desc')
 | 
						|
            ->take(6)
 | 
						|
            ->get();
 | 
						|
        $top_rated_foods = Food::withoutGlobalScopes()
 | 
						|
            ->when(is_numeric($params['zone_id']),function($q)use($params){
 | 
						|
                return $q->whereHas('restaurant', function($query)use($params){
 | 
						|
                    return $query->where('zone_id', $params['zone_id']);
 | 
						|
                });
 | 
						|
            })
 | 
						|
            ->orderBy('rating_count','desc')
 | 
						|
            ->take(6)
 | 
						|
            ->get();
 | 
						|
 | 
						|
        $top_deliveryman = DeliveryMan::
 | 
						|
            when(is_numeric($params['zone_id']), function($q)use($params){
 | 
						|
                return $q->where('zone_id', $params['zone_id']);
 | 
						|
            })
 | 
						|
            ->where('type','zone_wise')
 | 
						|
            ->orderBy("order_count", 'desc')
 | 
						|
            ->take(6)
 | 
						|
            ->get();
 | 
						|
 | 
						|
        $top_restaurants = Restaurant::
 | 
						|
            when(is_numeric($params['zone_id']), function($q)use($params){
 | 
						|
                return $q->where('zone_id', $params['zone_id']);
 | 
						|
            })
 | 
						|
            ->orderBy("order_count", 'desc')
 | 
						|
            ->take(6)
 | 
						|
            ->get();
 | 
						|
 | 
						|
        $total_sell = [];
 | 
						|
        $commission = [];
 | 
						|
        $total_subs= [];
 | 
						|
        for ($i = 1; $i <= 12; $i++) {
 | 
						|
            $total_sell[$i] = OrderTransaction::NotRefunded()
 | 
						|
                ->when(is_numeric($params['zone_id']), function($q)use($params){
 | 
						|
                    return $q->where('zone_id', $params['zone_id']);
 | 
						|
                })
 | 
						|
                ->whereMonth('created_at', $i)->whereYear('created_at', now()->format('Y'))
 | 
						|
                ->sum('order_amount');
 | 
						|
 | 
						|
 | 
						|
                $total_subs[$i] = SubscriptionTransaction::
 | 
						|
                // ->when(is_numeric($params['zone_id']), function($q)use($params){
 | 
						|
                //     return $q->where('zone_id', $params['zone_id']);
 | 
						|
                // })
 | 
						|
                whereMonth('created_at', $i)->whereYear('created_at', now()->format('Y'))
 | 
						|
                ->sum('paid_amount');
 | 
						|
 | 
						|
 | 
						|
 | 
						|
            $commission[$i] = OrderTransaction::NotRefunded()
 | 
						|
                ->when(is_numeric($params['zone_id']), function($q)use($params){
 | 
						|
                    return $q->where('zone_id', $params['zone_id']);
 | 
						|
                })
 | 
						|
                ->whereMonth('created_at', $i)->whereYear('created_at', now()->format('Y'))
 | 
						|
                // ->sum('admin_commission');
 | 
						|
                ->sum(DB::raw('admin_commission + admin_expense - delivery_fee_comission'));
 | 
						|
 | 
						|
            $commission[$i] += OrderTransaction::NotRefunded()
 | 
						|
                ->when(is_numeric($params['zone_id']), function($q)use($params){
 | 
						|
                    return $q->where('zone_id', $params['zone_id']);
 | 
						|
                })
 | 
						|
                ->whereMonth('created_at', $i)->whereYear('created_at', now()->format('Y'))
 | 
						|
                ->sum('delivery_fee_comission');
 | 
						|
        }
 | 
						|
 | 
						|
        $dash_data = array_merge($data_os, $data_uo);
 | 
						|
        $dash_data['popular'] = $popular;
 | 
						|
        $dash_data['top_sell'] = $top_sell;
 | 
						|
        $dash_data['top_rated_foods'] = $top_rated_foods;
 | 
						|
        $dash_data['top_deliveryman'] = $top_deliveryman;
 | 
						|
        $dash_data['top_restaurants'] = $top_restaurants;
 | 
						|
        $dash_data['total_sell'] = $total_sell;
 | 
						|
        $dash_data['total_subs'] = $total_subs;
 | 
						|
        $dash_data['commission'] = $commission;
 | 
						|
 | 
						|
        return $dash_data;
 | 
						|
    }
 | 
						|
}
 | 
						|
 |