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')]),
]);
}
}`
<?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');
});
});
});
});
<?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(),
]);
}
}
Sign in to participate in this thread!
The Laravel portal for problem solving, knowledge sharing and community building.
The community