@deenah85 It seems you have posted your entier codebase!
Can you please be precise in your question?
Be part of JetBrains PHPverse 2026 on June 9 – a free online event bringing PHP devs worldwide together.
I need help adding a mass update for my laravel CRM using the drop down menu on my datagrid to be able to mass update the leads with sales person's names., but it's not working.
The code for the datagrid with the new massupdate function is:
<?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
$this->addMassAction([
'type' => 'update',
'label' => trans('admin::app.datagrid.update_salesperson'),
'action' => route('admin.leads.mass_update_salesperson'),
'method' => 'POSt',
'options' => $this->getUserDropdownOptions(),
]);
}
}
and the code for the routing.php with the new route is:
<?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');
//new route
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 the code for the LeadController is:
<?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')]),
]);
}
}
Please or to participate in this conversation.