MOON
Server: Apache
System: Linux 101-53-147-124.cprapid.com 4.18.0-553.121.1.el8_10.x86_64 #1 SMP Thu Apr 30 09:06:34 EDT 2026 x86_64
User: clientsoftwares (1005)
PHP: 8.2.30
Disabled: show_source, system, shell_exec, passthru, exec, popen, proc_open
Upload Files
File: /home/clientsoftwares/www/advocate.clientsoftwares.com/app/Http/Controllers/DealController.php
<?php

namespace App\Http\Controllers;

use App\Exports\DealsExport;
use App\Imports\DealsImport;
use App\Models\ActivityLog;
use App\Models\ClientDeal;
use App\Models\ClientPermission;
use App\Models\CustomField;
use App\Models\Deal;
use App\Models\DealCall;
use App\Models\DealDiscussion;
use App\Models\DealEmail;
use App\Models\DealFile;
use App\Models\DealStage;
use App\Models\DealTask;
use App\Models\Item;
use App\Models\Label;
use App\Models\Mail\SendDealEmail;
use App\Models\Pipeline;
use App\Models\Product;
use App\Models\Source;
use App\Models\Stage;
use App\Models\User;
use App\Models\UserDeal;
use App\Models\UserDefualtView;
use App\Models\Utility;
use Illuminate\Support\Facades\Auth;
use Illuminate\Http\Request;
use Illuminate\Support\Facades\Crypt;
use Illuminate\Contracts\Encryption\DecryptException;
use Illuminate\Support\Facades\Validator;
use Maatwebsite\Excel\Facades\Excel;




class DealController extends Controller
{

    public function index()
    {
        if(Auth::user()->super_admin_employee == 1 || Auth::user()->type=="advocate" || (Auth::user()->type == 'company'))
        {
            if(Auth::user()->default_pipeline)
            {
                $pipeline = Pipeline::where('created_by', '=', Auth::user()->crmcreatorId())->where('id', '=', Auth::user()->default_pipeline)->first();
                if(!$pipeline)
                {
                    $pipeline = Pipeline::where('created_by', '=', Auth::user()->crmcreatorId())->first();
                }
            }
            else
            {
                $pipeline = Pipeline::where('created_by', '=', Auth::user()->crmcreatorId())->first();
            }

            $pipelines = Pipeline::where('created_by', '=', Auth::user()->crmcreatorId())->get();

            $cnt_deal = [];

            if(!empty($pipeline))
            {
                $deals       = Deal::where('created_by', '=', \Auth::user()->crmcreatorId())->where('pipeline_id', '=', $pipeline->id)->get();
                $curr_month  = Deal::where('created_by', '=', \Auth::user()->crmcreatorId())->where('pipeline_id', '=', $pipeline->id)->whereMonth('created_at', '=', date('m'))->get();
                $curr_week   = Deal::where('created_by', '=', \Auth::user()->crmcreatorId())->where('pipeline_id', '=', $pipeline->id)->whereBetween(
                    'created_at', [
                                    \Carbon\Carbon::now()->startOfWeek(),
                                    \Carbon\Carbon::now()->endOfWeek(),
                                ]
                )->get();
                $last_30days = Deal::where('created_by', '=', \Auth::user()->crmcreatorId())->where('pipeline_id', '=', $pipeline->id)->whereDate('created_at', '>', \Carbon\Carbon::now()->subDays(30))->get();

                // Deal Summary
                $cnt_deal                = [];
                $cnt_deal['total']       = \App\Models\Deal::getDealSummary($deals);
                $cnt_deal['this_month']  = \App\Models\Deal::getDealSummary($curr_month);
                $cnt_deal['this_week']   = \App\Models\Deal::getDealSummary($curr_week);
                $cnt_deal['last_30days'] = \App\Models\Deal::getDealSummary($last_30days);

                $defualtView         = new UserDefualtView();
                $defualtView->route  = \Request::route()->getName();
                $defualtView->module = 'deal';
                $defualtView->view   = 'kanban';
                User::userDefualtView($defualtView);

                return view('deal.index', compact('pipelines', 'pipeline', 'cnt_deal'));
            }
            else
            {
                return view('deal.index', compact('pipeline', 'pipelines'));
            }
        }
        else
        {
            return redirect()->back()->with('error', __('Permission denied.'));
        }
    }


    public function create()
    {
        $clients = User::where('type', '=', 'advocate')->get()->pluck('name', 'id');


        return view('deal.create', compact('clients'));
    }


