Алина Леонова
25.07.2019
186

Создание и подготовка таблицы для кастомной маршрутизации из IVR в зависимости от региона звонящего

Возникают ситуации, когда в компанию поступают звонки с других регионов, в которых другие часовые пояса. Соответственно, подстроиться под каждый регион не получится, и клиенты будут потеряны. Уведомления на почту о пропущенных звонках или же SMS-уведомления не помогут, так как присутствует шанс перезвонить клиенту в то время, когда в компании будет рабочий день, а у клиента […]

Возникают ситуации, когда в компанию поступают звонки с других регионов, в которых другие часовые пояса. Соответственно, подстроиться под каждый регион не получится, и клиенты будут потеряны. Уведомления на почту о пропущенных звонках или же SMS-уведомления не помогут, так как присутствует шанс перезвонить клиенту в то время, когда в компании будет рабочий день, а у клиента уже будет ночь. Тем более, что на каждый регион Российской Федерации делать отдельную IVR, чтобы клиент мог воспользоваться выбором отдела, в который хочет позвонить, нет смысла. Отсюда возникает вопрос, возможно ли произвести настройку таким образом, чтобы потерять минимальное количество клиентов или же не потерять их вовсе.

В данной статье рассмотрим возможность маршрутизации вызовов из IVR в зависимости от региона звонящего.

Задача

С помощью одной IVR и трёх клавиш донабора произвести маршрутизацию вызовов из IVR с учётом региона звонящего.  Также необходимо учесть, что некоторые звонки распределяются по различным операторам в зависимости от чётности или нечётности дня.

Реализация

Для определения региона звонящего, нужна база соответствия «номер» -> «регион» по РФ.

Для настройки региона звонящего можно воспользоваться статьёй «Определение региона звонящего»

В нашем примере определение региона звонящего на сервере уже настроено, поэтому рассмотрим следующие действия.

Таблица, по которой определяется регион звонящего, выглядит следующим образом:

База регионов

Такая база для нас неудобна. Это обусловлено тем, что маршрутизация вызовов делается по федеральным округам России, которые будут составляться на основе областей, городов, республик и краёв. Также все необходимые при маршрутизации значений тоже удобнее будет хранить в оной базе с регионами. На основе этого перейдём в MySQL (в примере – MariaDB) и создадим новую таблицу. Например, reg_routes.

Предположим, что при нажатии кнопки 1 и 3 вызовы будут распределяться при условии, чётный день или нет, а при нажатии 2 будут вести на один и тот же номер. В таком случае, новая таблица будет содержать следующие значения: region, key1, key1_1, key2, key3, key3_1, district. Соответствовать этим полям будут регион звонящего, назначение (внутренний номер или очередь, на который поступит вызов) и федеральный округ.

Определившись с полями в таблице, выполним команду в консоли MySQL:

CREATE TABLE reg_routes (region varchar(255) NOT NULL PRIMARY KEY, key1 varchar(30), key1_1 varchar(30), key2 varchar(30), key3 varchar(30), key3_1 varchar(30), disctrict varchar(30));

Проверить созданную таблицу можно командой

  DESCRIBE reg_routes;
DESCRIBE reg_routes

Теперь, для заполнения поля region этой таблицы, нужно получить значение поля region из предыдущей таблицы, преобразовать его так, чтобы в значении остался только нужный нам вывод (например, вместо «г. Ижевск|Республика Удмуртская» – «Республика Удмуртская».), и перенести это значение в таблицу reg_routes.

Регионов много, поэтому для заполнения этого поля воспользуемся PHP.

Для начала создадим файл db.php, в котором будет класс для управления базой данных.

<?php
class DB
{
	private $bd;
	function __construct(){
		try{
			$this->bd = new PDO("mysql:host=".HOST.";dbname=".DB_NAME, DB_USER, DB_PASSWORD);
			$this->bd->exec('SET NAMES utf8');
		}  catch(PDOException $e)
		{
			print "Error! Some troubles with connect to database!<br/>";
    		die();
		}
	}
	function query($sql,$arr=null)
	{
		if(!isset($arr))
			$res = $this->bd->query($sql);
		else
		{
			$res = $this->bd->prepare($sql);
			$res->execute($arr);
		}
		return $res;
	}
}
?>

Этот класс нужен для того, чтобы была возможность посылать в базу запросы и получать из неё ответы.

С помощью функции __construct генерируем подключение к базе данных. Здесь же устанавливаем кодировку UTF8 для работы с базой. Далее, с помощью catch, выдаём сообщение “Error! Some troubles with connect to database!» при наличии ошибок подключения к базе данных.

Блок catch используется в целях безопасности, т.к. вместе с исходной ошибкой выводятся данные для подключения.

