Возникла у меня необходимость установки связки: Asterisk + CRM + Интеграция. С установкой Asterisk и FreePBX на Ubuntu проблем не возникло. Отличная статья с пошаговыми инструкциями и картинками, справится даже новичок.
Но вот когда дело дошло до установки CRM и попыток дружбы оной с Астером, у меня начали клочками выпадать волосы на голове. Сначала я думал, что эта задача так же проста, как и установка Ubuntu+Asteris+FreePBX. Но уже через несколько дней понял, что нормальных мануалов, а у же тем более нормальных бесплатных моделей просто нет. Так компания у нас не большая и покупать что-либо желания нет. Пришлось купить по кускам разные мануалы, посты, статьи и методом проб и ошибок устанавливать и интегрировать CRM с Астером.
Выбирал из 3-х (Сахар, вТигр и Сюит) и свой выбор остановил на SuiteCRM (остальные не прошли проверку на прочность и совместимость с модулями интеграции С Астером).
В этой статье я собственно и хочу поделится опытом установки и интеграции SuiteCRM с Астериском. Тот, кто уже установил SuiteCRM, и она успешно работает, можем смело пролистывать часть с установкой и переходить к интеграции.
Установка SuiteCRM
Открываем терминал и коннектимся к нашему Ubuntu Server под root'ом.
1. Для начала перейдите в html каталог (у меня, например /var/www/html, а у вас может быть другой):
cd /var/www/html
2. Скачиваем архив с последней версией CRM (на момент написания статьи это была 7.5):
wget https://github.com/salesagility/SuiteCRM/archive/v7.5.tar.gz
3. Распаковываем архив:
tar zxvf v7.5.tar.gz
4. Переименовываем каталог (для удобства, что бы не писать потом длинный адрес в строке браузера):
mv SuiteCRM-7.5 crm
5. Назначаем права нового каталога:
chmod -R 775 crm
chmod -R a+wr crm
6. Открываем в браузере страницу наш_сервер/crm и приступаем к настройке.
7. Читаем и соглашаемся с лицензионным соглашением, нажимаем Next:
8. Делаем пару глотков чая и съедаем одну печенюшку, пока система проверит «почву» на которой будет расти.
9. CRM все проверила и ей все подходит. Жмем Next:
Если ругается на IMAP Module, то просто устанавливаем его:
sudo apt-get install php5-imap
sudo php5enmod imap
sudo service apache2 restart
10. Заполняете все необходимые поля:
Если хотите, чтобы в CRM сразу были демонстрационные данные, то Choose Demo Data -> Populate Database with Demo Data? -> Yes.
11. Идем допивать чай и доедать печенюшки пока система все установит и настроит:
12. Система установлена и готова к работе. Вводим логи и пароль главной администратора и наживаем Log In:
13. Ура. Система работает. Дальше курим гайды как ею пользоваться.
Перейдем к этапу, который мне сносил
Интеграция с Asterisk посредством Callinize — community Edition
Скажу сразу, что бесплатного решения этой задачи «из коробки» нет. Я потратил несколько дней на то, чтобы перепробовать все CRM в комбинациях со всеми доступными бесплатными модулями интеграции: все вариации нерабочие. Какие-то я пытался допилить руками, какие-то удалял сразу после установки. В общем, эту статью я, собственно, и собрался писать, чтобы сэкономить кому-то время и нервы.
У меня стояли следующие задачи: Необходимо, чтобы из CRM можно было прямо из окна браузера позвонить одним кликом мыши. Чтобы при звонке (входящем/исходящем) сразу в окне браузера CRM показывала карточку клиента с необходимой информацией. Все это необходимо было сделать для облегчения работы сэйлов моей компании.
Я остановил свой выбор (вернее не остановил выбор, а методом проб и ошибок выяснил, что это самый рабочий вариант) на «Callinize — community Edition». Не знаю, можно ли скачать бесплатную версию с их сайта , я не нашел. Где-то в дебрях паутины я наткнулся на OpenSourсe yaai-Callinize и скачал его. Где скачал уже не помню, да и для того, чтобы пакет встал на SuiteCRM, пришлось немного допилить его внутренности.
Итак: «скальпель, сестра, приступим»:
Установка модуля
1. Качаем отсюда модуль;
2. Заходим в нашу CRM и переходим в раздел Administrator -> Admin -> Module Loader;
3. Выбираем файл модуля, который скачали и нажимаем Upload;
4. Когда файл загрузится и отобразится в нижнем окошке, кликаем Install на нашем модуле:
5. Читаем и принимаем соглашение и нажимаем Commit:
6. Ждем пока установится модуль и нажимаем Back to Module Loader:
Это все присказка была, а вот теперь начинается самый сок — нам нужно подружить всех разом Asterisk, CRM и Yaai. Спасибо Хабру за запрет на использование в статьях ненормативной лексики, а то бы я сейчас написал, что я думаю про всех разработчиков модуля!
Настройка нашего модуля
1. Создадим менеджера Астера, под которым будет работать наш модуль, для этого правим manager.conf:
nano /etc/asterisk/manager.conf
добавим в файл эти строки и сохраним файл
[yaai]
secret = пароль_менеджера_yaai
deny=0.0.0.0/0.0.0.0
permit=127.0.0.1/255.255.255.0
read = all
; ^--- on some systems you can get away with just "call,hud"
write = originate,system,call
После чего перезапускаем Asterisk, чтобы он прочитал новые настройки:
asterisk -rx "module reload manager"
2. Далее настроим наш модуль. Идем в окно браузера с нашей CRM и открываем Administratir -> Admin -> листаем в самый низ, находим пункт раздел «Callinize — Asterisk SugarCRM Integration» и кликаем «Module Configuration»:
3. Введем логин и пароль менеджера:
Asterisk Manager Login — yaai
Asterisk Manager Secret — пароль, который вы указали в manager.conf
И SOAP:
SugarCRM Soap-User — admin
SugarCRM Soap-Pass — пароль, который вы указывали для суперадминистратора при установке SugarCRM
Остальные значения пока не трогаем, жмем Save:
4. Идем Administratir -> Admin -> Studio.
Раздел Modules листаем вниз. Находим папку «User», раскрываем ее, раскрываем папку «Layouts», кликаем «EditView». В правом окне у нас откроется шаблон настроек пользователя, в который мы должны будем кое-что добавить:
Для начала перетягиваем «New Panel», на нее кидаем «New Row». Затем на поля (filler) перетягиваем 3 значения: Personal Extension, Magic Dial Buttons, Call Notification. Кликаем Save & Deploy. Должно получится вот так:
5. Идем в Administratir -> Admin -> User Manager.
Кликаем на пользователя (я буду настраивать Administrator), в открывшемся окне жмем Edit. Увидим, что панель, которую мы добавляли в п.4, теперь появилась тут и можно заполнять поля. В поле Personal Extension(s) прописываем внутренний номер пользователя (я надеюсь, что во FreePBX вы уже создали Extension, который хотите присвоить пользователю во SuitCRM, например, у меня уже есть внутренний номер 1001, его я и присвою Administrator). Ставим галки Magic Dial Buttons, Call Notification и жмем Save:
И вот тут первый косяк. Не знаю почему, но при первом сохранении настроек пропадает меню CRM. Будем это лечить правкой CSS кода.
nano /var/www/html/crm/custom/modules/Asterisk/include/css/asterisk.css
ищем блок ".dropdown-menu LI" и убираем "display: none; "
Меню полечили.
6. Открываем терминал и запускаем скрипт:
cd /var/www/html/crm/custom/modules/Asterisk
php asteriskLogger.php
Если у вас скрипт в конце вывел на экран следующее «Waiting for call events...»:
[Asterisk Manager Interface (AMI) Connection]
Successfully opened socket connection to 127.0.0.1:5038
AMI Version Info:
```
Asterisk Call Manager/2.8.0
```
AMI Login action raw response:
```
Response: Success
Message: Authentication accepted
```
AMI Login was a *success!*
Waiting for call events...
Заначит вы все сделали правильно.
Если лезут ошибки, значит вы где-то не внимательно читали/выполняли пункты инструкции!
7. Давайте проверим. В нашей CRM создадим контакт, например, Markenig -> Contacts -> Create. Заполняем First Name, Last Name, и главное Office Phone — тут пишем номер телефона, на который будем сейчас звонить, чтобы протестировать исходящие звонки из CRM. Жмем Save:
8. И вот что мы видим:
Нажимаем на зеленую трубочку и — о чудо! — звонит наш внутренний телефон, после того, как мы снимем трубку, Астериск будет звонить на номер, который был возле зеленой трубки и соединит нас. Ура. Исходящие работают.
НО! У нас нет всплывающей карточки клиента при звонке. Она должна появляться в окне CRM при исходящем/входящем звонке и отображать инфо о контрагенте. Будем лечить это. Потому что эта «фишка» нам очень нужна.
Итак, сначала нам необходимо скачать handlebars.runtime.js:
cd /var/www/html/crm/custom/modules/Asterisk/include/javascript/
wget http://builds.handlebarsjs.com.s3.amazonaws.com/handlebars.min-latest.js
mv handlebars.min-latest.js handlebars.runtime.js
Теперь будем править callPopups.js:
nano callPopups.js
находим строку template = Handlebars.templates['call-template.html'];
и заменяем ее на
var source = '<div id="{{callbox_id}}" class="callbox"><div class="callboxhead"><div class="callboxtitle">{{title}}</div><div class="callboxoptions"><a href="#" class="callbox_close">X</a></div></div><div class="control_panel"><button class="transfer_panel"></button><button class="operator_panel"></button><!--<button class="callbox_action" data-dropdown="#dropdown-1_{{callbox_id}}"></button>--><button class="callbox_action"></button></div><div id="dropdown-1_{{callbox_id}}" class="dropdown-menu has-tip dropdown-hidden"> <!-- left: 746px; top: 631px; display: block; --><ul><li class="ul_relate_to_contact"><a href="#" class="relate_to_contact">{{relate_to_contact_label}}</a></li><li class="ul_relate_to_account"><a href="#" class="relate_to_account">{{relate_to_account_label}}</a></li><li class="ul_create_contact"><a href="#" class="create_contact">{{create_new_contact_label}}</a></li></ul></div><div class="callboxcontent"><div class="asterisk_info"><h4 class="call_type">{{call_type}}</h4><div><table class="asterisk_data"><tr class="multiplematchingcontacts"><td colspan="2"><b>{{select_contact_label}}</b>{{#each beans}}<p class="select_contact" id="contact_{{bean_id}}"><input type="radio" name="contactSelect" class={{bean_module}} value={{bean_id}} /><a class="multiplecontacts" title="{{parent_name}}" href={{bean_link}}>{{bean_name}}</a></p>{{/each}}</td></tr><tr class="singlematchingcontact"><td>{{name_label}}</td><td><a class="contact_id" href="{{bean_link}}"><span class="call_contacts">{{bean_name}}</span></a><!-- <button class="unrelate_contact"></button> --></td></tr><tr class="parent_name_box"><td>{{company_label}}</td><td><a class="company" href="{{parent_link}}">{{parent_name}}</a></td></tr><tr class="caller_id_box"><td class="caller_id_label">{{caller_id_label}}:</td><td class="caller_id">{{caller_id}}</td></tr><tr class="phone_number_box"><td class="phone_number_label">{{phone_number_label}}:</td><td class="phone_number">{{phone_number}}</td></tr><tr class="call_duration_box"><td class="call_duration_label">{{duration_label}}:</td><td><span class="call_duration">{{duration}}</span></td></tr><!--<tr class="call_time_box">--><!--<td class="call_time_label">{{call_time_label}}:</td>--><!--<td>--><!--<span class="call_duration">{{call_time}}</span>--><!--</td>--><!--</tr>--></table></div></div></div><div class="callboxinput"><textarea rows="4" cols="30" class="callboxtextarea callboxtextareaselected"></textarea><div class="callboxbuttons"><table width="100%"><tbody><tr><td valign="bottom"><button class="save_memo">{{save_label}}</button></td></tr></tbody></table></div></div><form class="call_record_id" name="{{call_record_id}}"><input type="hidden" name="relateContactId"/><input type="hidden" name="relateContactFirstName"/><input type="hidden" name="relateContactLastName"/><input type="hidden" name="relateAccountId"/><input type="hidden" name="relateAccountName"/></form></div>';
var template = Handlebars.compile(source);
Все готово. Окна появляются, звонки идут. Теперь настроим автозагрузку asteriskLogger.php:
wget https://raw.github.com/blak3r/yaai/master/misc/asterisk_logger
mv asterisk_logger /etc/init.d/
chmod 755 /etc/init.d/asterisk_logger
chmod 755 /etc/init.d/functions
Отредактируем asterisk_logger:
nano +34 /etc/init.d/asterisk_logger
ищем строку . /lib/lsb/init-functions и заменяем ее на /etc/init.d/functions
Проверим:
/etc/init.d/asterisk_logger start
Если все хорошо, и не лезут ошибки, включаем автозагрузку:
chkconfig --add asterisk_logger
chkconfig asterisk_logger on
Автор: frundik