    public function store(Request $request)
    {

        if(\Auth::user()->super_admin_employee == 1)
        {
            $usr       = \Auth::user();
            $validator = \Validator::make(
                $request->all(), [
                                   'name' => 'required',
                                   'phone_no' => 'required',
                               ]
            );

            if($validator->fails())
            {
                $messages = $validator->getMessageBag();
                return redirect()->back()->with('error', $messages->first());
            }

            $pipeline = Pipeline::where('created_by', '=', $usr->crmcreatorId())->first();
            if(empty($pipeline))
            {
                return redirect()->back()->with('error', __('Please add constant pipeline.'));
            }

            // Default Field Value
            if($usr->default_pipeline)
            {
                $pipeline = Pipeline::where('created_by', '=', $usr->crmcreatorId())->where('id', '=', $usr->default_pipeline)->first();
                if(!$pipeline)
                {
                    $pipeline = Pipeline::where('created_by', '=', $usr->crmcreatorId())->first();
                }
            }
            else
            {
                $pipeline = Pipeline::where('created_by', '=', $usr->crmcreatorId())->first();
            }

            $stage = DealStage::where('pipeline_id', '=', $pipeline->id)->first();
            // End Default Field Value

            if(empty($stage))
            {
                return redirect()->back()->with('error', __('Please add constant deal stage'));
            }
            else
            {
                $deal       = new Deal();
                $deal->name = $request->name;


                if(empty($request->price))
                {
                    $deal->price = 0;
                }
                else
                {
                    $deal->price = $request->price;
                }

                $deal->pipeline_id = $pipeline->id;
                $deal->stage_id    = $stage->id;
                $deal->status      = 'Active';
                $deal->phone_no  = $request->phone_no;
                $deal->created_by  = $usr->crmcreatorId();
                $deal->save();

                $clients = User::whereIN('id', array_filter($request->clients))->get()->pluck('email', 'id')->toArray();

                foreach(array_keys($clients) as $client)
                {
                    ClientDeal::create(
                        [
                            'deal_id' => $deal->id,
                            'client_id' => $client,
                        ]
                    );
                }

                UserDeal::create(
                    [
                        'user_id' => $usr->id,
                        'deal_id' => $deal->id,
                    ]
                );


                $dArr = [
                    'deal_name' => $deal->name,
                    'deal_pipeline' => $pipeline->name,
                    'deal_stage' => $stage->name,
                    'deal_status' => $deal->status,
                    'deal_price' => $usr->priceFormat($deal->price),
                ];

                //$resp = Utility::sendEmailTemplate('deal_assigned', $clients, $dArr);

                $settings  = Utility::settings();
                // if(isset($settings['deal_create_notification']) && $settings['deal_create_notification'] ==1){
                //     $msg = __('New Deal created by the ').\Auth::user()->name.'.';
                //     Utility::send_slack_msg($msg);
                // }
                if (isset($settings['deal_create_notification']) && $settings['deal_create_notification'] == 1) {
                    $uArr = [
                       'user_name' => \Auth::user()->name,
                        'deal_name'=>$deal->name,
                        ];
                    Utility::send_slack_msg('new_deal', $uArr);
                    }
                    if (isset($settings['telegram_deal_create_notification']) && $settings['telegram_deal_create_notification'] == 1) {
                        $uArr = [
                           'user_name' => \Auth::user()->name,
                            'deal_name'=>$deal->name,
                            ];
                        Utility::send_telegram_msg('new_deal', $uArr);
                        }

                // if(isset($settings['telegram_deal_create_notification']) && $settings['telegram_deal_create_notification'] ==1){
                //         $response =__('New Deal created by the ').\Auth::user()->name.'.';
                //         Utility::send_telegram_msg($response);
                // }
                  //webhook
                //   $module = "New Deal";
                //   $webhook = Utility::webhookSetting($module);
                //   if($webhook)
                //   {
                //       $parameter = json_encode($deal);

                //       // 1 parameter is URL , 2  (Deal Data) parameter is data , 3 parameter is method
                //       $status = Utility::WebhookCall($webhook['url'], $parameter, $webhook['method']);
                //       if($status == true)
                //       {
                //           return redirect()->back()->with('success', __('Deal Successfully Created.'));
                //       }
                //       else
                //       {
                //           return redirect()->back()->with('error', __('Deal Call Failed.'));
                //       }
                //   }
                  //end webhook
                return redirect()->back()->with('success', __('Deal successfully created.'));

            }
        }
        else
        {
            return redirect()->back()->with('error', __('Permission denied.'));
        }

    }


    public function show($id)
    {
        if(\Auth::user()->super_admin_employee == 1 || \Auth::user()->type=="advocate" || \Auth::user()->type=="company")
        {

            $ids  = \Crypt::decrypt($id);
            $deal = Deal::find($ids);

            $calenderTasks = [];

            foreach($deal->tasks as $task)
            {
                $calenderTasks[] = [
                    'title' => $task->name,
                    'start' => $task->date,
                    'url' => route(
                        'deal.tasks.show', [
                                            $deal->id,
                                            $task->id,
                                        ]
                    ),
                    'className' => ($task->status) ? 'bg-success border-success' : 'bg-warning border-warning',
                ];
            }


            return view('deal.view', compact('deal', 'calenderTasks'));
        }
        else
        {
            return redirect()->back()->with('error', __('Permission denied.'));
        }
    }


    public function edit(Deal $deal)
    {
        $pipelines = Pipeline::where('created_by', '=', \Auth::user()->crmcreatorId())->get()->pluck('name', 'id');
        $pipelines->prepend(__('Select Pipeline'), '');
        $sources = Source::where('created_by', '=', \Auth::user()->crmcreatorId())->get()->pluck('name', 'id');
        $stages = DealStage::where('created_by', '=', \Auth::user()->crmcreatorId())->get()->pluck('name', 'id');
        //$products = Item::where('created_by', '=', \Auth::user()->crmcreatorId())->get()->pluck('name', 'id');

        $deal->sources  = explode(',', $deal->sources);
        $deal->products = explode(',', $deal->products);

        return view('deal.edit', compact('deal', 'pipelines','stages', 'sources'));
    }


