Support the ongoing development of Laravel.io →
Blade Laravel Routing

Hello, I am trying to add another mass update function to a current open source CRM code. I want to be able to mass update the leads with the sales person through the drop down menu of the sales person names, but it's not working for some reason.

here's the code of the Lead controller with the Newly added code:


<?php

namespace Webkul\Admin\Http\Controllers\Lead;

use Carbon\Carbon;
use Illuminate\Support\Facades\Event;
use Webkul\Admin\Http\Controllers\Controller;
use Webkul\Admin\Http\Requests\LeadForm;
use Webkul\Lead\Repositories\LeadRepository;
use Webkul\Lead\Repositories\PipelineRepository;
use Webkul\Lead\Repositories\StageRepository;

class LeadController extends Controller
{
    /**
     * Lead repository instance.
     *
     * @var \Webkul\Lead\Repositories\LeadRepository
     */
    protected $leadRepository;

    /**
     * Pipeline repository instance.
     *
     * @var \Webkul\Lead\Repositories\PipelineRepository
     */
    protected $pipelineRepository;

    /**
     * Stage repository instance.
     *
     * @var \Webkul\Lead\Repositories\StageRepository
     */
    protected $stageRepository;

    /**
     * Create a new controller instance.
     *
     * @param \Webkul\Lead\Repositories\LeadRepository  $leadRepository
     * @param \Webkul\Lead\Repositories\PipelineRepository  $pipelineRepository
     * @param \Webkul\Lead\Repositories\StageRepository  $stageRepository
     *
     * @return void
     */
    public function __construct(
        LeadRepository $leadRepository,
        PipelineRepository $pipelineRepository,
        StageRepository $stageRepository
    ) {
        $this->leadRepository = $leadRepository;

        $this->pipelineRepository = $pipelineRepository;

        $this->stageRepository = $stageRepository;

        request()->request->add(['entity_type' => 'leads']);
    }

    /**
     * Display a listing of the resource.
     *
     * @return \Illuminate\View\View
     */
    public function index()
    {
        if (request('pipeline_id')) {
            $pipeline = $this->pipelineRepository->find(request('pipeline_id'));
        } else {
            $pipeline = $this->pipelineRepository->getDefaultPipeline();
        }

        return view('admin::leads.index', compact('pipeline'));
    }

    /**
     * Returns a listing of the resource.
     *
     * @return \Illuminate\Http\Response
     */
    public function get()
    {
        if (bouncer()->hasPermission('leads.view')) {
            if (request('view_type')) {
                return app(\Webkul\Admin\DataGrids\Lead\LeadDataGrid::class)->toJson();
            } else {
                $createdAt = request('created_at') ?? null;

                if ($createdAt && isset($createdAt["bw"])) {
                    $createdAt = explode(",", $createdAt["bw"]);

                    $createdAt[0] .= ' 00:01';

                    $createdAt[1] = $createdAt[1]
                        ? $createdAt[1] . ' 23:59'
                        : Carbon::now()->format('Y-m-d 23:59');
                } else {
                    $createdAt = null;
                }

                if (request('pipeline_id')) {
                    $pipeline = $this->pipelineRepository->find(request('pipeline_id'));
                } else {
                    $pipeline = $this->pipelineRepository->getDefaultPipeline();
                }

                $data = [];

                if ($stageId = request('pipeline_stage_id')) {
                    $query = $this->leadRepository->getLeadsQuery($pipeline->id, $stageId, request('search') ?? '', $createdAt);

                    $paginator = $query->paginate(100);

                    $data[$stageId] = [
                        'leads' => [],
                        'pagination' => [
                            'current' => $current = $paginator->currentPage(),
                            'last' => $last = $paginator->lastPage(),
                            'next' => $current < $last ? $current + 1 : null,
                        ],
                        'total' => core()->formatBasePrice($query->getModel()->paginate(request('page') ? request('page') * 10 : 10, ['lead_value'], 'page', 1)->sum('lead_value')),
                    ];

                    foreach ($paginator as $lead) {
                        $data[$stageId]['leads'][] =  array_merge($lead->toArray(), [
                            'lead_value' => core()->formatBasePrice($lead->lead_value),
                        ]);
                    }
                } else {
                    foreach ($pipeline->stages as $stage) {
                        $query = $this->leadRepository->getLeadsQuery($pipeline->id, $stage->id, request('search') ?? '', $createdAt);

                        $paginator = $query->paginate(100);

                        $data[$stage->id] = [
                            'leads' => [],
                            'pagination' => [
                                'current' => $current = $paginator->currentPage(),
                                'last' => $last = $paginator->lastPage(),
                                'next' => $current < $last ? $current + 1 : null,
                            ],
                            'total' => core()->formatBasePrice($query->paginate(100)->sum('lead_value')),
                        ];

                        foreach ($paginator as $lead) {
                            $data[$stage->id]['leads'][] =  array_merge($lead->toArray(), [
                                'lead_value' => core()->formatBasePrice($lead->lead_value),
                            ]);
                        }
                    }
                }

                return response()->json($data);
            }
        }
    }

    /**
     * Show the form for creating a new resource.
     *
     * @return \Illuminate\View\View
     */
    public function create()
    {
        return view('admin::leads.create');
    }

