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

Создание и подготовка таблицы для кастомной маршрутизации из 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 в зависимости от региона звонящего».

Книга 101 функция Asterisk
Познакомьтесь с возможностями Asterisk. Найдите инструменты, которые помогут вашей компании развиваться.
Скачать книгу
Подписаться
Уведомить о
guest
0 комментариев
Межтекстовые Отзывы
Посмотреть все комментарии

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

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

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


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

10 доводов в пользу Asterisk

Распространяется бесплатно.

Asterisk – программное обеспечение с открытым исходным кодом, распространяется по лицензии GPL. Следовательно, установив один раз Asterisk вам не придется дополнительно платить за новых абонентов, подключение новых транков, расширение функционала и прочие лицензии. Это приближает стоимость владения станцией к нулю.

Безопасен в использовании.

Любое программное обеспечение может стать объектом интереса злоумышленников, в том числе телефонная станция. Однако, сам Asterisk, а также операционная система, на которой он работает, дают множество инструментов защиты от любых атак. При грамотной настройке безопасности у злоумышленников нет никаких шансов попасть на станцию.

Надежен в эксплуатации.

Время работы серверов некоторых наших клиентов исчисляется годами. Это значит, что Asterisk работает несколько лет, ему не требуются никакие перезагрузки или принудительные отключения. А еще это говорит о том, что в районе отличная ситуация с электроэнергией, но это уже не заслуга Asterisk.

Гибкий в настройке.

Зачастую возможности Asterisk ограничивает только фантазия пользователя. Ни один конструктор шаблонов не сравнится с Asterisk по гибкости настройки. Это позволяет решать с помощью Asterisk любые бизнес задачи, даже те, в которых выбор в его пользу не кажется изначально очевидным.

Имеет огромный функционал.

Во многом именно Asterisk показал какой должна быть современная телефонная станция. За многие годы развития функциональность Asterisk расширилась, а все основные возможности по-прежнему доступны бесплатно сразу после установки.

Интегрируется с любыми системами.

То, что Asterisk не умеет сам, он позволяет реализовать за счет интеграции. Это могут быть интеграции с коммерческими телефонными станциями, CRM, ERP системами, биллингом, сервисами колл-трекинга, колл-бэка и модулями статистики и аналитики.

Позволяет телефонизировать офис за считанные часы.

В нашей практике были проекты, реализованные за один рабочий день. Это значит, что утром к нам обращался клиент, а уже через несколько часов он пользовался новой IP-АТС. Безусловно, такая скорость редкость, ведь АТС – инструмент зарабатывания денег для многих компаний и спешка во внедрении не уместна. Но в случае острой необходимости Asterisk готов к быстрому старту.

Отличная масштабируемость.

Очень утомительно постоянно возвращаться к одному и тому же вопросу. Такое часто бывает в случае некачественного исполнения работ или выбора заведомо неподходящего бизнес-решения. С Asterisk точно не будет такой проблемы! Телефонная станция, построенная на Asterisk может быть масштабируема до немыслимых размеров. Главное – правильно подобрать оборудование.

Повышает управляемость бизнеса.

Asterisk дает не просто набор полезных функций, он повышает управляемость организации, качества и комфортности управления, а также увеличивает прозрачность бизнеса для руководства. Достичь этого можно, например, за счет автоматизации отчетов, подключения бота в Telegram, санкционированного доступа к станции из любой точки мира.

Снижает расходы на связь.

Связь между внутренними абонентами IP-АТС бесплатна всегда, независимо от их географического расположения. Также к Asterisk можно подключить любых операторов телефонии, в том числе GSM сим-карты и настроить маршрутизацию вызовов по наиболее выгодному тарифу. Всё это позволяет экономить с первых минут пользования станцией.