    public function update(Request $request, Deal $deal)
    {
        if(\Auth::user()->super_admin_employee == 1)
        {
            $validator = \Validator::make(
                $request->all(), [
                                   'name' => 'required|max:20',
                                   'pipeline_id' => 'required',
                                   'phone_no'  =>'required|digits:10',
                               ]
            );

            if($validator->fails())
            {
                $messages = $validator->getMessageBag();

                return redirect()->back()->with('error', $messages->first());
            }

            $deal->name = $request->name;
            if(empty($request->price))
            {
                $request->price = 0;
            }
            else
            {
                $deal->price = $request->price;
            }
            $deal->pipeline_id = $request->pipeline_id;
            $deal->stage_id    = $request->stage_id;
            $deal->phone_no    = $request->phone_no;
            $deal->sources     = implode(",", array_filter($request->sources));
            $deal->notes       = $request->notes;
            $deal->save();

            return redirect()->back()->with('success', __('Deal successfully updated.'));
        }
        else
        {
            return redirect()->back()->with('error', __('Permission denied.'));
        }

    }


    public function destroy(Deal $deal)
    {
        if(\Auth::user()->super_admin_employee == 1)
        {

            DealDiscussion::where('deal_id', '=', $deal->id)->delete();
            DealFile::where('deal_id', '=', $deal->id)->delete();
            ClientDeal::where('deal_id', '=', $deal->id)->delete();
            UserDeal::where('deal_id', '=', $deal->id)->delete();
            DealTask::where('deal_id', '=', $deal->id)->delete();
            ActivityLog::where('deal_id', '=', $deal->id)->delete();

            $deal->delete();

            return redirect()->route('deal.index')->with('success', __('Deal successfully deleted.'));
        }
        else
        {
            return redirect()->back()->with('error', __('Permission denied.'));
        }

    }

    public function order(Request $request)
    {

        if(\Auth::user()->super_admin_employee == 1)
        {
            $usr = \Auth::user();

            $post       = $request->all();
            $deal       = Deal::find($post['deal_id']);
            $clients    = ClientDeal::select('client_id')->where('deal_id', '=', $deal->id)->get()->pluck('client_id')->toArray();
            $deal_users = $deal->users->pluck('id')->toArray();

            $usrs       = User::whereIN('id', array_merge($deal_users, $clients))->get()->pluck('email', 'id')->toArray();

            if($deal->stage_id != $post['stage_id'])
            {
                $newStage = DealStage::find($post['stage_id']);
                ActivityLog::create(
                    [
                        'user_id' => $usr->id,
                        'deal_id' => $deal->id,
                        'log_type' => 'Move',
                        'remark' => json_encode(
                            [
                                'title' => $deal->name,
                                'old_status' => !empty($deal->stage) ? $deal->stage->name : '',
                                'new_status' => $newStage->name,
                            ]
                        ),
                    ]
                );

            }

            foreach($post['order'] as $key => $item)
            {
                $deal           = Deal::find($item);
                $deal->order    = $key;
                $deal->stage_id = $post['stage_id'];
                $deal->save();
            }
        }
        else
        {
            return redirect()->back()->with('error', __('Permission denied.'));
        }
    }

    public function userEdit($id)
    {
        $deal = Deal::find($id);

        $users = User::where('created_by', '=', \Auth::user()->crmcreatorId())->where('type', '!=', 'client')->whereNOTIn(
            'id', function ($q) use ($deal){
            $q->select('user_id')->from('user_deals')->where('deal_id', '=', $deal->id);
        }
        )->get();

        $users = $users->pluck('name', 'id');


        return view('deal.users', compact('deal', 'users'));
    }

    public function userUpdate($id, Request $request)
    {

        if(\Auth::user()->super_admin_employee == 1 || \Auth::user()->type=="advocate")
        {
            $usr  = \Auth::user();
            $deal = Deal::find($id);


            if(!empty($request->users))
            {
                $users   = User::whereIN('id', array_filter($request->users))->get()->pluck('email', 'id')->toArray();

                $dealArr = [
                    'deal_id' => $deal->id,
                    'name' => $deal->name,
                    'updated_by' => $usr->id,
                ];
                $dArr    = [
                    'deal_name' => $deal->name,
                    'deal_pipeline' => $deal->pipeline->name,
                    'deal_stage' => $deal->stage->name,
                    'deal_status' => $deal->status,
                    'deal_price' => $usr->priceFormat($deal->price),
                ];

                foreach(array_keys($users) as $user)
                {
                    UserDeal::create(
                        [
                            'deal_id' => $deal->id,
                            'user_id' => $user,
                        ]
                    );

                }

            }


            if(!empty($users) && !empty($request->users))
            {
                return redirect()->back()->with('success', __('Users successfully updated.'));
            }
            else
            {
                return redirect()->back()->with('error', __('Please select valid user.'));
            }
        }
        else
        {
            return redirect()->back()->with('error', __('Permission denied.'));
        }
    }

    public function userDestroy($id, $user_id)
    {
        if(\Auth::user()->super_admin_employee == 1)
        {
            $deal = Deal::find($id);
            UserDeal::where('deal_id', '=', $deal->id)->where('user_id', '=', $user_id)->delete();

            return redirect()->back()->with('success', __('User successfully deleted.'));
        }
        else
        {
            return redirect()->back()->with('error', __('Permission denied.'));
        }
    }

