freescout-restricted-customers/src/Http/Controllers/ConversationsController.php

174 lines
5.7 KiB
PHP
Raw Normal View History

<?php
/*
2024-07-06 16:56:09 +00:00
SPDX-License-Identifier: AGPL-3.0-only
SPDX-FileCopyrightText: © 2024 Millions Missing FRANCE <info@millionsmissing.fr>
*/
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->join('conversations', function ($join) use ($filters) {
$join->on('conversations.customer_id', '=', 'customers.id');
//$join->on('conversations.mailbox_id', '=', $filters['mailbox']);
});
$query_customers->where('conversations.mailbox_id', '=', $filters['mailbox']);
}
$query_customers = \Eventy::filter('search.customers.apply_filters', $query_customers, $filters, $q);
return $query_customers->paginate(50);
}
}