Также используется функция query. Она служит для передачи запроса в БД и обработки результата.

Далее создаём файл updater.php, который будет заполнять поле region в таблице reg_routes.

<?php
require_once 'db.php';
define('HOST','localhost');
define('DB_NAME','asteriskcdrdb');
define('DB_USER','логин');
define('DB_PASSWORD','пароль');
$db = new DB();
$result = array();
$reg = $db->query("SELECT region FROM tel_codes GROUP BY region");
$reg_arr = $reg->fetchAll(PDO::FETCH_ASSOC);
echo "<pre>";
foreach ($reg_arr as $key => $value) {
	$reg = rtrim($value['region']);
	$len = strlen($reg);
	$pos = strrpos($reg, "|");
	if ($pos === false) $pos = 0;
	else $pos++;
	$region = substr($reg, $pos);
	$result[$region] = 1;
}
$i=0;
foreach ($result as $key => $value) {
	echo "$i => $key\n";
	$i++;
	$db->query("INSERT INTO reg_routes(`region`) VALUES (:key)",array('key' => $key));
}
echo "</pre>";
?>

Прописываем данные для подключения к БД. Далее создаём массив и передаём запрос к БД в массив. С помощью функций работы со строками производим обрезание строки с конца до разделителя (в примере разделитель “|”). Возвращаем полученное значение в поле region. 

Сохраняем эти файлы в отдельной папке в директории /var/www/html. Переходим в браузер и запускаем updater, введя в поисковой строке:

  http://IP-адрес сервера/dbtest/updater.php

где dbtest – имя папки, где сохранены файлы.

Получим вывод:

Заполнение поля region с помощью PHP

Убедиться в том, что таблица создана можно, введя в консоли MySQL запрос, который покажет текущую таблицу полностью:

  SELECT * FROM reg_routes;

Теперь сопоставим регион звонящего с федеральным округом РФ и на основе этого заполним поле district. Сделаем это также с помощью updater.php.

Для начала создадим новый файл reg.php и заполним в нём массив, исходя из ‘ключ’ => ‘значение’, где ключ – регион звонящего, а значение – федеральный округ. В нашем примере вышло 166 элементов массива. Далее переходим в updater.php и после объявления переменной $db пропишем следующий код:

$action = (isset($_REQUEST['action'])) ? $_REQUEST['action'] : '';
if ($action == 'up_district')
{
	require_once 'reg.php';
	foreach ($arr as $key => $value) {
		$upd = $db->query("UPDATE reg_routes SET `district`=:district WHERE `region`=:region",array('district' => $value, 'region' => $key));
	}
	echo "district updated\n";
	exit;
}

Он отвечает за заполнение поля district в таблице reg_routes.

Переходим в браузер и в поисковой строке прописываем:

  http://IP-адрес сервера/dbtest/updater.php?action=up_district

При успешном выполнении скрипта получим в браузере сообщение: «district updated». После этого также можно посмотреть содержимое всей таблицы – заполнены будут поля region и district.

Для того, чтобы полностью заполнить таблицу, осталось заполнить поля key1, key1_1, … , key3_1. Их заполнять будем вручную, с помощью запросов в консоли MySQL. Заполнение будет производиться по полю district.  

В качестве примера заполним эти поля по Северо-Западному Федеральному Округу (district=’СЗФО’):

  UPDATE reg_routes SET key1=’ 1541’, key1_1=’1541’, key2=’3925’, key3=’ 1339’, key3_1=’1337’ WHERE district=’СЗФО’;

Соответственно все регионы, принадлежащие к СЗФО получат в качестве значений key1, key1_1, … , key3_1 то, что мы прописали в запросе к БД.

После того, как с помощью запросов заполним всю таблицу, проверим, всё ли заполнилось. После выполнения запроса, описанного выше (для просмотра всей таблицы), получим таблицу подобного вида:

Таблица reg_routes

На этом подготовка таблицы для маршрутизации вызовов завершена. Последующие действия будут описаны в статье: «Кастомная маршрутизация из IVR в зависимости от региона звонящего».

 
avatar
  Подписаться  
Уведомление о

Остались вопросы?

Я - Першин Артём, менеджер компании Voxlink. Хотите уточнить детали или готовы оставить заявку? Укажите номер телефона, я перезвоню в течение 3-х секунд.

VoIP оборудование

ближайшие курсы

ближайшие Вебинары

ONLINE

Why Choose HUGE?

Unlimited pre-designed elements

Each and every design element is designed for retina ready display on all kind of devices

User friendly interface and design

Each and every design element is designed for retina ready display on all kind of devices

100% editable layered PSD files

Each and every design element is designed for retina ready display on all kind of devices

Created using shape layers

Each and every design element is designed for retina ready display on all kind of devices