    /**
     * Store a newly created resource in storage.
     *
     * @param \Webkul\Admin\Http\Requests\LeadForm $request
     * @return \Illuminate\Http\Response
     */
    public function store(LeadForm $request)
    {
        Event::dispatch('lead.create.before');

        $data = request()->all();

        $data['status'] = 1;

        if ($data['lead_pipeline_stage_id']) {
            $stage = $this->stageRepository->findOrFail($data['lead_pipeline_stage_id']);

            $data['lead_pipeline_id'] = $stage->lead_pipeline_id;
        } else {
            $pipeline = $this->pipelineRepository->getDefaultPipeline();

            $stage = $pipeline->stages()->first();

            $data['lead_pipeline_id'] = $pipeline->id;

            $data['lead_pipeline_stage_id'] = $stage->id;
        }

        if (in_array($stage->code, ['won', 'lost'])) {
            $data['closed_at'] = Carbon::now();
        }

        $lead = $this->leadRepository->create($data);

        Event::dispatch('lead.create.after', $lead);

        session()->flash('success', trans('admin::app.leads.create-success'));

        return redirect()->route('admin.leads.index', $data['lead_pipeline_id']);
    }

    /**
     * Display a resource.
     *
     * @param  int  $id
     * @return \Illuminate\View\View
     */
    public function view($id)
    {
        $lead = $this->leadRepository->findOrFail($id);

        $currentUser = auth()->guard('user')->user();

        if ($currentUser->view_permission != 'global') {
            if ($currentUser->view_permission == 'group') {
                $userIds = app('\Webkul\User\Repositories\UserRepository')->getCurrentUserGroupsUserIds();

                if (! in_array($lead->user_id, $userIds)) {
                    return redirect()->route('admin.leads.index');
                }
            } else {
                if ($lead->user_id != $currentUser->id) {
                    return redirect()->route('admin.leads.index');
                }
            }
        }

        return view('admin::leads.view', compact('lead'));
    }

    /**
     * Update the specified resource in storage.
     *
     * @param \Webkul\Admin\Http\Requests\LeadForm $request
     * @param int  $id
     * @return \Illuminate\Http\Response
     */
    public function update(LeadForm $request, $id)
    {
        Event::dispatch('lead.update.before', $id);
        $data = request()->all();

        if ($data['lead_pipeline_stage_id']) {
            $stage = $this->stageRepository->findOrFail($data['lead_pipeline_stage_id']);

            $data['lead_pipeline_id'] = $stage->lead_pipeline_id;
        } else {
            $pipeline = $this->pipelineRepository->getDefaultPipeline();

            $stage = $pipeline->stages()->first();

            $data['lead_pipeline_id'] = $pipeline->id;

            $data['lead_pipeline_stage_id'] = $stage->id;
        }

        $lead = $this->leadRepository->update($data, $id);

        Event::dispatch('lead.update.after', $lead);

        if (request()->ajax()) {
            return response()->json([
                'message' => trans('admin::app.leads.update-success'),
            ]);
        } else {
            session()->flash('success', trans('admin::app.leads.update-success'));

            if (request()->has('closed_at')) {
                return redirect()->back();
            } else {
               return redirect()->route('admin.leads.index', $data['lead_pipeline_id']);
            }
        }
    }

    /**
     * Search person results.
     *
     * @return \Illuminate\Http\Response
     */
    public function search()
    {
        $currentUser = auth()->guard('user')->user();

        if ($currentUser->view_permission == 'global') {
            $results = $this->leadRepository->findWhere([
                ['title', 'like', '%' . urldecode(request()->input('query')) . '%'],
            ]);
        } elseif ($currentUser->view_permission == 'individual') {
            $results = $this->leadRepository->findWhere([
                ['title', 'like', '%' . urldecode(request()->input('query')) . '%'],
                ['user_id', '=', $currentUser->id],
            ]);
        } elseif ($currentUser->view_permission == 'group') {
            $userIds = app('\Webkul\User\Repositories\UserRepository')->getCurrentUserGroupsUserIds();

            $results = $this->leadRepository->findWhere([
                ['title', 'like', '%' . urldecode(request()->input('query')) . '%'],
                ['user_id', 'IN', $userIds],
            ]);
        }

        return response()->json($results);
    }

    /*
     * Remove the specified resource from storage.
     *
     * @param  int  $id
     * @return \Illuminate\Http\Response
     */
    public function destroy($id)
    {
        $this->leadRepository->findOrFail($id);

        try {
            Event::dispatch('lead.delete.before', $id);

            $this->leadRepository->delete($id);

            Event::dispatch('lead.delete.after', $id);

            return response()->json([
                'message' => trans('admin::app.response.destroy-success', ['name' => trans('admin::app.leads.lead')]),
            ], 200);
        } catch (\Exception $exception) {
            return response()->json([
                'message' => trans('admin::app.response.destroy-failed', ['name' => trans('admin::app.leads.lead')]),
            ], 400);
        }
    }

    /**
     * Mass Update the specified resources.
     *
     * @return \Illuminate\Http\Response
     */
    public function massUpdate()
    {
        $data = request()->all();

        foreach ($data['rows'] as $leadId) {
            $lead = $this->leadRepository->find($leadId);

            Event::dispatch('lead.update.before', $leadId);

            $lead->update(['lead_pipeline_stage_id' => $data['value']]);

            Event::dispatch('lead.update.before', $leadId);
        }

        return response()->json([
            'message' => trans('admin::app.response.update-success', ['name' => trans('admin::app.leads.title')])
        ]);
    }


    /**
 * Mass update the salesperson for the specified resources.
 *
 * @return \Illuminate\Http\Response
 */

