diff --git a/src/core/controllers/AutoCompleteController.php b/src/core/controllers/AutoCompleteController.php index 2c930ce2279f7d8b86bd9cdb1de1b88adf263d4e..f5af51a290709f05d80d5909bd93a24e10f8ab12 100755 --- a/src/core/controllers/AutoCompleteController.php +++ b/src/core/controllers/AutoCompleteController.php @@ -39,6 +39,8 @@ use User\models\UserModel; use Folder\models\FolderModel; use Folder\controllers\FolderController; use MessageExchange\controllers\AnnuaryController; +use Parameter\models\ParameterModel; +use Contact\models\ContactAddressSectorModel; class AutoCompleteController { @@ -691,14 +693,63 @@ class AutoCompleteController public static function getBanAddresses(Request $request, Response $response) { $data = $request->getQueryParams(); - $check = Validator::stringType()->notEmpty()->validate($data['address']); $check = $check && Validator::stringType()->notEmpty()->validate($data['department']); if (!$check) { return $response->withStatus(400)->withJson(['errors' => 'Bad Request']); } - $customId = CoreConfigModel::getCustomId(); + $data['address'] = TextFormatModel::normalize(['string' => str_replace(['*', '~', '-', '\'', '"', '(', ')', ';', '/', '\\'], ' ', $data['address'])]); + $addressWords = explode(' ', $data['address']); + foreach ($addressWords as $key => $value) { + if (mb_strlen($value) <= 2 && !is_numeric($value)) { + unset($addressWords[$key]); + continue; + } + } + $data['address'] = implode(' ', $addressWords); + if (empty($data['address'])) { + return $response->withJson([]); + } + + $useSectors = ParameterModel::getById(['id' => 'useSectorsForAddresses', 'select' => ['param_value_int']]); + if (!empty($useSectors['param_value_int']) && $useSectors['param_value_int'] == 1) { + $addressFieldNames = ['address_number', 'address_street', 'address_postcode', 'address_town']; + $fields = AutoCompleteController::getInsensitiveFieldsForRequest([ + 'fields' => $addressFieldNames + ]); + $requestData = AutoCompleteController::getDataForRequest([ + 'search' => $data['address'], + 'fields' => $fields, + 'fieldsNumber' => count($addressFieldNames), + 'where' => [], + 'data' => [] + ]); + $hits = ContactAddressSectorModel::get([ + 'select' => ['address_number', 'address_street', 'address_postcode', 'address_town', 'label', 'ban_id'], + 'where' => $requestData['where'], + 'data' => $requestData['data'], + 'orderBy' => ['id desc'], + 'limit' => 100 + ]); + $addresses = []; + foreach ($hits as $hit) { + $addresses[] = [ + 'banId' => $hit['ban_id'], + 'lon' => null, + 'lat' => null, + 'number' => $hit['address_number'], + 'afnorName' => $hit['address_street'], + 'postalCode' => $hit['address_postcode'], + 'city' => $hit['address_town'], + 'address' => "{$hit['address_number']} {$hit['address_street']}, {$hit['address_town']} ({$hit['address_postcode']})", + 'sector' => $hit['label'] + ]; + } + return $response->withJson($addresses); + } + + $customId = CoreConfigModel::getCustomId(); if (is_dir("custom/{$customId}/referential/ban/indexes/{$data['department']}")) { $path = "custom/{$customId}/referential/ban/indexes/{$data['department']}"; } elseif (is_dir('referential/ban/indexes/' . $data['department'])) { @@ -714,23 +765,7 @@ class AutoCompleteController $index = \Zend_Search_Lucene::open($path); \Zend_Search_Lucene::setResultSetLimit(100); - $data['address'] = str_replace(['*', '~', '-', '\''], ' ', $data['address']); - $aAddress = explode(' ', $data['address']); - foreach ($aAddress as $key => $value) { - if (mb_strlen($value) <= 2 && !is_numeric($value)) { - unset($aAddress[$key]); - continue; - } - if (mb_strlen($value) >= 3 && $value != 'rue' && $value != 'avenue' && $value != 'boulevard') { - $aAddress[$key] .= '*'; - } - } - $data['address'] = implode(' ', $aAddress); - if (empty($data['address'])) { - return $response->withJson([]); - } - - $hits = $index->find(TextFormatModel::normalize(['string' => $data['address']])); + $hits = $index->find($data['address']); $addresses = []; foreach ($hits as $key => $hit) {