    public function productEdit($id)
    {
        $deal     = Deal::find($id);

        $products = Item::where('created_by', '=', \Auth::user()->crmcreatorId())->whereNOTIn('id', !empty($deal->products) ? explode(',', $deal->products) : [])->get()->pluck('name', 'id');

        return view('deal.items', compact('deal', 'products'));
    }

    public function productUpdate($id, Request $request)
    {

        if(\Auth::user()->super_admin_employee == 1)
        {
            $usr        = \Auth::user();
            $deal       = Deal::find($id);
            $clients    = ClientDeal::select('client_id')->where('deal_id', '=', $id)->get()->pluck('client_id')->toArray();
            $deal_users = $deal->users->pluck('id')->toArray();

            if(!empty($request->items))
            {
                $products       = array_filter($request->items);
                $old_products   = explode(',', $deal->products);
                $deal->products = implode(',', array_merge($old_products, $products));
                $deal->save();

                $objProduct = Item::whereIN('id', $products)->get()->pluck('name', 'id')->toArray();

                ActivityLog::create(
                    [
                        'user_id' => \Auth::user()->id,
                        'deal_id' => $deal->id,
                        'log_type' => 'Add Product',
                        'remark' => json_encode(['title' => implode(",", $objProduct)]),
                    ]
                );


            }

            if(!empty($products) && !empty($request->items))
            {
                return redirect()->back()->with('success', __('Products successfully updated.'))->with('status', 'products');
            }
            else
            {
                return redirect()->back()->with('error', __('Please select valid product.'))->with('status', 'general');
            }
        }
        else
        {
            return redirect()->back()->with('error', __('Permission denied.'));
        }
    }

    public function productDestroy($id, $product_id)
    {
        if(\Auth::user()->super_admin_employee == 1)
        {
            $deal     = Deal::find($id);
            $products = explode(',', $deal->products);
            foreach($products as $key => $product)
            {
                if($product_id == $product)
                {
                    unset($products[$key]);
                }
            }
            $deal->products = implode(',', $products);
            $deal->save();

            return redirect()->back()->with('success', __('Products successfully deleted.'))->with('status', 'products');
        }
        else
        {
            return redirect()->back()->with('error', __('Permission denied.'));
        }
    }

    public function fileUpload($id, Request $request)
    {

        if(\Auth::user()->super_admin_employee == 1)
        {
            $deal = Deal::find($id);
            $request->validate(['file' => 'required']);
            $file_name = $request->file->getClientOriginalName();
            $file_path = $id . "_" . md5(time()) . "_" . $request->file->getClientOriginalName();
            $request->file->storeAs('uploads/deal_files', $file_path);
            $dir = 'deal_files/';

            $path = Utility::upload_file($request,'file',$file_name,$dir,[]);
                if($path['flag'] == 1){
                 $file = $path['url'];
             }
             else{
                 return redirect()->back()->with('error', __($path['msg']));
             }
            $file                 = DealFile::create(
                [
                    'deal_id' => $id,
                    'file_name' => $file_name,
                    'file_path' => $file_path,
                ]
            );
            $return               = [];
            $return['is_success'] = true;
            $return['download']   = route(
                'deal.file.download', [
                                        $deal->id,
                                        $file->id,
                                    ]
            );
            $return['delete']     = route(
                'deal.file.delete', [
                                      $deal->id,
                                      $file->id,
                                  ]
            );

            ActivityLog::create(
                [
                    'user_id' => \Auth::user()->id,
                    'deal_id' => $deal->id,
                    'log_type' => 'Upload File',
                    'remark' => json_encode(['file_name' => $file_name]),
                ]
            );

            return response()->json($return);
        }
        else
        {
            return response()->json(
                [
                    'is_success' => false,
                    'error' => __('Permission denied.'),
                ], 200
            );
        }
    }

    public function fileDownload($id, $file_id)
    {
        if(\Auth::user()->super_admin_employee == 1)
        {
            $deal = Deal::find($id);
            $file = DealFile::find($file_id);
            if($file)
            {
                $file_path = storage_path('uploads/deal_files/' . $file->file_path);
                $filename  = $file->file_name;

                return \Response::download(
                    $file_path, $filename, [
                                  'Content-Length: ' . filesize($file_path),
                              ]
                );
            }
            else
            {
                return redirect()->back()->with('error', __('File is not exist.'));
            }
        }
        else
        {
            return redirect()->back()->with('error', __('Permission denied.'));
        }
    }

    public function fileDelete($id, $file_id)
    {
        if(\Auth::user()->super_admin_employee == 1 || \Auth::user()->type=="advocate")
        {
            $deal = Deal::find($id);
            $file = DealFile::find($file_id);
            if($file)
            {
                $path = storage_path('uploads/deal_files/' . $file->file_path);
                if(file_exists($path))
                {
                    \File::delete($path);
                }
                $file->delete();

                return redirect()->back()->with('success', __('Deal file successfully deleted.'));

            }
            else
            {
                return redirect()->back()->with('error', __('Permission denied.'));
            }
        }
        else
        {
            return redirect()->back()->with('error', __('Permission denied.'));

        }
    }