 //Newly added code
public function massUpdateSalesperson()
{
    $data = request()->all();

    foreach ($data['rows'] as $leadId) {
        $lead = $this->leadRepository->find($leadId);

        Event::dispatch('lead.update.before', $leadId);

        $lead->update(['salesperson_id' => $data['value']]);

        Event::dispatch('lead.update.before', $leadId);
    }

    return response()->json([
        'message' => trans('admin::app.response.update-success', ['name' => trans('admin::app.leads.title')])
    ]);
}


    /**
     * Mass Delete the specified resources.
     *
     * @return \Illuminate\Http\Response
     */
    public function massDestroy()
    {
        foreach (request('rows') as $leadId) {
            Event::dispatch('lead.delete.before', $leadId);

            $this->leadRepository->delete($leadId);

            Event::dispatch('lead.delete.after', $leadId);
        }

        return response()->json([
            'message' => trans('admin::app.response.destroy-success', ['name' => trans('admin::app.leads.title')]),
        ]);
    }
}`

**and here's the routing I used with a newly added route: **

<?php

Route::group(['middleware' => ['web', 'admin_locale']], function () {
    Route::get('/', 'Webkul\Admin\Http\Controllers\Controller@redirectToLogin')->name('krayin.home');

    Route::prefix(config('app.admin_path'))->group(function () {

        Route::get('/', 'Webkul\Admin\Http\Controllers\Controller@redirectToLogin');

        // Login Routes
        Route::get('login', 'Webkul\Admin\Http\Controllers\User\SessionController@create')->name('admin.session.create');

        //login post route to admin auth controller
        Route::post('login', 'Webkul\Admin\Http\Controllers\User\SessionController@store')->name('admin.session.store');

        // Forget Password Routes
        Route::get('forgot-password', 'Webkul\Admin\Http\Controllers\User\ForgotPasswordController@create')->name('admin.forgot_password.create');

        Route::post('forgot-password', 'Webkul\Admin\Http\Controllers\User\ForgotPasswordController@store')->name('admin.forgot_password.store');

        // Reset Password Routes
        Route::get('reset-password/{token}', 'Webkul\Admin\Http\Controllers\User\ResetPasswordController@create')->name('admin.reset_password.create');

        Route::post('reset-password', 'Webkul\Admin\Http\Controllers\User\ResetPasswordController@store')->name('admin.reset_password.store');

        Route::post('mail/inbound-parse', 'Webkul\Admin\Http\Controllers\Mail\EmailController@inboundParse')->name('admin.mail.inbound_parse');

        // Admin Routes
        Route::group(['middleware' => ['user']], function () {
            Route::delete('logout', 'Webkul\Admin\Http\Controllers\User\SessionController@destroy')->name('admin.session.destroy');

            // Dashboard Route
            Route::get('dashboard', 'Webkul\Admin\Http\Controllers\Admin\DashboardController@index')->name('admin.dashboard.index');

            Route::get('template', 'Webkul\Admin\Http\Controllers\Admin\DashboardController@template')->name('admin.dashboard.template');

            // API routes
            Route::group([
                'prefix'    => 'api',
            ], function () {
                Route::group([
                    'prefix'    => 'dashboard',
                ], function () {
                    Route::get('/', 'Webkul\Admin\Http\Controllers\Admin\DashboardController@getCardData')->name('admin.api.dashboard.card.index');

                    Route::get('/cards', 'Webkul\Admin\Http\Controllers\Admin\DashboardController@getCards')->name('admin.api.dashboard.cards.index');

                    Route::post('/cards', 'Webkul\Admin\Http\Controllers\Admin\DashboardController@updateCards')->name('admin.api.dashboard.cards.update');
                });
            });

            // User Routes
            Route::group([
                'prefix'    => 'account',
                'namespace' => 'Webkul\Admin\Http\Controllers\User'
            ], function () {
                Route::get('', 'AccountController@edit')->name('admin.user.account.edit');

                Route::put('update', 'AccountController@update')->name('admin.user.account.update');
            });

            // Leads Routes
            Route::group([
                'prefix'    => 'leads',
                'namespace' => 'Webkul\Admin\Http\Controllers\Lead',
            ], function () {
                Route::get('create', 'LeadController@create')->name('admin.leads.create');

                Route::post('create', 'LeadController@store')->name('admin.leads.store');

                Route::get('view/{id?}', 'LeadController@view')->name('admin.leads.view');

                Route::put('edit/{id?}', 'LeadController@update')->name('admin.leads.update');

                Route::get('search', 'LeadController@search')->name('admin.leads.search');

                Route::delete('{id}', 'LeadController@destroy')->name('admin.leads.delete');

                Route::put('mass-update', 'LeadController@massUpdate')->name('admin.leads.mass_update');

                Route::put('mass-destroy', 'LeadController@massDestroy')->name('admin.leads.mass_delete');

                //newly added routes
//dina
Route::post('mass-update-salesperson', 'LeadController@massUpdateSalesperson')->name('admin.leads.mass_update_salesperson');

                Route::post('tags/{id}', 'TagController@store')->name('admin.leads.tags.store');

                Route::delete('{lead_id}/{tag_id?}', 'TagController@delete')->name('admin.leads.tags.delete');

                Route::get('get/{pipeline_id?}', 'LeadController@get')->name('admin.leads.get');

                Route::get('{pipeline_id?}', 'LeadController@index')->name('admin.leads.index');

                Route::group([
                    'prefix'    => 'quotes',
                ], function () {
                    Route::delete('{lead_id}/{quote_id?}', 'QuoteController@delete')->name('admin.leads.quotes.delete');
                });
            });

            // Leads Routes
            Route::group([
                'prefix'    => 'quotes',
                'namespace' => 'Webkul\Admin\Http\Controllers\Quote',
            ], function () {
                Route::get('', 'QuoteController@index')->name('admin.quotes.index');

                Route::get('create/{id?}', 'QuoteController@create')->name('admin.quotes.create');

                Route::post('create', 'QuoteController@store')->name('admin.quotes.store');

                Route::get('edit/{id?}', 'QuoteController@edit')->name('admin.quotes.edit');

                Route::put('edit/{id}', 'QuoteController@update')->name('admin.quotes.update');

                Route::get('print/{id?}', 'QuoteController@print')->name('admin.quotes.print');

                Route::delete('{id}', 'QuoteController@destroy')->name('admin.quotes.delete');

                Route::put('mass-destroy', 'QuoteController@massDestroy')->name('admin.quotes.mass_delete');
            });

            Route::group([
                'prefix'    => 'activities',
                'namespace' => 'Webkul\Admin\Http\Controllers\Activity',
            ], function () {
                Route::get('', 'ActivityController@index')->name('admin.activities.index');

                Route::get('get', 'ActivityController@get')->name('admin.activities.get');

                Route::post('is-overlapping', 'ActivityController@checkIfOverlapping')->name('admin.activities.check_overlapping');

                Route::post('create', 'ActivityController@store')->name('admin.activities.store');

                Route::get('edit/{id?}', 'ActivityController@edit')->name('admin.activities.edit');

                Route::put('edit/{id?}', 'ActivityController@update')->name('admin.activities.update');

                Route::get('search-participants', 'ActivityController@searchParticipants')->name('admin.activities.search_participants');

                Route::post('file-upload', 'ActivityController@upload')->name('admin.activities.file_upload');

                Route::get('file-download/{id?}', 'ActivityController@download')->name('admin.activities.file_download');

                Route::delete('{id?}', 'ActivityController@destroy')->name('admin.activities.delete');

                Route::put('mass-update', 'ActivityController@massUpdate')->name('admin.activities.mass_update');

                Route::put('mass-destroy', 'ActivityController@massDestroy')->name('admin.activities.mass_delete');
            });

            Route::group([
                'prefix'    => 'mail',
                'namespace' => 'Webkul\Admin\Http\Controllers\Mail',
            ], function () {
                Route::post('create', 'EmailController@store')->name('admin.mail.store');

                Route::put('edit/{id?}', 'EmailController@update')->name('admin.mail.update');

                Route::get('attachment-download/{id?}', 'EmailController@download')->name('admin.mail.attachment_download');

                Route::get('{route?}', 'EmailController@index')->name('admin.mail.index');

                Route::get('{route?}/{id?}', 'EmailController@view')->name('admin.mail.view');

                Route::delete('{id?}', 'EmailController@destroy')->name('admin.mail.delete');

                Route::put('mass-update', 'EmailController@massUpdate')->name('admin.mail.mass_update');

                Route::put('mass-destroy', 'EmailController@massDestroy')->name('admin.mail.mass_delete');
            });

            // Contacts Routes
            Route::group([
                'prefix'    => 'contacts',
                'namespace' => 'Webkul\Admin\Http\Controllers\Contact'
            ], function () {
                // Customers Routes
                Route::prefix('persons')->group(function () {
                    Route::get('', 'PersonController@index')->name('admin.contacts.persons.index');

                    Route::get('create', 'PersonController@create')->name('admin.contacts.persons.create');

                    Route::post('create', 'PersonController@store')->name('admin.contacts.persons.store');

                    Route::get('edit/{id?}', 'PersonController@edit')->name('admin.contacts.persons.edit');

                    Route::put('edit/{id}', 'PersonController@update')->name('admin.contacts.persons.update');

                    Route::get('search', 'PersonController@search')->name('admin.contacts.persons.search');

                    Route::delete('{id}', 'PersonController@destroy')->name('admin.contacts.persons.delete');

                    Route::put('mass-destroy', 'PersonController@massDestroy')->name('admin.contacts.persons.mass_delete');
                });

                // Companies Routes
                Route::prefix('organizations')->group(function () {
                    Route::get('', 'OrganizationController@index')->name('admin.contacts.organizations.index');

                    Route::get('create', 'OrganizationController@create')->name('admin.contacts.organizations.create');

                    Route::post('create', 'OrganizationController@store')->name('admin.contacts.organizations.store');

                    Route::get('edit/{id?}', 'OrganizationController@edit')->name('admin.contacts.organizations.edit');

                    Route::put('edit/{id}', 'OrganizationController@update')->name('admin.contacts.organizations.update');

                    Route::delete('{id}', 'OrganizationController@destroy')->name('admin.contacts.organizations.delete');

                    Route::put('mass-destroy', 'OrganizationController@massDestroy')->name('admin.contacts.organizations.mass_delete');
                });
            });

            // Products Routes
            Route::group([
                'prefix'    => 'products',
                'namespace' => 'Webkul\Admin\Http\Controllers\Product'
            ], function () {
                Route::get('', 'ProductController@index')->name('admin.products.index');

                Route::get('create', 'ProductController@create')->name('admin.products.create');

                Route::post('create', 'ProductController@store')->name('admin.products.store');

                Route::get('edit/{id}', 'ProductController@edit')->name('admin.products.edit');

                Route::put('edit/{id}', 'ProductController@update')->name('admin.products.update');

                Route::get('search', 'ProductController@search')->name('admin.products.search');

                Route::delete('{id}', 'ProductController@destroy')->name('admin.products.delete');

                Route::put('mass-destroy', 'ProductController@massDestroy')->name('admin.products.mass_delete');
            });

            // Contacts Routes
            Route::group([
                'prefix'    => 'settings',
                'namespace' => 'Webkul\Admin\Http\Controllers\Setting'
            ], function () {

                Route::get('', 'SettingController@index')->name('admin.settings.index');

                // Groups Routes
                Route::prefix('groups')->group(function () {
                    Route::get('', 'GroupController@index')->name('admin.settings.groups.index');

                    Route::get('create', 'GroupController@create')->name('admin.settings.groups.create');

                    Route::post('create', 'GroupController@store')->name('admin.settings.groups.store');

                    Route::get('edit/{id}', 'GroupController@edit')->name('admin.settings.groups.edit');

                    Route::put('edit/{id}', 'GroupController@update')->name('admin.settings.groups.update');

                    Route::delete('{id}', 'GroupController@destroy')->name('admin.settings.groups.delete');
                });

                // Roles Routes
                Route::prefix('roles')->group(function () {
                    Route::get('', 'RoleController@index')->name('admin.settings.roles.index');

                    Route::get('create', 'RoleController@create')->name('admin.settings.roles.create');

                    Route::post('create', 'RoleController@store')->name('admin.settings.roles.store');

                    Route::get('edit/{id}', 'RoleController@edit')->name('admin.settings.roles.edit');

                    Route::put('edit/{id}', 'RoleController@update')->name('admin.settings.roles.update');

                    Route::delete('{id}', 'RoleController@destroy')->name('admin.settings.roles.delete');
                });

                // Users Routes
                Route::prefix('users')->group(function () {
                    Route::get('', 'UserController@index')->name('admin.settings.users.index');

                    Route::get('create', 'UserController@create')->name('admin.settings.users.create');

                    Route::post('create', 'UserController@store')->name('admin.settings.users.store');

                    Route::get('edit/{id?}', 'UserController@edit')->name('admin.settings.users.edit');

                    Route::put('edit/{id}', 'UserController@update')->name('admin.settings.users.update');

                    Route::delete('{id}', 'UserController@destroy')->name('admin.settings.users.delete');

                    Route::put('mass-update', 'UserController@massUpdate')->name('admin.settings.users.mass_update');

                    Route::put('mass-destroy', 'UserController@massDestroy')->name('admin.settings.users.mass_delete');
                });

                // Attributes Routes
                Route::prefix('attributes')->group(function () {
                    Route::get('', 'AttributeController@index')->name('admin.settings.attributes.index');

                    Route::get('create', 'AttributeController@create')->name('admin.settings.attributes.create');

                    Route::post('create', 'AttributeController@store')->name('admin.settings.attributes.store');

                    Route::get('edit/{id}', 'AttributeController@edit')->name('admin.settings.attributes.edit');

                    Route::put('edit/{id}', 'AttributeController@update')->name('admin.settings.attributes.update');

                    Route::get('lookup/{lookup?}', 'AttributeController@lookup')->name('admin.settings.attributes.lookup');

                    Route::get('lookup-entity/{lookup?}', 'AttributeController@lookupEntity')->name('admin.settings.attributes.lookup_entity');

                    Route::delete('{id}', 'AttributeController@destroy')->name('admin.settings.attributes.delete');

                    Route::put('mass-update', 'AttributeController@massUpdate')->name('admin.settings.attributes.mass_update');

                    Route::put('mass-destroy', 'AttributeController@massDestroy')->name('admin.settings.attributes.mass_delete');

                    Route::get('download', 'AttributeController@download')->name('admin.settings.attributes.download');
                });


                // Lead Pipelines Routes
                Route::prefix('pipelines')->group(function () {
                    Route::get('', 'PipelineController@index')->name('admin.settings.pipelines.index');

                    Route::get('create', 'PipelineController@create')->name('admin.settings.pipelines.create');

                    Route::post('create', 'PipelineController@store')->name('admin.settings.pipelines.store');

                    Route::get('edit/{id?}', 'PipelineController@edit')->name('admin.settings.pipelines.edit');

                    Route::put('edit/{id}', 'PipelineController@update')->name('admin.settings.pipelines.update');

                    Route::delete('{id}', 'PipelineController@destroy')->name('admin.settings.pipelines.delete');
                });


                // Lead Sources Routes
                Route::prefix('sources')->group(function () {
                    Route::get('', 'SourceController@index')->name('admin.settings.sources.index');

                    Route::post('create', 'SourceController@store')->name('admin.settings.sources.store');

                    Route::get('edit/{id?}', 'SourceController@edit')->name('admin.settings.sources.edit');

                    Route::put('edit/{id}', 'SourceController@update')->name('admin.settings.sources.update');

                    Route::delete('{id}', 'SourceController@destroy')->name('admin.settings.sources.delete');
                });


                // Lead Types Routes
                Route::prefix('types')->group(function () {
                    Route::get('', 'TypeController@index')->name('admin.settings.types.index');

                    Route::post('create', 'TypeController@store')->name('admin.settings.types.store');

                    Route::get('edit/{id?}', 'TypeController@edit')->name('admin.settings.types.edit');

                    Route::put('edit/{id}', 'TypeController@update')->name('admin.settings.types.update');

                    Route::delete('{id}', 'TypeController@destroy')->name('admin.settings.types.delete');
                });


                // Email Templates Routes
                Route::prefix('email-templates')->group(function () {
                    Route::get('', 'EmailTemplateController@index')->name('admin.settings.email_templates.index');

                    Route::get('create', 'EmailTemplateController@create')->name('admin.settings.email_templates.create');

                    Route::post('create', 'EmailTemplateController@store')->name('admin.settings.email_templates.store');

                    Route::get('edit/{id?}', 'EmailTemplateController@edit')->name('admin.settings.email_templates.edit');

                    Route::put('edit/{id}', 'EmailTemplateController@update')->name('admin.settings.email_templates.update');

                    Route::delete('{id}', 'EmailTemplateController@destroy')->name('admin.settings.email_templates.delete');
                });


                // Workflows Routes
                Route::prefix('workflows')->group(function () {
                    Route::get('', 'WorkflowController@index')->name('admin.settings.workflows.index');

                    Route::get('create', 'WorkflowController@create')->name('admin.settings.workflows.create');

                    Route::post('create', 'WorkflowController@store')->name('admin.settings.workflows.store');

                    Route::get('edit/{id?}', 'WorkflowController@edit')->name('admin.settings.workflows.edit');

                    Route::put('edit/{id}', 'WorkflowController@update')->name('admin.settings.workflows.update');

                    Route::delete('{id}', 'WorkflowController@destroy')->name('admin.settings.workflows.delete');
                });


                // Tags Routes
                Route::prefix('tags')->group(function () {
                    Route::get('', 'TagController@index')->name('admin.settings.tags.index');

                    Route::post('create', 'TagController@store')->name('admin.settings.tags.store');

                    Route::get('edit/{id?}', 'TagController@edit')->name('admin.settings.tags.edit');

                    Route::put('edit/{id}', 'TagController@update')->name('admin.settings.tags.update');

                    Route::get('search', 'TagController@search')->name('admin.settings.tags.search');

                    Route::delete('{id}', 'TagController@destroy')->name('admin.settings.tags.delete');

                    Route::put('mass-destroy', 'TagController@massDestroy')->name('admin.settings.tags.mass_delete');
                });
            });

            // Configuration Routes
            Route::group([
                'prefix'    => 'configuration',
                'namespace' => 'Webkul\Admin\Http\Controllers\Configuration'
            ], function () {
                Route::get('{slug?}', 'ConfigurationController@index')->name('admin.configuration.index');

                Route::post('{slug?}', 'ConfigurationController@store')->name('admin.configuration.index.store');
            });
        });
    });
});


And here's the code of the LeadDataGrid with the newly added mass action


<?php



namespace Webkul\Admin\DataGrids\Lead;

use Illuminate\Support\Facades\DB;
use Carbon\Carbon;
use Webkul\Admin\Traits\ProvideDropdownOptions;
use Webkul\Lead\Repositories\PipelineRepository;
use Webkul\Lead\Repositories\StageRepository;
use Webkul\UI\DataGrid\DataGrid;
use Webkul\User\Repositories\UserRepository;
use Webkul\User\Models\User;



class LeadDataGrid extends DataGrid
{


    use ProvideDropdownOptions;

    /**
     * Pipeline repository instance.
     *
     * @var \Webkul\Lead\Repositories\PipelineRepository
     */
    protected $pipelineRepository;

    /**
     * Pipeline instance.
     *
     * @var \Webkul\Contract\Repositories\Pipeline
     */
    protected $pipeline;

    /**
     * Stage repository instance.
     *
     * @var \Webkul\Lead\Repositories\StageRepository
     */
    protected $stageRepository;

    /**
     * User repository instance.
     *
     * @var \Webkul\User\Repositories\UserRepository
     */
    protected $userRepository;

    /**
     * Create data grid instance.
     *
     * @param \Webkul\Lead\Repositories\PipelineRepository  $pipelineRepository
     * @param \Webkul\Lead\Repositories\StageRepository  $stageRepository
     * @param \Webkul\User\Repositories\UserRepository  $userRepository
     * @return void
     */
    public function __construct(
        PipelineRepository $pipelineRepository,
        StageRepository $stageRepository,
        UserRepository $userRepository
    ) {
        $this->pipelineRepository = $pipelineRepository;

        if (request('pipeline_id')) {
            $this->pipeline = $this->pipelineRepository->find(request('pipeline_id'));
        } else {
            $this->pipeline = $this->pipelineRepository->getDefaultPipeline();
        }

        $this->stageRepository = $stageRepository;

        $this->userRepository = $userRepository;

        parent::__construct();

        $this->export = bouncer()->hasPermission('leads.persons.export') ? true : false;
    }

    /**
     * Place your datagrid extra settings here.
     *
     * @return void
     */
    public function init()
    {
        $this->setRowProperties([
            'backgroundColor' => '#ffd0d6',
            'condition' => function ($row) {
                if (in_array($row->stage_code, ['won', 'lost']) || ! $row->rotten_lead) {
                    return false;
                }

                return true;
            }
        ]);
    }

    /**
     * Prepare query builder.
     *
     * @return void
     */
    public function prepareQueryBuilder()
    {
       $queryBuilder = DB::table('leads')
    ->addSelect(
        'leads.id',
        'leads.title',
       // 'leads.status',
      'leads.lead_value',
     //   'leads.expected_close_date',
        'lead_sources.name as lead_source_name',
        'leads.created_at',
        'lead_pipeline_stages.name as stage',
       // 'lead_tags.tag_id as tag_id',
        'users.id as user_id',
        'users.name as sales_person',
        'persons.id as person_id',
        'persons.name as person_name',
       'tags.name as tag_name',
       // 'lead_pipelines.rotten_days as pipeline_rotten_days',
        'lead_pipeline_stages.code as stage_code',
        'products.name as product_name',


        //add closed date to the grid (dina)

        'leads.closed_at',

        DB::raw('CASE WHEN DATEDIFF(NOW(),' . DB::getTablePrefix() . 'leads.created_at) >=' . DB::getTablePrefix() . 'lead_pipelines.rotten_days THEN 1 ELSE 0 END as rotten_lead')
    )
    ->leftJoin('users', 'leads.user_id', '=', 'users.id')
    ->leftJoin('persons', 'leads.person_id', '=', 'persons.id')
    ->leftJoin('lead_types', 'leads.lead_type_id', '=', 'lead_types.id')
    ->leftJoin('lead_pipeline_stages', 'leads.lead_pipeline_stage_id', '=', 'lead_pipeline_stages.id')
    ->leftJoin('lead_sources', 'leads.lead_source_id', '=', 'lead_sources.id')
    ->leftJoin('lead_pipelines', 'leads.lead_pipeline_id', '=', 'lead_pipelines.id')
    ->leftJoin('lead_tags', 'leads.id', '=', 'lead_tags.lead_id')
    ->leftJoin('tags', 'tags.id', '=', 'lead_tags.tag_id')
    ->leftJoin('lead_products', 'leads.id', '=', 'lead_products.lead_id')
    ->leftJoin('products', 'lead_products.product_id', '=', 'products.id')
    ->groupBy('leads.id')
    ->where('leads.lead_pipeline_id', $this->pipeline->id);


        $currentUser = auth()->guard('user')->user();

        if ($currentUser->view_permission != 'global') {
            if ($currentUser->view_permission == 'group') {
                $queryBuilder->whereIn('leads.user_id', $this->userRepository->getCurrentUserGroupsUserIds());
            } else {
                $queryBuilder->where('leads.user_id', $currentUser->id);
            }
        }

        if (! is_null(request()->input('rotten_lead.in'))) {
            $queryBuilder->havingRaw(DB::getTablePrefix() . 'rotten_lead = ' . request()->input('rotten_lead.in'));
        }

        $this->addFilter('id', 'leads.id');
        $this->addFilter('user', 'leads.user_id');
        $this->addFilter('sales_person', 'leads.user_id');
        $this->addFilter('lead_source_name', 'lead_sources.id');
        $this->addFilter('person_name', 'persons.name');
        $this->addFilter('type', 'lead_pipeline_stages.code');
        $this->addFilter('stage', 'lead_pipeline_stages.name');
        $this->addFilter('tag_name', 'tags.name');
        $this->addFilter('expected_close_date', 'leads.expected_close_date');
        $this->addFilter('created_at', 'leads.created_at');
        $this->addFilter('rotten_lead',  DB::raw('DATEDIFF(NOW(), ' . DB::getTablePrefix() . 'leads.created_at) >= ' . DB::getTablePrefix() . 'lead_pipelines.rotten_days'));

// add filtering by produc name (dina)
        $this->addFilter('product_name', 'products.name');

        $this->setQueryBuilder($queryBuilder);
    }

    /**
     * Add columns.
     *
     * @return void
     */
    public function addColumns()
    {
        $this->addColumn([
            'index'    => 'id',
            'label'    => trans('admin::app.datagrid.id'),
            'type'     => 'string',
            'sortable' => true,
        ]);

        $this->addColumn([
            'index'      => 'person_name',
            'label'      => trans('admin::app.datagrid.contact_person'),
            'type'       => 'string',
            'searchable' => false,
            'sortable'   => false,
            'closure'    => function ($row) {
                $route = urldecode(route('admin.contacts.persons.index', ['id[eq]' => $row->person_id]));

                return "<a href='" . $route . "'>" . $row->person_name . "</a>";
            },
        ]);


        //adding phone no. to grid (dina)

        // $this->addColumn([
        //     'index'    => 'contact_numbers',
        //     'label'    => trans('admin::app.leads.contact-numbers'),
        //     'type'     => 'phone',
        //     'sortable' => false,
        //     'closure'  => function ($row) {
        //         $contactNumbers = json_decode($row->contact_numbers, true);

        //         if ($contactNumbers) {
        //             return collect($contactNumbers)->pluck('value')->join(', ');
        //         }
        //     },
        // ]);


         $this->addColumn([
            'index'            => 'lead_source_name',
            'label'            => trans('admin::app.leads.lead-source-name'),
            'type'             => 'dropdown',
            'dropdown_options' => $this->getleadSourcesOptions(),
            'searchable'       => false,
            'sortable'         => true,
        ]);

         $this->addColumn([
        'index' => 'product_name',
        'label' => trans('admin::app.acl.products'),
        'type' => 'string',
        'sortable' => true,
    ]);

     $this->addColumn([
            'index'      => 'stage',
            'label'      => trans('admin::app.datagrid.stage'),
            'type'       => 'string',
            'searchable' => false,
            'sortable'   => false,
            'filterable' => false,
            'closure'    => function ($row) {
                if ($row->stage == 'Won') {
                    $badge = 'success';
                } else if ($row->stage == 'Lost') {
                    $badge = 'danger';
                } else {
                    $badge = 'primary';
                }

                return "<span class='badge badge-round badge-{$badge}'></span>" . $row->stage;
            },
        ]);

        $this->addColumn([
            'index'            => 'sales_person',
            'label'            => trans('admin::app.datagrid.sales-person'),
            'type'             => 'dropdown',
            'dropdown_options' => $this->getUserDropdownOptions(),
            'searchable'       => false,
            'sortable'         => true,
            'closure'          => function ($row) {
                $route = urldecode(route('admin.settings.users.index', ['id[eq]' => $row->user_id]));

                return "<a href='" . $route . "'>" . $row->sales_person . "</a>";



            },
        ]);


        //remove lead title from the data grid (dina)

        // $this->addColumn([
        //     'index'    => 'title',
        //     'label'    => trans('admin::app.datagrid.subject'),
        //     'type'     => 'string',
        //     'sortable' => true,
        // ]);

        $this->addColumn([
            'index'    => 'tag_name',
            'label'    => trans('admin::app.datagrid.tags'),
            'type'     => 'hidden',
            'sortable' => true,
        ]);



        // $this->addColumn([
        //     'index'    => 'lead_value',
        //     'label'    => trans('admin::app.datagrid.lead_value'),
        //     'type'     => 'string',
        //     'sortable' => true,
        //     'closure'  => function ($row) {
        //         return core()->formatBasePrice($row->lead_value, 2);
        //     },
        // ]);





        //update data grid table of leads (dina)
        // // $this->addColumn([
        // //     'index'             => 'rotten_lead',
        // //     'label'             => trans('admin::app.datagrid.rotten_lead'),
        // //     'type'              => 'single_dropdown',
        // //     'dropdown_options'  => $this->getYesNoDropdownOptions(),
        // //     'sortable'          => true,
        // //     'searchable'        => false,
        // //     'condition'         => 'eq',
        // //     'closure'           => function ($row) {
        // //         return ! $row->rotten_lead || in_array($row->stage_code, ['won', 'lost']) ? trans('admin::app.common.no') : trans('admin::app.common.yes');
        // //     }
        // // ]);

        // $this->addColumn([
        //     'index'      => 'expected_close_date',
        //     'label'      => trans('admin::app.datagrid.expected_close_date'),
        //     'type'       => 'date_range',
        //     'searchable' => false,
        //     'sortable'   => true,
        //     'closure'    => function ($row) {
        //         if (! $row->expected_close_date) {
        //             return '--';
        //         }

        //         return core()->formatDate($row->expected_close_date);
        //     },
        // ]);

            //adding product name to the leads data grid (dina)



    //adding closed date to the data grid (dina)

//  $this->addColumn([
//             'index'      => 'expected_close_date',
//             'label'      => trans('admin::app.leads.closed-date:'),
//             'type'       => 'date_range',
//             'searchable' => false,
//             'sortable'   => true,
//             'closure'    => function ($row) {
//                 if (! $row->closed_at) {
//                     return '--';
//                 }

//                 return core()->formatDate($row->closed_at);
//             },
//         ]);




        $this->addColumn([
            'index'      => 'created_at',
            'label'      => trans('admin::app.datagrid.created_at'),
            'type'       => 'date_range',
            'searchable' => false,
            'sortable'   => true,
            'closure'    => function ($row) {
                return core()->formatDate($row->created_at);
            },
        ]);



    }

    /**
     * Prepare tab filters.
     *
     * @return array
     */
    public function prepareTabFilters()
    {
        $values = $this->pipeline->stages()
            ->get(['name', 'code as key', DB::raw('false as isActive')])
            ->prepend([
                'isActive' => true,
                'key'      => 'all',
                'name'     => trans('admin::app.datagrid.all'),
            ])
            ->toArray();

        $this->addTabFilter([
            'key'        => 'type',
            'type'       => 'pill',
            'condition'  => 'eq',
            'value_type' => 'lookup',
            'values'     => $values,
        ]);
    }

    /**
     * Prepare actions.
     *
     * @return void
     */
  public function prepareActions()
{
    $this->addAction([
        'title'        => trans('ui::app.datagrid.edit'),
        'method'       => 'GET',
        'route'        => 'admin.leads.view',
        'icon'         => 'eye-icon',
        'data-action'  => 'view',
        'attributes'   => [
            'onclick' => 'redirectToView(this)',
        ],
    ]);

    $this->addAction([
        'title'        => trans('ui::app.datagrid.delete'),
        'method'       => 'DELETE',
        'route'        => 'admin.leads.delete',
        'confirm_text' => trans('ui::app.datagrid.massaction.delete', ['resource' => trans('admin::app.contacts.persons.person')]),
        'icon'         => 'trash-icon',
    ]);
}

    /**
     * Prepare mass actions.
     *
     * @return void
     */
    public function prepareMassActions()
    {
        $stages = [];

        foreach ($this->pipeline->stages->toArray() as $stage) {
            $stages[$stage['name']] = $stage['id'];
        }

        $this->addMassAction([
            'type'   => 'delete',
            'label'  => trans('ui::app.datagrid.delete'),
            'action' => route('admin.leads.mass_delete'),
            'method' => 'PUT',
        ]);

        $this->addMassAction([
            'type'    => 'update',
            'label'   => trans('admin::app.datagrid.update_stage'),
            'action'  => route('admin.leads.mass_update'),
            'method'  => 'PUT',
            'options' => $stages,
        ]);

    //newly added mass action
         $this->addMassAction([
    'type'    => 'update',
    'label'   => trans('admin::app.datagrid.update_salesperson'),
    'action'  => route('admin.leads.mass_update_salesperson'),
    'method'  => 'post',
    'options' => $this->getUserDropdownOptions(),
]);

    }
}

Last updated by @deenah85 1 year ago.
0

Sign in to participate in this thread!

PHPverse

Your banner here too?

Dina S deenah85 Joined 3 Jun 2023

Moderators

We'd like to thank these amazing companies for supporting us

Your logo here?

Laravel.io

The Laravel portal for problem solving, knowledge sharing and community building.

© 2025 Laravel.io - All rights reserved.