commonUtil = $commonUtil; $this->moduleUtil = $moduleUtil; $this->crmUtil = $crmUtil; } /** * Display a listing of the resource. * * @return Response */ public function index() { $business_id = request()->session()->get('user.business_id'); $can_access_all_leads = auth()->user()->can('crm.access_all_leads'); $can_access_own_leads = auth()->user()->can('crm.access_own_leads'); if (! (auth()->user()->can('superadmin') || $this->moduleUtil->hasThePermissionInSubscription($business_id, 'crm_module')) || ! ($can_access_all_leads || $can_access_own_leads)) { abort(403, 'Unauthorized action.'); } $life_stages = Category::forDropdown($business_id, 'life_stage'); if (is_null(request()->get('lead_view'))) { $lead_view = 'list_view'; } else { $lead_view = request()->get('lead_view'); } if (request()->ajax()) { $leads = $this->crmUtil->getLeadsListQuery($business_id); if (! $can_access_all_leads && $can_access_own_leads) { $leads->OnlyOwnLeads(); } if (! empty(request()->get('source'))) { $leads->where('crm_source', request()->get('source')); } if (! empty(request()->get('life_stage'))) { $leads->where('crm_life_stage', request()->get('life_stage')); } if (! empty(request()->get('user_id'))) { $user_id = request()->get('user_id'); $leads->where(function ($query) use ($user_id) { $query->whereHas('leadUsers', function ($q) use ($user_id) { $q->where('user_id', $user_id); }); }); } $lead_state = request()->get('lead_state', 'active'); if ($lead_state === 'active') { $leads->where('contacts.crm_is_archived', 0); } elseif ($lead_state === 'archived') { $leads->where('contacts.crm_is_archived', 1); } if (request()->filled('value_min')) { $leads->where('contacts.crm_lead_value', '>=', $this->commonUtil->num_uf(request()->get('value_min'))); } if (request()->filled('value_max')) { $leads->where('contacts.crm_lead_value', '<=', $this->commonUtil->num_uf(request()->get('value_max'))); } if (request()->filled('created_from')) { $leads->whereDate('contacts.created_at', '>=', $this->commonUtil->uf_date(request()->get('created_from'))); } if (request()->filled('created_to')) { $leads->whereDate('contacts.created_at', '<=', $this->commonUtil->uf_date(request()->get('created_to'))); } if ($lead_view == 'list_view') { return Datatables::of($leads) ->addColumn('action', function ($row) { $html = '
'; return $html; }) ->addColumn('lead_title', function ($row) { $title = $row->display_lead_title; $view_url = action([\Modules\Crm\Http\Controllers\LeadController::class, 'show'], ['lead' => $row->id]); return ''.$title.''; }) ->editColumn('created_at', '@format_date($created_at)') ->editColumn('crm_source', function ($row) { return $row->Source?->name; }) ->editColumn('crm_life_stage', function ($row) { $label = $row->lifeStage?->name ?? ''; $archived = ! empty($row->crm_is_archived) ? ' '.__('crm::lang.archived').'' : ''; return $label ? ''.$label.''.$archived : $archived; }) ->editColumn('crm_lead_value', function ($row) { if ($row->crm_lead_value === null || $row->crm_lead_value === '') { return ''; } return $this->commonUtil->num_f($row->crm_lead_value, true); }) ->editColumn('name', '@if(!empty($supplier_business_name)) {{$supplier_business_name}},
@endif {{$name}}') ->editColumn('leadUsers', function ($row) { $html = ' '; foreach ($row->leadUsers as $leadUser) { if (isset($leadUser->media->display_url)) { $html .= ''; } else { $html .= ''; } } return $html; }) ->removeColumn('id') ->rawColumns(['action', 'crm_source', 'crm_life_stage', 'leadUsers', 'created_at', 'name', 'lead_title']) ->make(true); } elseif ($lead_view == 'kanban') { $leads = $leads->get()->groupBy('crm_life_stage'); //sort leads based on life stage $crm_leads = []; $board_draggable_to = []; foreach ($life_stages as $key => $value) { $board_draggable_to[] = strval($key); if (! isset($leads[$key])) { $crm_leads[strval($key)] = []; } else { $crm_leads[strval($key)] = $leads[$key]; } } $leads_html = []; foreach ($crm_leads as $key => $leads) { //get all the leads for particular board(life stage) $cards = []; foreach ($leads as $lead) { $edit = action([\Modules\Crm\Http\Controllers\LeadController::class, 'edit'], ['lead' => $lead->id]); $delete = action([\Modules\Crm\Http\Controllers\LeadController::class, 'destroy'], ['lead' => $lead->id]); $view = action([\Modules\Crm\Http\Controllers\LeadController::class, 'show'], ['lead' => $lead->id]); $convert = action([\Modules\Crm\Http\Controllers\LeadController::class, 'showConvertForm'], ['id' => $lead->id]); //if member then get their avatar if ($lead->leadUsers->count() > 0) { $assigned_to = []; foreach ($lead->leadUsers as $member) { if (isset($member->media->display_url)) { $assigned_to[$member->user_full_name] = $member->media->display_url; } else { $assigned_to[$member->user_full_name] = 'https://ui-avatars.com/api/?name='.$member->first_name; } } } $cards[] = [ 'id' => $lead->id, 'title' => $lead->display_lead_title, 'viewUrl' => $view, 'editUrl' => $edit, 'editUrlClass' => 'edit_lead', 'deleteUrl' => $delete, 'deleteUrlClass' => 'delete_a_lead', 'convertUrl' => $convert, 'convertUrlClass' => 'convert_to_customer', 'assigned_to' => $assigned_to, 'hasDescription' => ! empty($lead->crm_lead_description), 'tags' => array_filter([ $lead->Source->name ?? null, ! empty($lead->crm_lead_value) ? $this->commonUtil->num_f($lead->crm_lead_value, true) : null, ]), 'dragTo' => $board_draggable_to, ]; } //get all the card & board title for particular board(life stage) $leads_html[] = [ 'id' => strval($key), 'title' => $life_stages[$key], 'cards' => $cards, ]; } $output = [ 'success' => true, 'leads_html' => $leads_html, 'msg' => __('lang_v1.success'), ]; return $output; } } $sources = Category::forDropdown($business_id, 'source'); $users = User::forDropdown($business_id, false, false, false, true); return view('crm::lead.index') ->with(compact('sources', 'life_stages', 'lead_view', 'users')); } /** * Show the form for creating a new resource. * * @return Response */ public function create() { $business_id = request()->session()->get('user.business_id'); if (! (auth()->user()->can('superadmin') || $this->moduleUtil->hasThePermissionInSubscription($business_id, 'crm_module'))) { abort(403, 'Unauthorized action.'); } $users = User::forDropdown($business_id, false, false, false, true); $sources = Category::forDropdown($business_id, 'source'); $life_stages = Category::forDropdown($business_id, 'life_stage'); $types['lead'] = __('crm::lang.lead'); $store_action = action([\Modules\Crm\Http\Controllers\LeadController::class, 'store']); $module_form_parts = $this->moduleUtil->getModuleData('contact_form_part'); return view('contact.create') ->with(compact('types', 'store_action', 'sources', 'life_stages', 'users', 'module_form_parts')); } /** * Store a newly created resource in storage. * * @param Request $request * @return Response */ public function store(Request $request) { $business_id = request()->session()->get('user.business_id'); if (! (auth()->user()->can('superadmin') || $this->moduleUtil->hasThePermissionInSubscription($business_id, 'crm_module'))) { abort(403, 'Unauthorized action.'); } try { $input = $request->only(['type', 'prefix', 'first_name', 'middle_name', 'last_name', 'tax_number', 'mobile', 'landline', 'alternate_number', 'city', 'state', 'country', 'landmark', 'contact_id', 'manual_id', 'custom_field1', 'custom_field2', 'custom_field3', 'custom_field4', 'custom_field5', 'custom_field6', 'custom_field7', 'custom_field8', 'custom_field9', 'custom_field10', 'email', 'crm_source', 'crm_life_stage', 'crm_lead_title', 'crm_lead_description', 'dob', 'address_line_1', 'address_line_2', 'zip_code', 'supplier_business_name', 'shipping_custom_field_details']); if ($request->filled('crm_lead_value')) { $input['crm_lead_value'] = $this->commonUtil->num_uf($request->input('crm_lead_value')); } $input['name'] = implode(' ', [$input['prefix'], $input['first_name'], $input['middle_name'], $input['last_name']]); if (! empty($request->input('is_export'))) { $input['is_export'] = true; $input['export_custom_field_1'] = $request->input('export_custom_field_1'); $input['export_custom_field_2'] = $request->input('export_custom_field_2'); $input['export_custom_field_3'] = $request->input('export_custom_field_3'); $input['export_custom_field_4'] = $request->input('export_custom_field_4'); $input['export_custom_field_5'] = $request->input('export_custom_field_5'); $input['export_custom_field_6'] = $request->input('export_custom_field_6'); } if (! empty($input['dob'])) { $input['dob'] = $this->commonUtil->uf_date($input['dob']); } $input['business_id'] = $business_id; $input['created_by'] = $request->session()->get('user.id'); $assigned_to = $request->input('user_id'); $contact = CrmContact::createNewLead($input, $assigned_to); if (! empty($contact)) { $this->moduleUtil->getModuleData('after_contact_saved', ['contact' => $contact, 'input' => $request->input()]); } $output = ['success' => true, 'msg' => __('contact.added_success'), ]; } catch (\Exception $e) { \Log::emergency('File:'.$e->getFile().'Line:'.$e->getLine().'Message:'.$e->getMessage()); $output = ['success' => false, 'msg' => __('messages.something_went_wrong'), ]; } return $output; } /** * Show the specified resource. * * @param int $id * @return Response */ public function show($id) { $business_id = request()->session()->get('user.business_id'); $can_access_all_leads = auth()->user()->can('crm.access_all_leads'); $can_access_own_leads = auth()->user()->can('crm.access_own_leads'); if (! (auth()->user()->can('superadmin') || $this->moduleUtil->hasThePermissionInSubscription($business_id, 'crm_module')) || ! ($can_access_all_leads || $can_access_own_leads)) { abort(403, 'Unauthorized action.'); } $query = CrmContact::with('leadUsers', 'Source', 'lifeStage') ->where('business_id', $business_id); if (! $can_access_all_leads && $can_access_own_leads) { $query->OnlyOwnLeads(); } $contact = $query->findOrFail($id); $leads = CrmContact::leadsDropdown($business_id, false); $contact_view_tabs = $this->moduleUtil->getModuleData('get_contact_view_tabs'); return view('crm::lead.show') ->with(compact('contact', 'leads', 'contact_view_tabs')); } /** * Show the form for editing the specified resource. * * @param int $id * @return Response */ public function edit($id) { $business_id = request()->session()->get('user.business_id'); $can_access_all_leads = auth()->user()->can('crm.access_all_leads'); $can_access_own_leads = auth()->user()->can('crm.access_own_leads'); if (! (auth()->user()->can('superadmin') || $this->moduleUtil->hasThePermissionInSubscription($business_id, 'crm_module')) || ! ($can_access_all_leads || $can_access_own_leads)) { abort(403, 'Unauthorized action.'); } $query = CrmContact::with('leadUsers') ->where('business_id', $business_id); if (! $can_access_all_leads && $can_access_own_leads) { $query->OnlyOwnLeads(); } $contact = $query->findOrFail($id); $users = User::forDropdown($business_id, false); $sources = Category::forDropdown($business_id, 'source'); $life_stages = Category::forDropdown($business_id, 'life_stage'); $types['lead'] = __('crm::lang.lead'); $update_action = action([\Modules\Crm\Http\Controllers\LeadController::class, 'update'], ['lead' => $id]); return view('contact.edit') ->with(compact('contact', 'types', 'update_action', 'sources', 'life_stages', 'users')); } /** * Update the specified resource in storage. * * @param Request $request * @param int $id * @return Response */ public function update(Request $request, $id) { $business_id = request()->session()->get('user.business_id'); $can_access_all_leads = auth()->user()->can('crm.access_all_leads'); $can_access_own_leads = auth()->user()->can('crm.access_own_leads'); if (! (auth()->user()->can('superadmin') || $this->moduleUtil->hasThePermissionInSubscription($business_id, 'crm_module')) || ! ($can_access_all_leads || $can_access_own_leads)) { abort(403, 'Unauthorized action.'); } try { $input = $request->only(['type', 'prefix', 'first_name', 'middle_name', 'last_name', 'tax_number', 'mobile', 'landline', 'alternate_number', 'city', 'state', 'country', 'landmark', 'contact_id', 'custom_field1', 'custom_field2', 'custom_field3', 'custom_field4', 'custom_field5', 'custom_field6', 'custom_field7', 'custom_field8', 'custom_field9', 'custom_field10', 'email', 'crm_source', 'crm_life_stage', 'crm_lead_title', 'crm_lead_description', 'dob', 'address_line_1', 'address_line_2', 'zip_code', 'supplier_business_name', 'shipping_custom_field_details', 'export_custom_field_1', 'export_custom_field_2', 'export_custom_field_3', 'export_custom_field_4', 'export_custom_field_5', 'export_custom_field_6']); if ($request->filled('crm_lead_value')) { $input['crm_lead_value'] = $this->commonUtil->num_uf($request->input('crm_lead_value')); } else { $input['crm_lead_value'] = null; } $input['name'] = implode(' ', [$input['prefix'], $input['first_name'], $input['middle_name'], $input['last_name']]); $input['is_export'] = ! empty($request->input('is_export')) ? 1 : 0; if (! $input['is_export']) { unset($input['export_custom_field_1'], $input['export_custom_field_2'], $input['export_custom_field_3'], $input['export_custom_field_4'], $input['export_custom_field_5'], $input['export_custom_field_6']); } if (! empty($input['dob'])) { $input['dob'] = $this->commonUtil->uf_date($input['dob']); } $assigned_to = $request->input('user_id'); $contact = CrmContact::updateLead($id, $input, $assigned_to); $output = [ 'success' => true, 'msg' => __('lang_v1.success'), ]; } catch (\Exception $e) { \Log::emergency('File:'.$e->getFile().'Line:'.$e->getLine().'Message:'.$e->getMessage()); $output = ['success' => false, 'msg' => __('messages.something_went_wrong'), ]; } return $output; } /** * Remove the specified resource from storage. * * @param int $id * @return Response */ public function destroy($id) { $business_id = request()->session()->get('user.business_id'); $can_access_all_leads = auth()->user()->can('crm.access_all_leads'); $can_access_own_leads = auth()->user()->can('crm.access_own_leads'); if (! (auth()->user()->can('superadmin') || $this->moduleUtil->hasThePermissionInSubscription($business_id, 'crm_module')) || ! ($can_access_all_leads || $can_access_own_leads)) { abort(403, 'Unauthorized action.'); } if (request()->ajax()) { try { $query = CrmContact::where('business_id', $business_id); if (! $can_access_all_leads && $can_access_own_leads) { $query->OnlyOwnLeads(); } $contact = $query->findOrFail($id); $contact->delete(); $output = [ 'success' => true, 'msg' => __('lang_v1.success'), ]; } catch (\Exception $e) { \Log::emergency('File:'.$e->getFile().'Line:'.$e->getLine().'Message:'.$e->getMessage()); $output = ['success' => false, 'msg' => __('messages.something_went_wrong'), ]; } return $output; } } public function showConvertForm($id) { $business_id = request()->session()->get('user.business_id'); $can_access_all_leads = auth()->user()->can('crm.access_all_leads'); $can_access_own_leads = auth()->user()->can('crm.access_own_leads'); if (! (auth()->user()->can('superadmin') || $this->moduleUtil->hasThePermissionInSubscription($business_id, 'crm_module')) || ! ($can_access_all_leads || $can_access_own_leads)) { abort(403, 'Unauthorized action.'); } $query = CrmContact::where('business_id', $business_id)->where('type', 'lead'); if (! $can_access_all_leads && $can_access_own_leads) { $query->OnlyOwnLeads(); } $contact = $query->findOrFail($id); return view('crm::lead.convert_modal')->with(compact('contact')); } public function convertToCustomer(Request $request, $id) { $business_id = request()->session()->get('user.business_id'); $can_access_all_leads = auth()->user()->can('crm.access_all_leads'); $can_access_own_leads = auth()->user()->can('crm.access_own_leads'); if (! (auth()->user()->can('superadmin') || $this->moduleUtil->hasThePermissionInSubscription($business_id, 'crm_module')) || ! ($can_access_all_leads || $can_access_own_leads)) { abort(403, 'Unauthorized action.'); } try { $request->validate([ 'first_name' => 'required|string|max:191', 'last_name' => 'required|string|max:191', 'supplier_business_name' => 'required|string|max:191', 'email' => 'required|email|max:191', 'mobile' => 'nullable|string|max:191', 'address_line_1' => 'nullable|string|max:191', 'city' => 'nullable|string|max:191', 'state' => 'nullable|string|max:191', 'zip_code' => 'nullable|string|max:191', 'country' => 'nullable|string|max:191', 'tax_number' => 'nullable|string|max:191', ]); $query = CrmContact::where('business_id', $business_id)->where('type', 'lead'); if (! $can_access_all_leads && $can_access_own_leads) { $query->OnlyOwnLeads(); } $contact = $query->findOrFail($id); $input = $request->only([ 'first_name', 'last_name', 'supplier_business_name', 'email', 'mobile', 'address_line_1', 'city', 'state', 'zip_code', 'country', 'tax_number', ]); $input['name'] = trim(implode(' ', array_filter([ $contact->prefix, $input['first_name'], $contact->middle_name, $input['last_name'], ]))); $input['type'] = 'customer'; $input['converted_by'] = auth()->user()->id; $input['converted_on'] = \Carbon::now(); $contact->update($input); $this->commonUtil->activityLog($contact, 'converted', null, ['update_note' => __('crm::lang.converted_from_leads')]); $output = [ 'success' => true, 'msg' => __('crm::lang.lead_converted_successfully'), 'redirect_url' => action([\App\Http\Controllers\ContactController::class, 'show'], [$contact->id]), ]; } catch (\Illuminate\Validation\ValidationException $e) { throw $e; } catch (\Exception $e) { \Log::emergency('File:'.$e->getFile().'Line:'.$e->getLine().'Message:'.$e->getMessage()); $output = [ 'success' => false, 'msg' => __('messages.something_went_wrong'), ]; } return $output; } public function postLifeStage($id) { $business_id = request()->session()->get('user.business_id'); if (! (auth()->user()->can('superadmin') || $this->moduleUtil->hasThePermissionInSubscription($business_id, 'crm_module'))) { abort(403, 'Unauthorized action.'); } if (request()->ajax()) { try { $contact = CrmContact::where('business_id', $business_id)->findOrFail($id); $contact->crm_life_stage = request()->input('crm_life_stage'); $contact->save(); $output = [ 'success' => true, 'msg' => __('lang_v1.success'), ]; } catch (\Exception $e) { \Log::emergency('File:'.$e->getFile().'Line:'.$e->getLine().'Message:'.$e->getMessage()); $output = ['success' => false, 'msg' => __('messages.something_went_wrong'), ]; } return $output; } } public function archive($id) { return $this->toggleLeadArchiveState($id, true); } public function activate($id) { return $this->toggleLeadArchiveState($id, false); } protected function toggleLeadArchiveState($id, $archived) { $business_id = request()->session()->get('user.business_id'); if (! (auth()->user()->can('superadmin') || $this->moduleUtil->hasThePermissionInSubscription($business_id, 'crm_module'))) { abort(403, 'Unauthorized action.'); } if (request()->ajax()) { try { $contact = CrmContact::where('business_id', $business_id)->findOrFail($id); $contact->crm_is_archived = $archived ? 1 : 0; $contact->save(); $output = [ 'success' => true, 'msg' => __('lang_v1.success'), ]; } catch (\Exception $e) { \Log::emergency('File:'.$e->getFile().'Line:'.$e->getLine().'Message:'.$e->getMessage()); $output = [ 'success' => false, 'msg' => __('messages.something_went_wrong'), ]; } return $output; } } }