    public function noteStore($id, Request $request)
    {
        if(\Auth::user()->super_admin_employee == 1 || \Auth::user()->type=="advocate")
        {
            $deal        = Deal::find($id);
            $deal->notes = $request->notes;
            $deal->save();

            return redirect()->back()->with('success', __('Note successfully saved.'));
        }
        else
        {
            return redirect()->back()->with('error', __('Permission denied'));
        }
    }


    public function taskCreate($id)
    {
        $deal       = Deal::find($id);
        $priorities = [
            1 => __('Low'),
            2 => __('Medium'),
            3 => __('High'),
        ];

        $status = [
            0 => __('On Going'),
            1 => __('Completed'),
        ];

        return view('deal.tasks', compact('deal', 'priorities', 'status'));
    }

    public function taskStore($id, Request $request)
    {
        if(\Auth::user()->super_admin_employee == 1 || \Auth::user()->type="advocate")
        {
            $usr        = \Auth::user();
            $deal       = Deal::find($id);
            $clients    = ClientDeal::select('client_id')->where('deal_id', '=', $id)->get()->pluck('client_id')->toArray();
            $deal_users = $deal->users->pluck('id')->toArray();
            $usrs       = User::whereIN('id', array_merge($deal_users, $clients))->get()->pluck('email', 'id')->toArray();

            $validator = \Validator::make(
                $request->all(), [
                                   'name' => 'required',
                                   'date' => 'required',
                                   'time' => 'required',
                                   'priority' => 'required',
                                   'status' => 'required',
                               ]
            );

            if($validator->fails())
            {
                $messages = $validator->getMessageBag();

                return redirect()->back()->with('error', $messages->first());
            }

            $dealTask = DealTask::create(
                [
                    'deal_id' => $deal->id,
                    'name' => $request->name,
                    'date' => $request->date,
                    'time' => date('H:i:s', strtotime($request->date . ' ' . $request->time)),
                    'priority' => $request->priority,
                    'status' => $request->status,
                ]
            );

            ActivityLog::create(
                [
                    'user_id' => $usr->id,
                    'deal_id' => $deal->id,
                    'log_type' => 'Create Task',
                    'remark' => json_encode(['title' => $dealTask->name]),
                ]
            );

            return redirect()->back()->with('success', __('Task successfully created.'))->with('status', 'tasks');
        }
        else
        {
            return redirect()->back()->with('error', __('Permission denied.'));
        }
    }

    public function taskShow($id, $task_id)
    {
        if(\Auth::user()->super_admin_employee == 1)
        {
            $deal = Deal::find($id);
            $task = DealTask::find($task_id);

            return view('deal.tasksShow', compact('task', 'deal'));
        }
        else
        {
            return redirect()->back()->with('error', __('Permission denied.'));
        }
    }

    public function taskEdit($id, $task_id)
    {
        $deal       = Deal::find($id);
        $priorities = [
            1 => __('Low'),
            2 => __('Medium'),
            3 => __('High'),
        ];

        $status = [
            0 => __('On Going'),
            1 => __('Completed'),
        ];

        $task = DealTask::find($task_id);

        return view('deal.tasks', compact('task', 'deal', 'priorities', 'status'));
    }

    public function taskUpdate($id, $task_id, Request $request)
    {
        if(\Auth::user()->super_admin_employee == 1)
        {
            $deal      = Deal::find($id);
            $validator = \Validator::make(
                $request->all(), [
                                   'name' => 'required',
                                   'date' => 'required',
                                   'time' => 'required',
                                   'priority' => 'required',
                                   'status' => 'required',
                               ]
            );

            if($validator->fails())
            {
                $messages = $validator->getMessageBag();

                return redirect()->back()->with('error', $messages->first());
            }

            $task = DealTask::find($task_id);

            $task->update(
                [
                    'name' => $request->name,
                    'date' => $request->date,
                    'time' => date('H:i:s', strtotime($request->date . ' ' . $request->time)),
                    'priority' => $request->priority,
                    'status' => $request->status,
                ]
            );

            return redirect()->back()->with('success', __('Task successfully updated.'))->with('status', 'tasks');
        }
        else
        {
            return redirect()->back()->with('error', __('Permission denied.'));
        }
    }

    public function taskUpdateStatus($id, $task_id, Request $request)
    {
        if(\Auth::user()->super_admin_employee == 1)
        {
            $deal      = Deal::find($id);
            $validator = \Validator::make(
                $request->all(), [
                                   'status' => 'required',
                               ]
            );

            if($validator->fails())
            {
                $messages = $validator->getMessageBag();

                return response()->json(
                    [
                        'is_success' => false,
                        'error' => $messages->first(),
                    ], 401
                );
            }

            $task = DealTask::find($task_id);
            if($request->status)
            {
                $task->status = 0;
            }
            else
            {
                $task->status = 1;
            }
            $task->save();

            return response()->json(
                [
                    'is_success' => true,
                    'success' => __('Task successfully updated.'),
                    'status' => $task->status,
                    'status_label' => __(DealTask::$status[$task->status]),
                ], 200
            );
        }
        else
        {
            return response()->json(
                [
                    'is_success' => false,
                    'error' => __('Permission denied.'),
                ], 200
            );
        }
    }

