*/ namespace MillionsMissingFrance\FreescoutRestrictedCustomers\Http\Controllers; use App\Conversation; use Illuminate\Http\Request; use App\Http\Controllers\ConversationsController as BaseConversationsController; use MillionsMissingFrance\FreescoutRestrictedCustomers\Customer; class ConversationsController extends BaseConversationsController { /** * Search. */ public function search(Request $request) { $user = auth()->user(); $conversations = []; $customers = []; $mode = $this->getSearchMode($request); // Search query $q = $this->getSearchQuery($request); // Filters. $filters = $this->getSearchFilters($request); $filters_data = []; // Modify filters is needed. if (!empty($filters['customer'])) { // Get customer name. $filters_data['customer'] = Customer::find($filters['customer']); } //$filters = \Eventy::filter('search.filters', $filters, $filters_data, $mode, $q); // Remember recent query. $recent_search_queries = session('recent_search_queries') ?? []; if ($q && !in_array($q, $recent_search_queries)) { array_unshift($recent_search_queries, $q); $recent_search_queries = array_slice($recent_search_queries, 0, 4); session()->put('recent_search_queries', $recent_search_queries); } $conversations = []; if (\Eventy::filter('search.is_needed', true, 'conversations')) { $conversations = $this->searchQuery($user, $q, $filters); } // Jump to the conversation if searching by conversation number. if (count($conversations) == 1 && $conversations[0]->number == $q && empty($filters) && !$request->x_embed ) { return redirect()->away($conversations[0]->url($conversations[0]->folder_id)); } $customers = $this->searchCustomers($request, $user); // Dummy folder $folder = $this->getSearchFolder($conversations); // List of available filters. if ($mode == Conversation::SEARCH_MODE_CONV) { $filters_list = \Eventy::filter('search.filters_list', Conversation::$search_filters, $mode, $filters, $q); } else { $filters_list = \Eventy::filter('search.filters_list_customers', Customer::$search_filters, $mode, $filters, $q); } $mailboxes = \Cache::remember('search_filter_mailboxes_'.$user->id, 5, function () use ($user) { return $user->mailboxesCanView(); }); $users = \Cache::remember('search_filter_users_'.$user->id, 5, function () use ($user, $mailboxes) { return \Eventy::filter('search.assignees', $user->whichUsersCanView($mailboxes), $user, $mailboxes); }); $search_mailbox = null; if (isset($filters['mailbox'])) { $mailbox_id = (int)$filters['mailbox']; if ($mailbox_id && in_array($mailbox_id, $mailboxes->pluck('id')->toArray())) { foreach ($mailboxes as $mailbox_item) { if ($mailbox_item->id == $mailbox_id) { $search_mailbox = $mailbox_item; break; } } } } elseif (count($mailboxes) == 1) { $search_mailbox = $mailboxes[0]; } return view('conversations/search', [ 'folder' => $folder, 'q' => $request->q, 'filters' => $filters, 'filters_list' => $filters_list, 'filters_data' => $filters_data, //'filters_list_all' => $filters_list_all, 'mode' => $mode, 'conversations' => $conversations, 'customers' => $customers, 'recent' => session('recent_search_queries'), 'users' => $users, 'mailboxes' => $mailboxes, 'search_mailbox' => $search_mailbox, ]); } /** * Search conversations. */ public function searchCustomers($request, $user) { // Get IDs of mailboxes to which user has access $mailbox_ids = $user->mailboxesIdsCanView(); // Filters $filters = $this->getSearchFilters($request);; // Search query $q = $this->getSearchQuery($request); // Like is case insensitive. $like = '%'.mb_strtolower($q).'%'; // We need to use aggregate function for email to avoid "Grouping error" error in PostgreSQL. $query_customers = Customer::select(['customers.*', \DB::raw('MAX(emails.email)')]) ->groupby('customers.id') ->leftJoin('emails', function ($join) { $join->on('customers.id', '=', 'emails.customer_id'); }) ->where(function ($query) use ($like, $q) { $like_op = 'like'; if (\Helper::isPgSql()) { $like_op = 'ilike'; } $query ->where('customers.first_name', $like_op, $like) ->orwhere('customers.last_name', $like_op, $like) ->orwhere('customers.company', $like_op, $like) ->orwhere('customers.job_title', $like_op, $like) ->orwhere('customers.websites', $like_op, $like) ->orwhere('customers.social_profiles', $like_op, $like) ->orwhere('customers.address', $like_op, $like) ->orwhere('customers.city', $like_op, $like) ->orwhere('customers.state', $like_op, $like) ->orwhere('customers.zip', $like_op, $like) ->orwhere('emails.email', $like_op, $like); $phone_numeric = \Helper::phoneToNumeric($q); if ($phone_numeric) { $query->orWhere('customers.phones', $like_op, '%"'.$phone_numeric.'"%'); } }) // Restrict the query to the Customers the current User is allowed to access. ->whereIn('customers.mailbox_id', $mailbox_ids); if (!empty($filters['mailbox']) && in_array($filters['mailbox'], $mailbox_ids)) { $query_customers->where('customers.mailbox_id', '=', $filters['mailbox']); } $query_customers = \Eventy::filter('search.customers.apply_filters', $query_customers, $filters, $q); return $query_customers->paginate(50); } }