HEX
Server: Apache/2.4.41 (Amazon) OpenSSL/1.0.2k-fips PHP/5.6.40
System: Linux ip-172-31-40-18 4.14.146-93.123.amzn1.x86_64 #1 SMP Tue Sep 24 00:45:23 UTC 2019 x86_64
User: apache (48)
PHP: 5.6.40
Disabled: NONE
Upload Files
File: //var/www/html/punjabcabs/app/Http/Controllers/AdminController.php
<?php

namespace App\Http\Controllers;

use Illuminate\Http\Request;

use App\Helpers\Helper;
use DB;
use Auth;
use Setting;
use Exception;
use PushNotification;
use \Carbon\Carbon;
use App\Http\Controllers\SendPushNotification;
use Twilio;

use App\User;
use App\Fleet;
use App\Admin;
use App\Provider;
use App\UserPayment;
use App\ServiceType;
use App\UserRequests;
use App\ProviderService;
use App\ProviderDevice;
use App\UserRequestRating;
use App\UserRequestPayment;

use App\Waypoint;

use Mail;

class AdminController extends Controller
{
    /**
     * Create a new controller instance.
     *
     * @return void
     */
    public function __construct()
    {
        $this->middleware('admin');
    }


    /**
     * Dashboard.
     *
     * @param  \App\Provider  $provider
     * @return \Illuminate\Http\Response
     */
    public function dashboard()
    {
        $days = 20;

        $range = \Carbon\Carbon::now()->subDays($days);

        $range = date($range);

        $result = DB::select("SELECT
                                Date(user_requests.created_at) as date,
                                COUNT(CASE WHEN user_requests.status = 'COMPLETED' THEN 1 END) AS completed,
                                COUNT(CASE WHEN user_requests.status = 'CANCELLED' THEN 1 END) AS cancelled,
                                IFNULL(ROUND(SUM(user_request_payments.total),2), 0) as revenue
                                
                            FROM user_requests
                            LEFT JOIN user_request_payments
                            ON user_requests.id = user_request_payments.request_id
                            WHERE user_requests.created_at >= '$range'
                            GROUP BY date
                            ORDER BY date DESC");

        $stats = json_encode($result);


        $days = 7;
        $barrange = \Carbon\Carbon::now()->subDays($days);
        $barrange = date($range);
        $barresult = DB::select("SELECT
                                Date(user_requests.created_at) as date,
                                COUNT(CASE WHEN user_requests.booking_by = 'APP' THEN 1 END) AS app,
                                COUNT(CASE WHEN user_requests.booking_by = 'DISPATCHER' THEN 1 END) AS dispatcher,
                                 COUNT(CASE WHEN user_requests.booking_by = 'STREET' THEN 1 END) AS street 
                            FROM user_requests
                            WHERE user_requests.created_at >= '$barrange'
                            GROUP BY date
                            ORDER BY date ASC");

        foreach ($barresult as $key => $stat) {
            $barresult[$key]->date = Helper::date_formatter_rev($stat->date);
        }
        $bar = json_encode($barresult);

        $pierange = Carbon::today();
        $pierange = date($pierange);
        $pieresult = DB::select("SELECT
                                COUNT(CASE WHEN user_requests.cancelled_by = 'USER' THEN 1 END) AS user,
                                COUNT(CASE WHEN user_requests.cancelled_by = 'DISPATCHER' THEN 1 END) AS dispatcher,
                                COUNT(CASE WHEN (user_requests.cancelled_by = 'NODRIVER' || user_requests.cancelled_by = 'REJECTED') THEN 1 END) AS rejected,
                                 COUNT(CASE WHEN user_requests.cancelled_by = 'PROVIDER' THEN 1 END) AS provider 
                            FROM user_requests
                            WHERE user_requests.created_at >= '$pierange'");

        $pie = $pieresult;

        return view('admin.dashboard', compact('stats', 'bar', 'pie'));
    }

    public function content(Request $request)
    {
        try {
            $fromdate = Carbon::today();
            $todate = Carbon::now();

            if ($request->fromdate != '') {
                $fromdate = Helper::date_formatter($request->fromdate);
            }
            if ($request->todate != '') {
                $todate = Helper::date_formatter($request->todate);
            }

            $rides = UserRequests::has('user')
                ->where('created_at', '>=', $fromdate)
                ->where('created_at', '<', $todate)
                ->orderBy('id', 'desc')
                ->get();

            $completed_rides = UserRequests::where('status', 'COMPLETED')
                ->where('created_at', '>=', $fromdate)
                ->where('created_at', '<', $todate)
                ->count();

            $cancel_rides = UserRequests::where('status', 'CANCELLED')
                ->where('created_at', '>=', $fromdate)
                ->where('created_at', '<', $todate)
                ->get();

            $scheduled_rides = UserRequests::where('created_at', '>=', $fromdate)
                ->where('created_at', '<', $todate)
                ->where('status', 'SCHEDULED')
                ->count();

            $dispatcher_rides = UserRequests::where('created_at', '>=', $fromdate)
                ->where('created_at', '<', $todate)
                ->where('booking_by', 'DISPATCHER')
                ->count();

            $street_rides = UserRequests::where('created_at', '>=', $fromdate)
                ->where('created_at', '<', $todate)
                ->where('booking_by', 'STREET')
                ->count();

            $user_cancelled = UserRequests::where('status', 'CANCELLED')
                ->where('created_at', '>=', $fromdate)
                ->where('created_at', '<', $todate)
                ->where('cancelled_by', 'USER')
                ->count();

            $provider_cancelled = UserRequests::where('status', 'CANCELLED')
                ->where('created_at', '>=', $fromdate)
                ->where('created_at', '<', $todate)
                ->where('cancelled_by', 'PROVIDER')
                ->count();

            $dispatcher_cancelled = UserRequests::where('status', 'CANCELLED')
                ->where('created_at', '>=', $fromdate)
                ->where('created_at', '<', $todate)
                ->where('cancelled_by', 'DISPATCHER')
                ->count();

            $service = ServiceType::count();
            $fleet = Fleet::count();

            $revenue = UserRequestPayment::where('created_at', '>=', $fromdate)
                ->where('created_at', '<', $todate)
                ->sum('total');

            $commision = UserRequestPayment::where('created_at', '>=', $fromdate)
                ->where('created_at', '<', $todate)
                ->sum('commision');

            $providers = Provider::take(10)->orderBy('rating', 'desc')->get();


            return view('admin.dashboard-content', compact('providers', 'fleet', 'scheduled_rides', 'service', 'rides', 'completed_rides', 'user_cancelled', 'provider_cancelled', 'dispatcher_cancelled', 'cancel_rides', 'revenue', 'commision', 'dispatcher_rides', 'street_rides'));
        } catch (Exception $e) {
            return redirect()->route('admin.user.index')->with('flash_error', 'Something Went Wrong with Dashboard!');
        }
    }


    /**
     * Heat Map.
     *
     * @param  \App\Provider  $provider
     * @return \Illuminate\Http\Response
     */
    public function heatmap()
    {
        try {
            $rides = UserRequests::has('user')->orderBy('id', 'desc')->get();
            $providers = Provider::take(10)->orderBy('rating', 'desc')->get();
            return view('admin.heatmap', compact('providers', 'rides'));
        } catch (Exception $e) {
            return redirect()->route('admin.user.index')->with('flash_error', 'Something Went Wrong with Dashboard!');
        }
    }

    /**
     * Map of all Users and Drivers.
     *
     * @return \Illuminate\Http\Response
     */
    public function map_index()
    {
        return view('admin.map.index');
    }

    /**
     * Map of all Users and Drivers.
     *
     * @return \Illuminate\Http\Response
     */
    public function map_ajax()
    {
        try {

            $Providers = Provider::where('latitude', '!=', 0)
                ->where('longitude', '!=', 0)
                ->with('service')
                ->get();

            $Users = User::where('latitude', '!=', 0)
                ->where('longitude', '!=', 0)
                ->get();

            for ($i = 0; $i < sizeof($Users); $i++) {
                $Users[$i]->status = 'user';
            }

            $All = $Users->merge($Providers);

            return $All;
        } catch (Exception $e) {
            return [];
        }
    }
    /**
     * Map of all Users and Drivers.
     *
     * @return \Illuminate\Http\Response
     */
    public function dispatch_ajax()
    {
        try {
            $Providers = Provider::join('provider_devices', 'providers.id', '=', 'provider_devices.provider_id')
                ->join('provider_services', 'providers.id', '=', 'provider_services.provider_id')
                ->where('providers.latitude', '!=', 0)
                ->where('providers.longitude', '!=', 0)
                ->where('provider_devices.udid', '!=', '')
                ->whereIn('provider_services.status', array('active', 'riding', 'offline'))
                ->select('providers.id', 'providers.first_name', 'providers.last_name', 'providers.latitude', 'providers.longitude', 'provider_services.status')
                ->getQuery()
                ->get();

            return $Providers;
        } catch (Exception $e) {
            return [];
        }
    }

    /**
     * Map of all Users and Drivers.
     *
     * @return \Illuminate\Http\Response
     */
    public function driver_ajax()
    {
        try {
            $result = Provider::join('provider_devices', 'providers.id', '=', 'provider_devices.provider_id')
                ->join('provider_services', 'providers.id', '=', 'provider_services.provider_id')
                ->join('service_types', 'provider_services.service_type_id', '=', 'service_types.id')
                ->where('provider_devices.udid', '!=', '')
                ->select('providers.id AS id', 'providers.first_name AS firstname', 'providers.last_name AS lastname', 'provider_services.service_number AS taxinumber', 'provider_services.status AS currentstatus', 'service_types.name AS servicename')
                ->getQuery()
                ->get();

            return $result;
        } catch (Exception $e) {
            return [];
        }
    }
    /**
     * Default map coordinates.
     *
     * @return \Illuminate\Http\Response
     */
    public function default_map()
    {
        $lat = Setting::get('address_lat');
        $lng = Setting::get('address_long');
        $zoom = Setting::get('zoom');

        $result = array($lat, $lng, $zoom);
        return $result;
    }

    /**
     * Remove the specified resource from storage.
     *
     * @param  \App\Provider  $provider
     * @return \Illuminate\Http\Response
     */
    public function settings()
    {
        return view('admin.settings.application');
    }

    /**
     * Remove the specified resource from storage.
     *
     * @param  \App\Provider  $provider
     * @return \Illuminate\Http\Response
     */
    public function settings_store(Request $request)
    {

        $this->validate($request, [
            'site_title' => 'required',
            'site_icon' => 'mimes:jpeg,jpg,bmp,png|max:5242880',
            'site_logo' => 'mimes:jpeg,jpg,bmp,png|max:5242880',
        ]);

        if ($request->hasFile('site_icon')) {
            $site_icon = Helper::upload_picture($request->file('site_icon'));
            Setting::set('site_icon', $site_icon);
        }

        if ($request->hasFile('site_logo')) {
            $site_logo = Helper::upload_picture($request->file('site_logo'));
            Setting::set('site_logo', $site_logo);
        }

        if ($request->hasFile('site_email_logo')) {
            $site_email_logo = Helper::upload_picture($request->file('site_email_logo'));
            Setting::set('site_email_logo', $site_email_logo);
        }

        Setting::set('site_title', $request->site_title);
        Setting::set('store_link_android', $request->store_link_android);
        Setting::set('store_link_ios', $request->store_link_ios);
        Setting::set('mail_enable', $request->mail_enable);
        Setting::set('sms_enable', $request->sms_enable);
        Setting::set('country_code', $request->country_code);
        Setting::set('provider_select_timeout', $request->provider_select_timeout);
        Setting::set('provider_search_radius', $request->provider_search_radius);
        Setting::set('distance_unit', $request->distance_unit);
        Setting::set('sos_number', $request->sos_number);
        Setting::set('contact_number', $request->contact_number);
        Setting::set('contact_email', $request->contact_email);
        Setting::set('site_copyright', $request->site_copyright);
        Setting::set('social_login', $request->social_login);
        Setting::set('country', $request->country);
        Setting::set('state', $request->state);
        Setting::set('city', $request->city);
        Setting::set('address', $request->address);
        Setting::set('address_lat', $request->address_lat);
        Setting::set('address_long', $request->address_long);
        Setting::set('zoom', $request->zoom);
        Setting::save();

        return back()->with('flash_success', 'Settings Updated Successfully');
    }

    /**
     * Remove the specified resource from storage.
     *
     * @param  \App\Provider  $provider
     * @return \Illuminate\Http\Response
     */
    public function settings_payment()
    {
        $wheelservices = ServiceType::select('id', 'name')->get();
        return view('admin.payment.settings', compact('wheelservices'));
    }

    /**
     * Save payment related settings.
     *
     * @param  \App\Provider  $provider
     * @return \Illuminate\Http\Response
     */
    public function settings_payment_store(Request $request)
    {

        $this->validate($request, [
            'CARD' => 'in:on',
            'CASH' => 'in:on',
            'stripe_secret_key' => 'required_if:CARD,on|max:255',
            'stripe_publishable_key' => 'required_if:CARD,on|max:255',
            'tax_percentage' => 'required|min:0|max:100',
            'commission_percentage' => 'required|numeric|min:0|max:100',
            'currency' => 'required'
        ]);

        Setting::set('CARD', $request->has('CARD') ? 1 : 0);
        Setting::set('CASH', $request->has('CASH') ? 1 : 0);
        Setting::set('stripe_secret_key', $request->stripe_secret_key);
        Setting::set('stripe_publishable_key', $request->stripe_publishable_key);
        Setting::set('transaction_percentage', $request->transaction_percentage);
        Setting::set('tax_percentage', $request->tax_percentage);
        Setting::set('sro_levy', $request->sro_levy);
        Setting::set('commission_enable', $request->commission_enable);
        Setting::set('commission_percentage', $request->commission_percentage);
        Setting::set('cancellation_min', $request->cancellation_min);
        Setting::set('cancellation_fare', $request->cancellation_fare);
        Setting::set('wheelchair_service', $request->wheelchair_service);
        Setting::set('wheelchair_discount', $request->wheelchair_discount);
        Setting::set('currency', $request->currency);
        Setting::set('booking_prefix', $request->booking_prefix);
        Setting::save();

        return back()->with('flash_success', 'Settings Updated Successfully');
    }

    /**
     * Remove the specified resource from storage.
     *
     * @param  \App\Provider  $provider
     * @return \Illuminate\Http\Response
     */
    public function profile()
    {
        return view('admin.account.profile');
    }

    /**
     * Remove the specified resource from storage.
     *
     * @param  \App\Provider  $provider
     * @return \Illuminate\Http\Response
     */
    public function profile_update(Request $request)
    {

        $this->validate($request, [
            'name' => 'required|max:255',
            'email' => 'required',
            'picture' => 'mimes:jpeg,jpg,bmp,png|max:5242880',
        ]);

        try {
            $admin = Auth::guard('admin')->user();
            $admin->name = $request->name;
            $admin->email = $request->email;
            if ($request->hasFile('picture')) {
                $admin->picture = $request->picture->store('admin/profile');
            }
            $admin->save();

            return redirect()->back()->with('flash_success', 'Profile Updated');
        } catch (Exception $e) {
            return back()->with('flash_error', 'Something Went Wrong!');
        }
    }

    /**
     * Remove the specified resource from storage.
     *
     * @param  \App\Provider  $provider
     * @return \Illuminate\Http\Response
     */
    public function password()
    {
        return view('admin.account.change-password');
    }

    /**
     * Remove the specified resource from storage.
     *
     * @param  \App\Provider  $provider
     * @return \Illuminate\Http\Response
     */
    public function password_update(Request $request)
    {

        $this->validate($request, [
            'old_password' => 'required',
            'password' => 'required|min:6|confirmed',
        ]);

        try {

            $Admin = Admin::find(Auth::guard('admin')->user()->id);

            if (password_verify($request->old_password, $Admin->password)) {
                $Admin->password = bcrypt($request->password);
                $Admin->save();

                return redirect()->back()->with('flash_success', 'Password Updated');
            }
        } catch (Exception $e) {
            return back()->with('flash_error', 'Something Went Wrong!');
        }
    }

    /**
     * Remove the specified resource from storage.
     *
     * @param  \App\Provider  $provider
     * @return \Illuminate\Http\Response
     */
    public function payment()
    {
        try {
            $payments = UserRequests::where('paid', 1)
                ->has('user')
                ->has('provider')
                ->has('payment')
                ->orderBy('user_requests.created_at', 'desc')
                ->get();

            return view('admin.payment.payment-history', compact('payments'));
        } catch (Exception $e) {
            return back()->with('flash_error', 'Something Went Wrong!');
        }
    }

    /**
     * Display a listing of the resource.
     *
     * @return \Illuminate\Http\Response
     */
    public function payment_row(Request $request)
    {

        $columns = array(
            0 => 'request_id',
            1 => 'transaction_id',
            2 => 'from',
            3 => 'to',
            4 => 'total_amount',
            5 => 'payment_mode',
            6 => 'payment_status',
        );

        $payment_list = UserRequests::where('paid', 1)
            ->has('user')
            ->has('provider')
            ->has('payment')
            ->orderBy('user_requests.created_at', 'desc');

        $totalData = $payment_list->count();
        $totalFiltered = $totalData;

        $limit = $request->input('length');
        $start = $request->input('start');
        $order = $columns[$request->input('order.0.column')];
        $dir = $request->input('order.0.dir');

        if (empty($request->input('search.value'))) {
            $Payments = $payment_list->offset($start)
                ->limit($limit)
                ->orderBy('id', 'desc')
                ->get();
        } else {
            $search = $request->input('search.value');

            $Payments =  $payment_list->where('id', 'LIKE', "%{$search}%")
                ->offset($start)
                ->limit($limit)
                ->orderBy('id', 'desc')
                ->get();

            $totalFiltered = $payment_list->where('id', 'LIKE', "%{$search}%")
                ->count();
        }

        $data = array();
        if (!empty($Payments)) {
            foreach ($Payments as $index => $payment) {

                if ($payment->user) {
                    if ($payment->user->first_name != '') {
                        $first_name = $payment->user->first_name;
                    } else {
                        $first_name = "";
                    }
                    if ($payment->user->last_name != '') {
                        $last_name = $payment->user->last_name;
                    } else {
                        $last_name = "";
                    }
                } else {
                    $first_name = 'Not Found';
                    $last_name = 'Not Found';
                }

                if ($payment->provider) {
                    if ($payment->provider->first_name != '') {
                        $provider_first_name = $payment->provider->first_name;
                    } else {
                        $provider_first_name = "";
                    }
                    if ($payment->provider->last_name != '') {
                        $provider_last_name = $payment->provider->last_name;
                    } else {
                        $provider_last_name = "";
                    }
                } else {
                    $provider_first_name = 'Not Found';
                    $provider_last_name = 'Not Found';
                }
                if ($payment->paid) {
                    $status = 'Paid';
                } else {
                    $status = 'Not Paid';
                }
                $user_name = $first_name . ' ' . $last_name;
                $provider_name = $provider_first_name . ' ' . $provider_last_name;
                $nestedData['request_id'] = $payment->id;
                $nestedData['transaction_id'] =  $payment->payment->payment_id;
                $nestedData['from'] =  $user_name;
                $nestedData['to'] = $provider_name;
                $nestedData['total_amount'] = '<span class="text-info">' . currency($payment->payment->total) . '</span>';
                $nestedData['payment_mode'] = $payment->payment_mode;
                $nestedData['payment_status'] = $status;
                $data[] = $nestedData;
                $start++;
            }
        }
        $json_data = array(
            "draw"            => intval($request->input('draw')),
            "recordsTotal"    => intval($totalData),
            "recordsFiltered" => intval($totalFiltered),
            "data"            => $data
        );

        echo json_encode($json_data);
    }
    /**
     * Remove the specified resource from storage.
     *
     * @param  \App\Provider  $provider
     * @return \Illuminate\Http\Response
     */
    public function help()
    {
        try {
            return view('admin.help');
        } catch (Exception $e) {
            return back()->with('flash_error', 'Something Went Wrong!');
        }
    }

    /**
     * User Rating.
     *
     * @return \Illuminate\Http\Response
     */
    public function user_review()
    {
        try {
            $Reviews = UserRequestRating::where('user_id', '!=', 0)->has('user')->has('provider')->get();
            return view('admin.review.user_review', compact('Reviews'));
        } catch (Exception $e) {
            return redirect()->route('admin.setting')->with('flash_error', 'Something ');
        }
    }
    /**
     * Display a listing of the resource.
     *
     * @return \Illuminate\Http\Response
     */
    public function reviewuser_row(Request $request)
    {

        $columns = array(
            0 => 'id',
            1 => 'request_id',
            2 => 'user_name',
            3 => 'provider_name',
            4 => 'rating',
            5 => 'date_time',
            6 => 'comments',
        );
        $user_review = UserRequestRating::where('user_id', '!=', 0)->with('user', 'provider');
        $totalData = $user_review->count();
        $totalFiltered = $totalData;

        $limit = $request->input('length');
        $start = $request->input('start');
        $order = $columns[$request->input('order.0.column')];
        $dir = $request->input('order.0.dir');

        if (empty($request->input('search.value'))) {
            $Reviews = $user_review->offset($start)
                ->limit($limit)
                ->orderBy('id', 'desc')
                ->get();
        } else {
            $search = $request->input('search.value');

            $Reviews =  $user_review->where('request_id', 'LIKE', "%{$search}%")
                ->offset($start)
                ->limit($limit)
                ->orderBy('id', 'desc')
                ->get();

            $totalFiltered = $user_review->where('request_id', 'LIKE', "%{$search}%")
                ->count();
        }

        $data = array();
        if (!empty($Reviews)) {
            foreach ($Reviews as $index => $review) {
                if ($review->user) {
                    if ($review->user->first_name != '') {
                        $first_name = $review->user->first_name;
                    } else {
                        $first_name = "";
                    }
                    if ($review->user->last_name != '') {
                        $last_name = $review->user->last_name;
                    } else {
                        $last_name = "";
                    }
                } else {
                    $first_name = 'Not Found';
                    $last_name = 'Not Found';
                }

                if ($review->provider) {
                    if ($review->provider->first_name != '') {
                        $provider_first_name = $review->provider->first_name;
                    } else {
                        $provider_first_name = "";
                    }
                    if ($review->provider->last_name != '') {
                        $provider_last_name = $review->provider->last_name;
                    } else {
                        $provider_last_name = "";
                    }
                } else {
                    $provider_first_name = 'Not Found';
                    $provider_last_name = 'Not Found';
                }

                $rating = '<div className="rating-outer">
                                    <input type="hidden" value="' . $review->user_rating . '" name="rating" class="rating"/>
                                </div>';
                $user_name = $first_name . ' ' . $last_name;
                $provider_name = $provider_first_name . ' ' . $provider_last_name;
                $nestedData['id'] = $start + 1;
                $nestedData['request_id'] = $review->request_id;
                $nestedData['user_name'] =  $user_name;
                $nestedData['provider_name'] =  $provider_name;
                $nestedData['rating'] = $rating;
                $nestedData['date_time'] = date_formatter($review->created_at);
                $nestedData['comments'] = $review->user_comment;
                $data[] = $nestedData;
                $start++;
            }
        }
        $json_data = array(
            "draw"            => intval($request->input('draw')),
            "recordsTotal"    => intval($totalData),
            "recordsFiltered" => intval($totalFiltered),
            "data"            => $data
        );

        echo json_encode($json_data);
    }
    /**
     * Provider Rating.
     *
     * @return \Illuminate\Http\Response
     */
    public function provider_review()
    {
        try {
            $Reviews = UserRequestRating::where('provider_id', '!=', 0)->has('user')->has('provider')->get();
            return view('admin.review.provider_review', compact('Reviews'));
        } catch (Exception $e) {
            return redirect()->route('admin.setting')->with('flash_error', 'Something Went Wrong!');
        }
    }
    /**
     * Display a listing of the resource.
     *
     * @return \Illuminate\Http\Response
     */
    public function reviewprovider_row(Request $request)
    {

        $columns = array(
            0 => 'id',
            1 => 'request_id',
            2 => 'user_name',
            3 => 'provider_name',
            4 => 'rating',
            5 => 'date_time',
            6 => 'comments',
        );
        $provider_review = UserRequestRating::where('provider_id', '!=', 0)->with('user', 'provider');
        $totalData = $provider_review->count();
        $totalFiltered = $totalData;

        $limit = $request->input('length');
        $start = $request->input('start');
        $order = $columns[$request->input('order.0.column')];
        $dir = $request->input('order.0.dir');

        if (empty($request->input('search.value'))) {
            $Reviews = $provider_review->offset($start)
                ->limit($limit)
                ->orderBy('id', 'desc')
                ->get();
        } else {
            $search = $request->input('search.value');

            $Reviews =  $provider_review->where('request_id', 'LIKE', "%{$search}%")
                ->offset($start)
                ->limit($limit)
                ->orderBy('id', 'desc')
                ->get();

            $totalFiltered = $provider_review->where('request_id', 'LIKE', "%{$search}%")
                ->count();
        }

        $data = array();
        if (!empty($Reviews)) {
            foreach ($Reviews as $index => $review) {
                if ($review->user) {
                    if ($review->user->first_name != '') {
                        $first_name = $review->user->first_name;
                    } else {
                        $first_name = "";
                    }
                    if ($review->user->last_name != '') {
                        $last_name = $review->user->last_name;
                    } else {
                        $last_name = "";
                    }
                } else {
                    $first_name = 'Not Found';
                    $last_name = 'Not Found';
                }

                if ($review->provider) {
                    if ($review->provider->first_name != '') {
                        $provider_first_name = $review->provider->first_name;
                    } else {
                        $provider_first_name = "";
                    }
                    if ($review->provider->last_name != '') {
                        $provider_last_name = $review->provider->last_name;
                    } else {
                        $provider_last_name = "";
                    }
                } else {
                    $provider_first_name = 'Not Found';
                    $provider_last_name = 'Not Found';
                }

                $rating = '<div className="rating-outer">
                                    <input type="hidden" value="' . $review->provider_rating . '" name="rating" class="rating"/>
                                </div>';
                $user_name = $first_name . ' ' . $last_name;
                $provider_name = $provider_first_name . ' ' . $provider_last_name;
                $nestedData['id'] = $start + 1;
                $nestedData['request_id'] = $review->request_id;
                $nestedData['user_name'] =  $user_name;
                $nestedData['provider_name'] =  $provider_name;
                $nestedData['rating'] = $rating;
                $nestedData['date_time'] = date_formatter($review->created_at);
                $nestedData['comments'] = $review->provider_comment;
                $data[] = $nestedData;
                $start++;
            }
        }
        $json_data = array(
            "draw"            => intval($request->input('draw')),
            "recordsTotal"    => intval($totalData),
            "recordsFiltered" => intval($totalFiltered),
            "data"            => $data
        );

        echo json_encode($json_data);
    }
    /**
     * Remove the specified resource from storage.
     *
     * @param  \App\ProviderService
     * @return \Illuminate\Http\Response
     */
    public function destory_provider_service($id)
    {
        try {
            ProviderService::find($id)->delete();
            return back()->with('message', 'Service deleted successfully');
        } catch (Exception $e) {
            return back()->with('flash_error', 'Something Went Wrong!');
        }
    }

    /**
     * Testing page for push notifications.
     *
     * @return \Illuminate\Http\Response
     */
    public function push_index()
    {
        $data = PushNotification::app('IOSUser')
            ->to('163e4c0ca9fe084aabeb89372cf3f664790ffc660c8b97260004478aec61212c')
            ->send('Hello World, i`m a push message');
        dd($data);

        $data = PushNotification::app('IOSProvider')
            ->to('a9b9a16c5984afc0ea5b681cc51ada13fc5ce9a8c895d14751de1a2dba7994e7')
            ->send('Hello World, i`m a push message');
        dd($data);
    }

    /**
     * Testing page for push notifications.
     *
     * @return \Illuminate\Http\Response
     */
    public function push_store(Request $request)
    {
        try {
            ProviderService::find($id)->delete();
            return back()->with('message', 'Service deleted successfully');
        } catch (Exception $e) {
            return back()->with('flash_error', 'Something Went Wrong!');
        }
    }

    /**
     * privacy.
     *
     * @param  \App\Provider  $provider
     * @return \Illuminate\Http\Response
     */

    public function privacy()
    {
        return view('admin.pages.static')
            ->with('title', "Privacy Page")
            ->with('page', "privacy");
    }

    /**
     * pages.
     *
     * @param  \App\Provider  $provider
     * @return \Illuminate\Http\Response
     */
    public function pages(Request $request)
    {
        $this->validate($request, [
            'page' => 'required|in:page_privacy',
            'content' => 'required',
        ]);

        Setting::set($request->page, $request->content);
        Setting::save();

        return back()->with('flash_success', 'Content Updated!');
    }

    /**
     * legal pages.
     *
     * @param  \App\Provider  $provider
     * @return \Illuminate\Http\Response
     */
    public function term_pages(Request $request)
    {
        $this->validate($request, [
            'page' => 'required|in:term_condition',
            'content' => 'required',
        ]);

        Setting::set($request->page, $request->content);
        Setting::save();

        return back()->with('flash_success', 'Content Updated!');
    }
    /**
     * account statements.
     *
     * @param  \App\Provider  $provider
     * @return \Illuminate\Http\Response
     */
    public function statement($type = 'individual')
    {

        try {

            $page = 'Ride Statement';

            if ($type == 'individual') {
                $page = 'Provider Ride Statement';
            } elseif ($type == 'today') {
                $page = 'Today Statement - ' . date('d M Y');
            } elseif ($type == 'monthly') {
                $page = 'This Month Statement - ' . date('F');
            } elseif ($type == 'yearly') {
                $page = 'This Year Statement - ' . date('Y');
            }
            $type_data = $type;
            return view('admin.providers.statement', compact('page', 'type_data'));
        } catch (Exception $e) {
            return back()->with('flash_error', 'Something Went Wrong!');
        }
    }


    public function statement_content(Request $request)
    {

        $columns = array(
            0 => 'id',
            1 => 'booking_id',
            2 => 's_address',
            3 => 'd_address',
            4 => 'detail',
            5 => 'created_at',
            6 => 'status',
            7 => 'payment_mode',
            8 => 'total',
            9 => 'commission',
            10 => 'earned',
        );
        $fromdate = '';
        $todate = Carbon::now();
        $payment_type = '';
        $tripstatus = '';
        if ($request->type_data != '') {
            $type = $request->type_data;
            if ($type == 'today') {
                $fromdate = Carbon::today();
            }
            if ($type == 'monthly') {
                $fromdate = Carbon::now()->startOfMonth();
            }
            if ($type == 'yearly') {
                $fromdate = Carbon::now()->year;
            }
        }

        if ($request->fromdate != '') {
            $fromdate = Helper::date_formatter($request->fromdate);
        }
        if ($request->todate != '') {
            $todate = Helper::date_formatter($request->todate);
        }
        if ($request->has('payment')) {
            $payment_type = $request->payment;
        }
        if ($request->has('tripstatus')) {
            $tripstatus = $request->tripstatus;
        }
        $main_detail = UserRequests::with('payment')
            ->where('created_at', '>=', $fromdate)
            ->where('created_at', '<', $todate)
            ->where('status', 'LIKE', '%' . $tripstatus . '%')
            ->where('payment_mode', 'LIKE', '%' . $payment_type . '%');

        $cancel_rides = UserRequests::where('status', 'CANCELLED')
            ->where('created_at', '>=', $fromdate)
            ->where('created_at', '<', $todate)
            ->where('status', 'LIKE', '%' . $tripstatus . '%')
            ->where('payment_mode', 'LIKE', '%' . $payment_type . '%');

        $revenue = UserRequestPayment::where('created_at', '>=', $fromdate)
            ->where('created_at', '<', $todate)
            ->sum('total');

        $commision = UserRequestPayment::where('created_at', '>=', $fromdate)
            ->where('created_at', '<', $todate)
            ->sum('commision');

        $total_cancel = $cancel_rides->count();
        $total_revenue = currency($revenue);
        $total_commission = currency($commision);
        $totalData = $main_detail->count();
        $totalFiltered = $totalData;

        $limit = $request->input('length');
        $start = $request->input('start');
        $order = $columns[$request->input('order.0.column')];
        $dir = $request->input('order.0.dir');

        if (empty($request->input('search.value'))) {
            $rides = $main_detail
                ->offset($start)
                ->limit($limit)
                ->orderBy('id', 'desc')
                ->get();
        } else {
            $search = $request->input('search.value');

            $rides =  $main_detail
                ->where('booking_id', 'LIKE', "%{$search}%")
                ->orWhere('s_address', 'LIKE', "%{$search}%")
                ->orWhere('d_address', 'LIKE', "%{$search}%")
                ->orWhere('created_at', 'LIKE', "%{$search}%")
                ->offset($start)
                ->limit($limit)
                ->orderBy('id', 'desc')
                ->get();

            $totalFiltered = $main_detail
                ->where('booking_id', 'LIKE', "%{$search}%")
                ->orWhere('s_address', 'LIKE', "%{$search}%")
                ->orWhere('d_address', 'LIKE', "%{$search}%")
                ->orWhere('created_at', 'LIKE', "%{$search}%")
                ->count();
        }

        $data = array();
        if (!empty($rides)) {
            foreach ($rides as $index => $ride) {
                $view =  route('admin.requests.show', $ride->id);
                if ($ride->s_address != '') {
                    $s_address = $ride->s_address;
                } else {
                    $s_address = "Not Provided";
                }
                if ($ride->d_address != '') {
                    $d_address = $ride->d_address;
                } else {
                    $d_address = "Not Provided";
                }
                if ($ride->status != 'CANCELLED') {
                    $detail = '<a class="text-primary" href="' . $view . '"><div class="label label-table label-info">' . trans("admin.member.view") . '</div></a>';
                } else {
                    $detail = '<span>' . trans("admin.member.no_details_found") . '</span>';
                }
                if ($ride->status == "COMPLETED") {
                    $status = '<span class="label label-table label-success">' . $ride->status . '</span>';
                } elseif ($ride->status == "CANCELLED") {
                    $status = '<span class="label label-table label-danger">' . $ride->status . '</span>';
                } else {
                    $status = '<span class="label label-table label-primary">' . $ride->status . '</span>';
                }

                $nestedData['id'] = $start + 1;
                $nestedData['booking_id'] = $ride->booking_id;
                $nestedData['s_address'] =  $s_address;
                $nestedData['d_address'] =  $d_address;
                $nestedData['detail'] = $detail;
                $nestedData['created_at'] = date_formatter($ride->created_at);
                $nestedData['status'] = $status;
                $nestedData['payment_mode'] = $ride->payment_mode;
                $nestedData['total'] = currency($ride->payment['total']);
                $nestedData['commission'] = currency($ride->payment['commision']);
                $nestedData['earned'] = currency($ride->payment['total'] - $ride->payment['commision']);
                $data[] = $nestedData;
                $start++;
            }
        }
        $percentage = 0.00;
        if ($total_cancel != 0) {
            $percentage = round($total_cancel / $totalFiltered, 2);
        }
        $json_data = array(
            "draw"            => intval($request->input('draw')),
            "recordsTotal"    => intval($totalData),
            "recordsFiltered" => intval($totalFiltered),
            "data"            => $data,
            "cancel_rides"    => $total_cancel,
            "revenue"         => $total_revenue,
            "commission"      => $total_commission,
            "percentage"      => $percentage
        );

        echo json_encode($json_data);
    }

    /**
     * account statements today.
     *
     * @param  \App\Provider  $provider
     * @return \Illuminate\Http\Response
     */
    public function statement_today()
    {
        return $this->statement('today');
    }

    /**
     * account statements monthly.
     *
     * @param  \App\Provider  $provider
     * @return \Illuminate\Http\Response
     */
    public function statement_monthly()
    {
        return $this->statement('monthly');
    }

    /**
     * account statements monthly.
     *
     * @param  \App\Provider  $provider
     * @return \Illuminate\Http\Response
     */
    public function statement_yearly()
    {
        return $this->statement('yearly');
    }


    /**
     * account statements.
     *
     * @param  \App\Provider  $provider
     * @return \Illuminate\Http\Response
     */
    public function statement_provider()
    {

        try {

            $Providers = Provider::all();

            return view('admin.providers.provider-statement', compact('Providers'))->with('page', 'Driver Statement');
        } catch (Exception $e) {
            return back()->with('flash_error', 'Something Went Wrong!');
        }
    }
    /**
     * Display a listing of the resource.
     *
     * @return \Illuminate\Http\Response
     */
    public function statement_providerlist(Request $request)
    {

        $columns = array(
            0 => 'id',
            1 => 'provider_name',
            2 => 'mobile',
            3 => 'status',
            4 => 'total_rides',
            5 => 'total',
            6 => 'commission',
            7 => 'earnings',
            8 => 'joined_at',
            9 => 'details',
        );
        $Providerslist = Provider::all();
        foreach ($Providerslist as $index => $Provider) {
            $Rides = UserRequests::where('provider_id', $Provider->id)
                ->orderBy('id', 'desc')
                ->get()->pluck('id');

            $Providerslist[$index]->rides_count = $Rides->count();
            $Providerslist[$index]->payment = UserRequestPayment::whereIn('request_id', $Rides)
                ->select(\DB::raw(
                    'SUM(total) as overall, SUM(commision) as commission, SUM(total - commision) as earning'
                ))->get();
        }

        $totalData = $Providerslist->count();
        $totalFiltered = $totalData;

        $limit = $request->input('length');
        $start = $request->input('start');
        $order = $columns[$request->input('order.0.column')];
        $dir = $request->input('order.0.dir');

        if (empty($request->input('search.value'))) {
            $Providers = Provider::offset($start)
                ->limit($limit)
                ->orderBy('id', 'desc')
                ->get();
            foreach ($Providers as $index => $Provider) {
                $Rides = UserRequests::where('provider_id', $Provider->id)
                    ->orderBy('id', 'desc')
                    ->get()->pluck('id');

                $Providers[$index]->rides_count = $Rides->count();
                $Providers[$index]->payment = UserRequestPayment::whereIn('request_id', $Rides)
                    ->select(\DB::raw(
                        'SUM(total) as overall, SUM(commision) as commission, SUM(total - commision) as earning'
                    ))->get();
            }
        } else {
            $search = $request->input('search.value');

            $Providers =  Provider::where('first_name', 'LIKE', "%{$search}%")
                ->orWhere('last_name', 'LIKE', "%{$search}%")
                ->orWhere('mobile', 'LIKE', "%{$search}%")
                ->orWhere('status', 'LIKE', "%{$search}%")
                ->offset($start)
                ->limit($limit)
                ->orderBy('id', 'desc')
                ->get();
            foreach ($Providers as $index => $Provider) {
                $Rides = UserRequests::where('provider_id', $Provider->id)
                    ->orderBy('id', 'desc')
                    ->get()->pluck('id');

                $Providers[$index]->rides_count = $Rides->count();
                $Providers[$index]->payment = UserRequestPayment::whereIn('request_id', $Rides)
                    ->select(\DB::raw(
                        'SUM(total) as overall, SUM(commision) as commission, SUM(total - commision) as earning'
                    ))->get();
            }

            $totalFiltered = Provider::where('first_name', 'LIKE', "%{$search}%")
                ->orWhere('last_name', 'LIKE', "%{$search}%")
                ->orWhere('mobile', 'LIKE', "%{$search}%")
                ->orWhere('status', 'LIKE', "%{$search}%")
                ->count();
        }

        $data = array();
        if (!empty($Providers)) {
            foreach ($Providers as $index => $provider) {

                if ($provider->first_name != '') {
                    $first_name = $provider->first_name;
                } else {
                    $first_name = "-";
                }
                if ($provider->last_name != '') {
                    $last_name = $provider->last_name;
                } else {
                    $last_name = "-";
                }

                if ($provider->status == "approved") {
                    $status = '<span class="label label-table label-success">' . $provider->status . '</span>';
                } elseif ($provider->status == "banned") {
                    $status = '<span class="label label-table label-danger">' . $provider->status . '</span>';
                } else {
                    $status = '<span class="label label-table label-primary">' . $provider->status . '</span>';
                }

                if ($provider->rides_count) {
                    $rides = $provider->rides_count;
                } else {
                    $rides = '-';
                }

                if ($provider->payment) {
                    $total = currency($provider->payment[0]->overall);
                } else {
                    $total = '-';
                }

                if ($provider->payment) {
                    $commission = currency($provider->payment[0]->commission);
                } else {
                    $commission = '-';
                }

                if ($provider->payment) {
                    $earnings = currency($provider->payment[0]->earning);
                } else {
                    $earnings = '-';
                }

                if ($provider->created_at) {
                    $joined_at = date_formatter($provider->created_at);
                } else {
                    $joined_at = '-';
                }
                $details = '<a href="' . route('admin.provider.statement', $provider->id) . '"><div class="label label-table label-info">' . trans("admin.member.view") . '</div></a>';
                $provider_name = $first_name . ' ' . $last_name;
                $nestedData['id'] = $start + 1;
                $nestedData['provider_name'] = $provider_name;
                $nestedData['mobile'] =  $provider->mobile;
                $nestedData['status'] =  $status;
                $nestedData['total_rides'] = $rides;
                $nestedData['total'] = $total;
                $nestedData['commission'] = $commission;
                $nestedData['earnings'] = $earnings;
                $nestedData['joined_at'] = $joined_at;
                $nestedData['details'] = $details;
                $data[] = $nestedData;
                $start++;
            }
        }
        $json_data = array(
            "draw"            => intval($request->input('draw')),
            "recordsTotal"    => intval($totalData),
            "recordsFiltered" => intval($totalFiltered),
            "data"            => $data
        );

        echo json_encode($json_data);
    }

    /**
     * Remove the specified resource from storage.
     *
     * @param  \App\Provider  $provider
     * @return \Illuminate\Http\Response
     */
    public function translation()
    {

        try {
            return view('admin.translation');
        } catch (Exception $e) {
            return back()->with('flash_error', 'Something Went Wrong!');
        }
    }

    public function fcm()
    {
        $result =    PushNotification::setService('fcm')
            ->setMessage([/*'notification' => [
                                     'title'=>'This is the title driver',
                                     'body'=>'This is the message',
                                     'sound' => 'default'
                                     ],*/
                'data' => [
                    'title' => 'This is the title data',
                    'body' => 'This is the message',
                ]
            ])
            ->setApiKey('AAAADyP26dw:APA91bHzu8EoO1z6v5X61XKGDQpMRf9ki8-K6NNDB8Co53oyTjcVZ3D1FqGpHof8GTaYLqSQ2ucQxbZl5RSHEjCHixZCA-Ijz4hvCbDOFcE8e1O8FkCsq2CAPHKuoj-rak9imNdA36eH')
            ->setDevicesToken('cxUcpG3HNAQ:APA91bFUNip59J3G_59hazuVbP4oYSBL0LxeSxZFNaFOe9boAn-SCXhTlH2L2296L8YagM3Z8rFJbUdkvqtbcEZu0CMvqwEhWKZPRUA2Z1FXFC1PmuIi-qdfhCJiJvFRaY9qGq9y3_n8CIpMviybxa7brp3coxhEdQ')
            ->send()
            ->getFeedback();
        dd($result);
    }
    /**
     * Add CSV.
     */
    public function addCSV(Request $request)
    {
        //$days = 20;
        //return view('admin.add-csv', compact('days'));
        return view('admin.add-csv');
    }
    /**
     * Upload CSV.
     */
    public function uploadCSV(Request $request)
    {
        if ($request->input()) {
            $file = $request->file('csv_file');
            // echo 'File Name: ' . $file->getClientOriginalName();
            // echo 'File Extension: ' . $file->getClientOriginalExtension();
            $destinationPath = public_path('csv');
            if (!file_exists($destinationPath)) {
                mkdir($destinationPath, 0777, true);
            }
            $file_name = time() . strtolower(trim($file->getClientOriginalName()));
            $file->move($destinationPath, $file_name);
            $csv = public_path('csv/' . $file_name);
            $dataArr = $this->csvToArray($csv);
            $firstArray = array();
            $secondArray = array();
            //dd($dataArr);
            $process_date = '';
            $account_no = '';
            //for ($i = 0; $i < count($dataArr); $i++) {
            for ($i = 0; $i < 5; $i++) {
                if ($i == 0 || $i == 1 || $i == 2) {
                    if ($dataArr[$i][0] == 'Process Date') {
                        $firstArray['process_date'] = date_format(date_create(str_replace('/', '-', $dataArr[$i][2])), 'Y-m-d');
                        $process_date = date_format(date_create(str_replace('/', '-', $dataArr[$i][2])), 'Y-m-d');
                    } else if ($dataArr[$i][0] == 'Pay Period') {
                        $firstArray['pay_period'] = $dataArr[$i][2];
                    } else if ($dataArr[$i][0] == 'Pay Run') {
                        $firstArray['pay_run'] = $dataArr[$i][2];
                    }
                    if ($dataArr[$i][4] != '' && $dataArr[$i][4] == 'Account Name') {
                        $firstArray['account_name'] = $dataArr[$i][6];
                    } else if ($dataArr[$i][4] != '' && $dataArr[$i][4] == 'Account Number ') {
                        $account_no = $dataArr[$i][6];
                        $firstArray['account_no'] = $dataArr[$i][6];
                    }
                }
                if ($i == 4) {
                    $firstArray['payment_total'] = $dataArr[$i]['Payment Total'];
                    $firstArray['taxi_total'] = $dataArr[$i]['Taxi Total'];
                    $firstArray['shift_total'] = $dataArr[$i]['Shift Total'];
                    $firstArray['charge'] = $dataArr[$i]['CHARGE'];
                    $firstArray['eftpos'] = $dataArr[$i]['EFTPOS'];
                    $firstArray['i_hail'] = $dataArr[$i]['iHail'];
                    $firstArray['e_ticket'] = $dataArr[$i]['ETICKET'];
                }
            }
            $check = DB::table('ride_summary')
                ->select('id')
                ->where([
                    ['process_date', '=', $process_date],
                    ['account_no', '=', $account_no],
                ])
                ->get();
            if (count($check) > 0) {
                $message = "CSV of this date has already been uploaded !!!";
                $color = "red";
            } else {
                $summary_id = DB::table('ride_summary')->insertGetId($firstArray);
                $message = "CSV uploaded successfully !!!";
                $color = "green";
            }
            //return redirect()->route('admin.addcsv');
            return view('admin.add-csv', compact('message', 'color'));
        }
    }
    function csvToArray($filename = '', $delimiter = ',')
    {
        if (!file_exists($filename) || !is_readable($filename))
            return false;
        $header = array();
        $data = array();
        if (($handle = fopen($filename, 'r')) !== false) {
            $i = 1;
            while (($row = fgetcsv($handle, 1000, $delimiter)) !== false) {
                if ($i > 3) {
                    if (empty($header)) {
                        $header = $row;
                    } else {
                        if (count($row) == 18) {
                            array_pop($row);
                        }
                        $data[] = array_combine($header, $row);
                    }
                } else {
                    $data[] = $row;
                }
                $i++;
            }
            fclose($handle);
        }
        return $data;
    }
}