    public function taskDestroy($id, $task_id)
    {
        if(\Auth::user()->super_admin_employee == 1)
        {
            $deal = Deal::find($id);
            $task = DealTask::find($task_id);
            $task->delete();

            return redirect()->back()->with('success', __('Task successfully deleted.'))->with('status', 'tasks');
        }
        else
        {
            return redirect()->back()->with('error', __('Permission denied.'));
        }
    }

    public function sourceEdit($id)
    {
        $deal    = Deal::find($id);
        $sources = Source::where('created_by', '=', \Auth::user()->crmcreatorId())->get();

        $selected = $deal->sources();
        if($selected)
        {
            $selected = $selected->pluck('name', 'id')->toArray();
        }

        return view('deal.sources', compact('deal', 'sources', 'selected'));
    }

    public function sourceUpdate($id, Request $request)
    {
        if(\Auth::user()->super_admin_employee == 1)
        {
            $usr = \Auth::user();

            $deal       = Deal::find($id);
            $clients    = ClientDeal::select('client_id')->where('deal_id', '=', $id)->get()->pluck('client_id')->toArray();
            $deal_users = $deal->users->pluck('id')->toArray();

            if(!empty($request->sources) && count($request->sources) > 0)
            {
                $deal->sources = implode(',', $request->sources);
            }
            else
            {
                $deal->sources = "";
            }
            $deal->save();
            ActivityLog::create(
                [
                    'user_id' => $usr->id,
                    'deal_id' => $deal->id,
                    'log_type' => 'Update Sources',
                    'remark' => json_encode(['title' => 'Update Sources']),
                ]
            );


            return redirect()->back()->with('success', __('Sources successfully updated.'))->with('status', 'sources');
        }
        else
        {
            return redirect()->back()->with('error', __('Permission denied.'));
        }
    }

    public function sourceDestroy($id, $source_id)
    {
        if(\Auth::user()->super_admin_employee == 1)
        {
            $deal    = Deal::find($id);
            $sources = explode(',', $deal->sources);
            foreach($sources as $key => $source)
            {
                if($source_id == $source)
                {
                    unset($sources[$key]);
                }
            }
            $deal->sources = implode(',', $sources);
            $deal->save();

            return redirect()->back()->with('success', __('Sources successfully deleted.'))->with('status', 'sources');
        }
        else
        {
            return redirect()->back()->with('error', __('Permission denied.'));
        }
    }

    public function discussionCreate($id)
    {

        $deal = Deal::find($id);

        return view('deal.discussions', compact('deal'));
    }

    public function discussionStore($id, Request $request)
    {
        if(\Auth::user()->super_admin_employee == 1)
        {
            $validator = \Validator::make(
                $request->all(), [
                                   'comment' => 'required',
                               ]
            );

            if($validator->fails())
            {
                $messages = $validator->getMessageBag();

                return redirect()->back()->with('error', $messages->first());
            }

            $usr        = \Auth::user();
            $deal       = Deal::find($id);
            $clients    = ClientDeal::select('client_id')->where('deal_id', '=', $id)->get()->pluck('client_id')->toArray();
            $deal_users = $deal->users->pluck('id')->toArray();

            $discussion             = new DealDiscussion();
            $discussion->comment    = $request->comment;
            $discussion->deal_id    = $deal->id;
            $discussion->created_by = \Auth::user()->id;
            $discussion->save();

            return redirect()->back()->with('success', __('Message successfully created.'))->with('status', 'discussion');
        }
        else
        {
            return redirect()->back()->with('error', __('Permission denied.'));
        }
    }


    public function callCreate($id)
    {

        $deal  = Deal::find($id);
        $users = UserDeal::where('deal_id', '=', $deal->id)->get();

        return view('deal.calls', compact('deal', 'users'));
    }

    public function callStore($id, Request $request)
    {
        if(\Auth::user()->super_admin_employee == 1)
        {
            $usr = \Auth::user();

            $deal      = Deal::find($id);
            $validator = \Validator::make(
                $request->all(), [
                                   'subject' => 'required',
                                   'call_type' => 'required',
                                   'user_id' => 'required',
                               ]
            );

            if($validator->fails())
            {
                $messages = $validator->getMessageBag();

                return redirect()->back()->with('error', $messages->first());
            }

            DealCall::create(
                [
                    'deal_id' => $deal->id,
                    'subject' => $request->subject,
                    'call_type' => $request->call_type,
                    'duration' => $request->duration,
                    'user_id' => $request->user_id,
                    'description' => $request->description,
                    'call_result' => $request->call_result,
                ]
            );

            ActivityLog::create(
                [
                    'user_id' => $usr->id,
                    'deal_id' => $deal->id,
                    'log_type' => 'Create Deal Call',
                    'remark' => json_encode(['title' => 'Create new Deal Call']),
                ]
            );


            return redirect()->back()->with('success', __('Call successfully created.'))->with('status', 'calls');
        }
        else
        {
            return redirect()->back()->with('error', __('Permission denied.'));
        }
    }

    public function callEdit($id, $call_id)
    {
        $deal  = Deal::find($id);
        $call  = DealCall::find($call_id);
        $users = UserDeal::where('deal_id', '=', $deal->id)->get();

        return view('deal.calls', compact('call', 'deal', 'users'));
    }

    public function callUpdate($id, $call_id, Request $request)
    {
        if(\Auth::user()->super_admin_employee == 1)
        {
            $deal      = Deal::find($id);
            $validator = \Validator::make(
                $request->all(), [
                                   'subject' => 'required',
                                   'call_type' => 'required',
                                   'user_id' => 'required',
                               ]
            );

            if($validator->fails())
            {
                $messages = $validator->getMessageBag();

                return redirect()->back()->with('error', $messages->first());
            }

            $call = DealCall::find($call_id);

            $call->update(
                [
                    'subject' => $request->subject,
                    'call_type' => $request->call_type,
                    'duration' => $request->duration,
                    'user_id' => $request->user_id,
                    'description' => $request->description,
                    'call_result' => $request->call_result,
                ]
            );

            return redirect()->back()->with('success', __('Call successfully updated.'))->with('status', 'calls');
        }
        else
        {
            return redirect()->back()->with('error', __('Permission denied.'));
        }
    }

    public function callDestroy($id, $call_id)
    {
        if(\Auth::user()->super_admin_employee == 1)
        {
            $deal = Deal::find($id);
            $task = DealCall::find($call_id);
            $task->delete();

            return redirect()->back()->with('success', __('Call successfully deleted.'))->with('status', 'calls');
        }
        else
        {
            return redirect()->back()->with('error', __('Permission denied.'));
        }
    }

    public function emailCreate($id)
    {
        $deal = Deal::find($id);

        return view('deal.emails', compact('deal'));
    }

    public function emailStore($id, Request $request)
    {
        if(\Auth::user()->super_admin_employee == 1)
        {
            $deal      = Deal::find($id);
            $settings  = Utility::settings();
            $validator = \Validator::make(
                $request->all(), [
                                   'to' => 'required|email',
                                   'subject' => 'required',
                                   'description' => 'required',
                               ]
            );

            if($validator->fails())
            {
                $messages = $validator->getMessageBag();

                return redirect()->back()->with('error', $messages->first());
            }

            $dealEmail = DealEmail::create(
                [
                    'deal_id' => $deal->id,
                    'to' => $request->to,
                    'subject' => $request->subject,
                    'description' => $request->description,
                ]
            );

            ActivityLog::create(
                [
                    'user_id' => \Auth::user()->id,
                    'deal_id' => $deal->id,
                    'log_type' => 'Create Deal Email',
                    'remark' => json_encode(['title' => 'Create new Deal Email']),
                ]
            );

            return redirect()->back()->with('success', __('Email successfully created.'));
        }
        else
        {
            return redirect()->back()->with('error', __('Permission denied.'));
        }
    }

    public function clientEdit($id)
    {
        $deal    = Deal::find($id);
        $users=UserDeal::select('user_id')->where('deal_id',$deal->id)->get();
        $arr=[];
        foreach ($users as $key => $value) {
            $arr[]=$value->user_id;
        }
        $clients = User::whereIn('created_by',$arr)->where('type','advocate')->whereNOTIn(
            'id', function ($q) use ($deal){
            $q->select('client_id')->from('client_deals')->where('deal_id', '=', $deal->id);
        }
        )->get()->pluck('name', 'id');


        return view('deal.clients', compact('deal', 'clients'));
    }

    public function clientUpdate($id, Request $request)
    {
        if(\Auth::user()->super_admin_employee == 1)
        {
            $deal = Deal::find($id);
            if(!empty($request->clients))
            {
                $clients = array_filter($request->clients);
                foreach($clients as $client)
                {
                    ClientDeal::create(
                        [
                            'deal_id' => $deal->id,
                            'client_id' => $client,
                        ]
                    );
                }
            }

            if(!empty($clients) && !empty($request->clients))
            {
                return redirect()->back()->with('success', __('Clients successfully updated.'))->with('status', 'clients');
            }
            else
            {
                return redirect()->back()->with('error', __('Please select valid clients.'))->with('status', 'clients');
            }
        }
        else
        {
            return redirect()->back()->with('error', __('Permission denied.'));
        }
    }

    public function clientDestroy($id, $client_id)
    {
        if(\Auth::user()->super_admin_employee == 1)
        {
            $deal = Deal::find($id);

            ClientDeal::where('deal_id', '=', $deal->id)->where('client_id', '=', $client_id)->delete();

            return redirect()->back()->with('success', __('Client successfully deleted.'))->with('status', 'clients');
        }
        else
        {
            return redirect()->back()->with('error', __('Permission denied.'));
        }
    }

    public function labels($id)
    {
        $deal     = Deal::find($id);
        $labels   = Label::where('pipeline_id', '=', $deal->pipeline_id)->get();
        $selected = $deal->labels();
        if($selected)
        {
            $selected = $selected->pluck('name', 'id')->toArray();
        }
        else
        {
            $selected = [];
        }

        return view('deal.labels', compact('deal', 'labels', 'selected'));
    }

    public function labelStore($id, Request $request)
    {
        if(\Auth::user()->super_admin_employee == 1)
        {
            $deal = Deal::find($id);
            if($request->labels)
            {
                $deal->labels = implode(',', $request->labels);
            }
            else
            {
                $deal->labels = $request->labels;
            }
            $deal->save();

            return redirect()->back()->with('success', __('Labels successfully updated.'));
        }
        else
        {
            return redirect()->back()->with('error', __('Permission denied.'));
        }
    }

    public function deal_list()
    {
        $usr = \Auth::user();

        if($usr->default_pipeline)
        {
            $pipeline = Pipeline::where('created_by', '=', $usr->crmcreatorId())->where('id', '=', $usr->default_pipeline)->first();
            if(!$pipeline)
            {
                $pipeline = Pipeline::where('created_by', '=', $usr->crmcreatorId())->first();
            }
        }
        else
        {
            $pipeline = Pipeline::where('created_by', '=', $usr->crmcreatorId())->first();
        }

        $pipelines = Pipeline::where('created_by', '=', $usr->crmcreatorId())->get()->pluck('name', 'id');

        $deals       = Deal::where('created_by', '=', $usr->crmcreatorId())->where('pipeline_id', '=', $pipeline->id)->get();
        $curr_month  = Deal::where('created_by', '=', $usr->crmcreatorId())->where('pipeline_id', '=', $pipeline->id)->whereMonth('created_at', '=', date('m'))->get();
        $curr_week   = Deal::where('created_by', '=', $usr->crmcreatorId())->where('pipeline_id', '=', $pipeline->id)->whereBetween(
            'created_at', [
                            \Carbon\Carbon::now()->startOfWeek(),
                            \Carbon\Carbon::now()->endOfWeek(),
                        ]
        )->get();
        $last_30days = Deal::where('created_by', '=', $usr->crmcreatorId())->where('pipeline_id', '=', $pipeline->id)->whereDate('created_at', '>', \Carbon\Carbon::now()->subDays(30))->get();

        // Deal Summary
        $cnt_deal                = [];
        $cnt_deal['total']       = \App\Models\Deal::getDealSummary($deals);
        $cnt_deal['this_month']  = \App\Models\Deal::getDealSummary($curr_month);
        $cnt_deal['this_week']   = \App\Models\Deal::getDealSummary($curr_week);
        $cnt_deal['last_30days'] = \App\Models\Deal::getDealSummary($last_30days);

        // Deals

        if($usr->type == 'client')
        {
            $deals = Deal::select('deals.*')->join('client_deals', 'client_deals.deal_id', '=', 'deals.id')->where('client_deals.client_id', '=', $usr->id)->orderBy('deals.order')->get();
        }
        else
        {
            $users = User::where('created_by',Auth::user()->creatorId())->pluck('id')->toArray();
            $deals = Deal::select('deals.*')->join('client_deals', 'client_deals.deal_id', '=', 'deals.id')->whereIn('client_deals.client_id', $users)->orderBy('deals.order')->distinct()->get();

        }
        $defualtView         = new UserDefualtView();
        $defualtView->route  = \Request::route()->getName();
        $defualtView->module = 'deal';
        $defualtView->view   = 'list';
        User::userDefualtView($defualtView);
        return view('deal.list', compact('pipelines', 'pipeline', 'deals', 'cnt_deal'));
    }

    public function changePipeline(Request $request)
    {

        if(\Auth::user()->super_admin_employee == 1 || \Auth::user()->type == 'company')
        {
            $user                   = \Auth::user();
            $user->default_pipeline = $request->pipeline_id;
            $user->save();

            return redirect()->back()->with('success', __('Pipeline succefully change.'));

        }
        else
        {
            return redirect()->back()->with('error', __('Permission denied.'));
        }
    }

    public function changeStatus(Request $request, $id)
    {
        $deal         = Deal::where('id', '=', $id)->first();
        $deal->status = $request->deal_status;
        $deal->save();

        return redirect()->back();
    }

    public function fileExports()
    {
        $name = 'deals_' . date('Y-m-d i:h:s');
        $data = Excel::download(new DealsExport(), $name . '.xlsx');
        ob_end_clean();
        return $data;
    }
    public function fileImportExport()
    {
        return view('deal.import');
    }
    public function fileImport(Request $request)
    {
        $rules      = ['file' => 'required|mimes:csv,txt,xlsx',];
        $validator  = Validator::make($request->all(), $rules);
        if ($validator->fails()) {
            $messages = $validator->getMessageBag();
            return redirect()->back()->with('error', $messages->first());
        }
        $deals        = (new DealsImport())->toArray(request()->file('file'))[0];
        $totaldeals    = count($deals) - 1;
        $errorArray     = [];
        for ($i = 1; $i <= count($deals) - 1; $i++) {
            $deal          = $deals[$i];
            $dealData = new Deal();
            $dealData->name = $deal[0];
            $dealData->price = $deal[1];
            $dealData->pipeline_id = $deal[2];
            $dealData->stage_id = $deal[3];
            $dealData->status = $deal[4];
            $dealData->phone_no = $deal[5];
            $dealData->created_by = \Auth::user()->id;
            $dealData->is_active = (int)$deal[6];
            $dealData->save();
        }
        if (!empty($errorArray)) {
            $data['status'] = 'error';
            $data['msg'] = $totaldeals . '  ' . __('Record imported fail out of' . ' ' . count($errorArray) . ' ' . 'record');
        } else {
            $data['status'] = 'success';
            $data['msg']    = __('Record successfully imported');
        }
        return redirect()->back()->with($data['status'], $data['msg']);
    }
}