SalesPlatform vtiger crm 600 Менеджер PBX
Содержание |
Краткий обзор
Asterisk® — свободное решение компьютерной телефонии, с открытым исходным кодом от компании Digium. Asterisk является программной реализацией PBX(Private Business eXchange). С помощью интеграции Asterisk с системой vtiger CRM вы сможете:
- Осуществлять звонки, выбрав карточку клиента в системе vtiger CRM;
- Уведомить пользователя при входящем звонке(всплывающее окно в нижнем углу экрана);
- Посмотреть историю звонков;
- Связать телефонный звонок с Контактом/Контрагентом или Обращением;
- Прослушивать записи звонков;
Интеграция с Vtiger осуществляется через промежуточное приложение Vtiger Asterisk Connector, которое представляет из себя серверное приложение, осуществляющее взаимодействие с Asterisk через AGI-интерфейс, а с Vtiger – через HTTP. Из-за использования AGI интерфейса данное приложение ограничивает гибкость в создании правил дозвона Asterisk, так как ключевая часть логики сосредоточена в AGI скрипте и не может быть изменена. Кроме того, существуют определенные проблемы при использовании Vtiger Asterisk Connector(проблемы с идентификацией номера, нет возможности использования UI-оболочек Asterisk таких как FreePBX и др.)
Альтернативным вариантом интеграции является использование SalesPlatform Vtiger Asterisk Connector. Отличительной чертой этого приложения является то, что используется прослушка AMI интерфейса, без вмешательства в логику работы самого Asterisk, что позволяет настроить любые конфигурации (в отличии от "родного" коннектора) и, кроме того, можно использовать графическую оболочку FreePBX. При этом полностью сохранена функциональность "родного" коннектора. Кроме того, исправлены ошибки, присутствующие в оригинальном Vtiger Asterisk Connector. Подробно логика функционирования этого приложения, настройка (в том числе и для FreePBX) описана в разделе Настройка SalesPlatform Asterisk Connector.
Дистрибутив SalesPlatform Vtiger CRM совместим с двумя версиями коннекторов (дистрибутив Vtiger CRM не совместим с SalesPlatform Vtiger Asterisk Connector). Кроме того модифицирована логика показа всплывающих окон и добавлена возможность ввода дополнительных внутренних номеров CRM для которых нет возможности указать их в карточке модуля Пользователи. Подробнее о отличиях от исходного дистрибутива можно ознакомиться в разделе Настройка Менеджера PBX.
Настройка Vtiger Asterisk Connector
Подробная настройка приложения описана на сайте Vtiger: https://wiki.vtiger.com/vtiger6/index.php/Asterisk_Integration
Настройка SalesPlatform Asterisk Connector
SalesPlatform Asterisk Connector представляет из себя серверное приложение. Для удобства, структура каталогов, конфигурационных файлов и логика запуска/останова приложения аналогична Vtiger Asterisk Connector. В этом разделе описывается логика функционирования приложения, установка, настройка конфигурационных файлов и приводятся настройки Asterisk для поддержки записи разговоров и приводится пример настройки FreePBX для возможности использования коннектора.
Внимание: в текущей версии коннектора необходимо чтобы он функционировал на том же сервере, что и Asterisk. В противном случае прослушка звонков в CRM будет невозможна. На другие функциональные возможности это требование не влияет.
Логика функционирования
Функционирование коннектора сводится к прослушке событий AMI интерфейса. При поступлении определенного события, на основании его названия и параметров производятся сохранение информации о происходящем звонке в локальном хранилище коннектора и передача необходимой информации в SalesPlapform Vtiger CRM. Ниже приводится соответствие AMI-событий этапам звонка:
- Начало звонка - соответствует событию Dial. Из этого события извлекаются номер звонящего и номер того, кому адресован звонок. Эта информация передается в CRM, где производится обработка этой информации, определение направления звонка и извещение пользователя всплывающим окном.
- Поднята трубка - соответствует событию Bridge. Из этого события извлекается информация о том, что соединение между абонентами было установлено, и передается далее в CRM. CRM при получении этой информации меняет статус звонка с "ringing" на "in-progress"
- Разговор завершен - соответствует событию HangUp. Из этого события извлекается информация о том, как был завершен разговор (занято, нет ответа, нормальное завершение и т.п). На основании этой информации CRM меняет статус звонка.
- Детали звонка - соответствует событию CDR. Из этого события извлекаются детали звонка (длительность разговора, общая продолжительность, статус и опционально - ссылка на запись разговора). На основании этой информации в CRM производится обновление деталей звонка.
Кроме того, есть возможность осуществлять звонок по нажатию на номер телефона в карточке клиента в CRM - при этом в коннектор из CRM передается соответствующий запрос, по которому он отправляет управляющее сообщение в Asterisk для начала звонка. При этом, для фиксации звонка в CRM не обязательно нажимать на номер в карточке - можно производить набор прямо с телефона и звонок все равно будет зафиксирован.
Установка
Необходимы требования для установки:
- JDK/JRE версии 1.7+
- Asterisk 1.8 или Asterisk 11
Для установки необходимо скачать SalesPlatform Vtiger Asterisk Connector. После этого необходимо разархивировать его в директорию, из которой он будет запускаться.
Настройка
Настройка сводится к вводу требуемых значений в конфигурационные файлы, назначению прав на запуск и доступа к определенным файлам и каталогам.
В папке с приложением заполните файл conf/SPVtigerAsteriskConnector.properties
Поле | Описание |
---|---|
ServerIP | IP адрес, на котором будет запущено приложение (например 0.0.0.0) |
ServerPort | Порт, на котором будет запущено приложение (например: 5000) |
AsteriskAppDBPath | Путь до папки, в которой будет храниться SQLite база данных (например: /var/lib/asteriskConnector) |
AsteriskServerIP | IP адрес, на котором запущен Asterisk (например: 127.0.0.1) |
AsteriskServerPort | Порт, который слушает AMI-интерфейс, задается в файле manager.conf Asterisk (например: 5038) |
AsteriskUsername | Пользователь, указанный в конфигурационном файле Asterisk manager.conf |
AsteriskPassword | Пароль пользователя, указанный в manager.conf |
VtigerURL | URL адрес Вашей vtiger (например: http://localhost/vtiger610) |
VtigerSecretKey | Скопируйте сюда значение Секретный ключ в настройках Менеджера PBX Vtiger |
Далее необходимо настроить права на каталоги и файлы:
- Пользователь, от имени которого будет запущен коннектор, должен иметь права на чтение/запись в директорию, указанную в параметре AsteriskAppDBPath.
- Файлы в директории приложения /bin должны быть доступны на запуск.
- Директория /log должна быть доступна на чтение/запись для пользователя, запустившего коннектор.
- Все остальные файлы в директории приложения должны быть доступны на чтение.
Запуск/останов
Запуск коннектора сводится к запуску на исполнение скрипта bin/start.sh в каталоге инсталляции коннектора. Останов коннектора сводится к запуску скрипта bin/stop.sh.
Примечание
Для автоматического запуска коннектора при старте системы можно прописать необходимую команду в /etc/rc.local
После запуска, протоколирование работы производится в директории коннектора в папке logs. Для каждого нового запуска создается новый файл лога. Все ошибки и предупреждения записываются в лог-файл. При этом степень детализации логирования можно изменить - для этого необходимо в файле source/log4j.properties изменить уровень логирования с WARN на требуемый (в соответствии с уровнями log4j), после чего для вступления изменений в силу необходимо перезапустить коннектор.
Настройка Asterisk для поддержки прослушки звонков в CRM
Для активации прослушки звонков в Asterisk, необходимо внести определенные правки в конфигурационные файлы Asterisk. Эти правки создают дополнительное пользовательское поле в событии CDR, в котором указывается ссылка на файл записи разговора. Ссылка на файл записи задается в плане набора. Ниже приводятся примеры изменений в конфигурационных файлах и простейший план набора.
Добавление пользователя AMI и назначение прав - файл manager.conf:
[general] enabled = yes ;разрешить соединения port = 5038 ;на каком порту bindaddr = 127.0.0.1 ;на каком адресе ;учетная запись для AMI интерфейса - может быть несколько [admin] ;логин secret = admin ;пароль deny = 0.0.0.0/0.0.0.0 ;из каких сетей запрещено соединение - если требуется несколько то необходимо добавить несколько таких записей permit = 127.0.0.1/255.255.255.0 ;из каких сетей разрешено соединение - если требуется несколько то необходимо добавить несколько таких записей read = system,call,log,verbose,command,agent,user,config,command,dtmf,reporting,cdr,dialplan,originate ;доступные события AMI на чтение write = system,call,log,verbose,command,agent,user,config,command,dtmf,reporting,cdr,dialplan,originate ;доступные события AMI на запись
Активация CDR и добавление пользовательской переменной - файл cdr_manager.conf:
[general] enabled = yes [mappings] recordingpath => recordingpath ;пользовательская переменная, в которой в диалплане указывается путь к файлу записи разговора
Добавление ссылки на звонок в плане набора (примитивный пример, используйте тот диалплан, который необходим вам) - файл extensions.conf:
[vtiger] exten = _X.,1,Set(CALLFILENAME=${STRFTIME(${EPOCH},,OUT_%d%m%Y_%H-%M)}_${CALLERID(num)}_${EXTEN}) exten = _X.,2,MixMonitor(/var/spool/asterisk/monitor/${CALLFILENAME}.wav,b) exten = _X.,3,Set(CDR(recordingpath)=/var/spool/asterisk/monitor/${CALLFILENAME}.wav) exten = _X.,4,Dial(SIP/${EXTEN})
Запись звонка производится непосредственно исходя из правил набора. Если вам не нужна эта возможность или вы не хотите осуществлять прослушку через CRM - не вводите в план набора MixMonitor либо не устанавливайте ссылку на файл в опциональное пользовательское поле.
Внимание: Директория, указанная в команде MixMonitor дожна быть доступна для Asterisk на запись, а для SalesPlatform Vtiger Asterisk Connector на чтение. Иначе Asterisk не сможет создать файл записи разговора, а коннектор прочитать его при попытке прослушки из CRM.
Настройка FreePBX для поддержки прослушки звонков в CRM
Настройка аналогична настройке Asterisk (необходимо включить CDR, AMI и внести пользовательскую переменную). Однако, для задания значения пользовательской переменной-ссылке на файл записи необходимо внести изменения в макросы FreePBX, ответственные за запись звонка. В разных версия FreePBX эти макросы могут называться по разному. Для переопределения макросов, необходимо скопировать их содержимое в extensions_override_freepbx.conf и добавить в правилах установку ссылки. Ниже приводится пример переопределения для FreePBX версии 2.11 (внесенные изменения помечены комментарием SalesPlatform):
[macro-parked-call] exten => s,1,AGI(parkfetch.agi,${ARG1}) exten => s,n,GotoIf($["${REC_STATUS}" != "RECORDING"]?next) exten => s,n,Set(AUDIOHOOK_INHERIT(MixMonitor)=yes) exten => s,n,Set(CDR(recordingfile)=${CALLFILENAME}.${MON_FMT}) exten => s,n,Set(CDR(recordingpath)=${ASTSPOOLDIR}/monitor/${MIXMON_DIR}${YEAR}/${MONTH}/${DAY}/${CALLFILENAME}.${MON_FMT}) ;SalesPlatform override exten => s,n,MixMonitor(${MIXMON_DIR}${YEAR}/${MONTH}/${DAY}/${CALLFILENAME}.${MIXMON_FORMAT},a,${MIXMON_POST}) exten => s,n(next),Set(CCSS_SETUP=TRUE) exten => s,n,Macro(user-callerid,) exten => s,n,GotoIf($["${ARG1}" = "" | ${DIALPLAN_EXISTS(${IF($["${ARG2}" = "default"]?parkedcalls:${ARG2})},${ARG1},1)} = 1]?pcall) exten => s,n,ResetCDR() exten => s,n,NoCDR() exten => s,n,Wait(1) exten => s,n,Playback(pbx-invalidpark) exten => s,n,Wait(1) exten => s,n,Hangup exten => s,n(pcall),Noop(User: ${CALLERID(all)} attempting to pick up Parked Call Slot ${ARG1}) exten => s,n,ParkedCall(${ARG1},${ARG2}) exten => h,1,Macro(hangupcall,) [parkedcallstimeout] exten => _[0-9a-zA-Z*#].,1,Set(PARK_TARGET=${EXTEN}) exten => _[0-9a-zA-Z*#].,n,GotoIf($["${REC_STATUS}" != "RECORDING"]?next) exten => _[0-9a-zA-Z*#].,n,Set(AUDIOHOOK_INHERIT(MixMonitor)=yes) exten => _[0-9a-zA-Z*#].,n,MixMonitor(${MIXMON_DIR}${YEAR}/${MONTH}/${DAY}/${CALLFILENAME}.${MIXMON_FORMAT},a,${MIXMON_POST}) exten => _[0-9a-zA-Z*#].,n,Set(CDR(recordingpath)=${ASTSPOOLDIR}/monitor/${MIXMON_DIR}${YEAR}/${MONTH}/${DAY}/${CALLFILENAME}.${MON_FMT}) ;SalesPlatform override exten => _[0-9a-zA-Z*#].,n(next),Goto(park-return-routing,${PARKINGSLOT},1) [sub-record-cancel] exten => s,1,Set(__REC_POLICY_MODE=${REC_POLICY_MODE_SAVE}) exten => s,n,ExecIf($["${REC_STATUS}"!="RECORDING"]?Return()) exten => s,n,StopMixMonitor() exten => s,n,Set(__REC_STATUS=) exten => s,n,Set(MON_BASE=${IF($[${LEN(${MIXMON_DIR})}]?${MIXMON_DIR}:${ODASTSPOOLDIR}/monitor/)}${YEAR}/${MONTH}/${DAY}/) exten => s,n,Set(__MON_FMT=${IF($[${LEN(${MIXMON_FORMAT})}]?${IF($["${MIXMON_FORMAT}"="wav49"]?WAV:${MIXMON_FORMAT})}:wav)}) exten => s,n,ExecIf($[${LEN(${CALLFILENAME})} & ${STAT(f,${MON_BASE}${CALLFILENAME}.${MON_FMT})}]?System(rm -f ${MON_BASE}${CALLFILENAME}.${MON_FMT})) exten => s,n,Set(__CALLFILENAME=) exten => s,n,Set(CDR(recordingfile)=) exten => s,n,Set(CDR(recordingpath)=) ;SalesPlatform override exten => s,n,Return() [sub-record-check] exten => s,1,Set(REC_POLICY_MODE_SAVE=${REC_POLICY_MODE}) exten => s,n,GotoIf($["${BLINDTRANSFER}" = ""]?check) exten => s,n,ResetCDR() exten => s,n,GotoIf($["${REC_STATUS}" != "RECORDING"]?check) exten => s,n,Set(AUDIOHOOK_INHERIT(MixMonitor)=yes) exten => s,n,MixMonitor(${MIXMON_DIR}${YEAR}/${MONTH}/${DAY}/${CALLFILENAME}.${MIXMON_FORMAT},a,${MIXMON_POST}) exten => s,n(check),Set(__MON_FMT=${IF($["${MIXMON_FORMAT}"="wav49"]?WAV:${MIXMON_FORMAT})}) exten => s,n,GotoIf($["${REC_STATUS}"!="RECORDING"]?next) exten => s,n,Set(CDR(recordingfile)=${CALLFILENAME}.${MON_FMT}) exten => s,n,Set(CDR(recordingpath)=${ASTSPOOLDIR}/monitor/${MIXMON_DIR}${YEAR}/${MONTH}/${DAY}/${CALLFILENAME}.${MON_FMT}) ;SalesPlatform override exten => s,n,Return() exten => s,n(next),ExecIf($[!${LEN(${ARG1})}]?Return()) exten => s,n,ExecIf($["${REC_POLICY_MODE}"="" & "${ARG3}"!=""]?Set(__REC_POLICY_MODE=${ARG3})) exten => s,n,GotoIf($["${REC_STATUS}"!=""]?${ARG1},1) exten => s,n,Set(__REC_STATUS=INITIALIZED) exten => s,n,Set(NOW=${EPOCH}) exten => s,n,Set(__DAY=${STRFTIME(${NOW},,%d)}) exten => s,n,Set(__MONTH=${STRFTIME(${NOW},,%m)}) exten => s,n,Set(__YEAR=${STRFTIME(${NOW},,%Y)}) exten => s,n,Set(__TIMESTR=${YEAR}${MONTH}${DAY}-${STRFTIME(${NOW},,%H%M%S)}) exten => s,n,Set(__FROMEXTEN=${IF($[${LEN(${AMPUSER})}]?${AMPUSER}:${IF($[${LEN(${REALCALLERIDNUM})}]?${REALCALLERIDNUM}:unknown)})}) exten => s,n,Set(__CALLFILENAME=${ARG1}-${ARG2}-${FROMEXTEN}-${TIMESTR}-${UNIQUEID}) exten => s,n,Goto(${ARG1},1) exten => rg,1,GosubIf($["${REC_POLICY_MODE}"="always"]?record,1(${EXTEN},${REC_POLICY_MODE},${FROMEXTEN})) exten => rg,n,Return() exten => force,1,GosubIf($["${REC_POLICY_MODE}"="always"]?record,1(${EXTEN},${REC_POLICY_MODE},${FROMEXTEN})) exten => force,n,Return() exten => q,1,GosubIf($["${REC_POLICY_MODE}"="always"]?recq,1(${EXTEN},${ARG2},${FROMEXTEN})) exten => q,n,Return() exten => out,1,ExecIf($["${REC_POLICY_MODE}"=""]?Set(__REC_POLICY_MODE=${DB(AMPUSER/${FROMEXTEN}/recording/out/external)})) exten => out,n,GosubIf($["${REC_POLICY_MODE}"="always"]?record,1(exten,${ARG2},${FROMEXTEN})) exten => out,n,Return() exten => exten,1,GotoIf($["${REC_POLICY_MODE}"!=""]?callee) exten => exten,n,Set(__REC_POLICY_MODE=${IF($[${LEN(${FROM_DID})}]?${DB(AMPUSER/${ARG2}/recording/in/external)}:${DB(AMPUSER/${ARG2}/recording/in/internal)})}) exten => exten,n,GotoIf($["${REC_POLICY_MODE}"="dontcare"]?caller) exten => exten,n,GotoIf($["${DB(AMPUSER/${FROMEXTEN}/recording/out/internal)}"="dontcare" | "${FROM_DID}"!=""]?callee) exten => exten,n,ExecIf($[${LEN(${DB(AMPUSER/${FROMEXTEN}/recording/priority)})}]?Set(CALLER_PRI=${DB(AMPUSER/${FROMEXTEN}/recording/priority)}):Set(CALLER_PRI=0)) exten => exten,n,ExecIf($[${LEN(${DB(AMPUSER/${ARG2}/recording/priority)})}]?Set(CALLEE_PRI=${DB(AMPUSER/${ARG2}/recording/priority)}):Set(CALLEE_PRI=0)) exten => exten,n,GotoIf($["${CALLER_PRI}"="${CALLEE_PRI}"]?${REC_POLICY}:${IF($[${CALLER_PRI}>${CALLEE_PRI}]?caller:callee)}) exten => exten,n(callee),GosubIf($["${REC_POLICY_MODE}"="always"]?record,1(${EXTEN},${ARG2},${FROMEXTEN})) exten => exten,n,Return() exten => exten,n(caller),Set(__REC_POLICY_MODE=${DB(AMPUSER/${FROMEXTEN}/recording/out/internal)}) exten => exten,n,GosubIf($["${REC_POLICY_MODE}"="always"]?record,1(${EXTEN},${ARG2},${FROMEXTEN})) exten => exten,n,Return() exten => conf,1,Gosub(recconf,1(${EXTEN},${ARG2},${ARG2})) exten => conf,n,Return() exten => page,1,GosubIf($["${REC_POLICY_MODE}"="always"]?recconf,1(${EXTEN},${ARG2},${FROMEXTEN})) exten => page,n,Return() exten => record,1,Set(AUDIOHOOK_INHERIT(MixMonitor)=yes) exten => record,n,MixMonitor(${MIXMON_DIR}${YEAR}/${MONTH}/${DAY}/${CALLFILENAME}.${MIXMON_FORMAT},,${MIXMON_POST}) exten => record,n,Set(__REC_STATUS=RECORDING) exten => record,n,Set(CDR(recordingfile)=${CALLFILENAME}.${MON_FMT}) exten => record,n,Set(CDR(recordingpath)=${ASTSPOOLDIR}/monitor/${MIXMON_DIR}${YEAR}/${MONTH}/${DAY}/${CALLFILENAME}.${MON_FMT}) ;SalesPlatform override exten => record,n,Return() exten => recq,1,Set(AUDIOHOOK_INHERIT(MixMonitor)=yes) exten => recq,n,Set(MONITOR_FILENAME=${MIXMON_DIR}${YEAR}/${MONTH}/${DAY}/${CALLFILENAME}) exten => recq,n,MixMonitor(${MONITOR_FILENAME}.${MIXMON_FORMAT},${MONITOR_OPTIONS},${MIXMON_POST}) exten => recq,n,Set(__REC_STATUS=RECORDING) exten => recq,n,Set(CDR(recordingfile)=${CALLFILENAME}.${MON_FMT}) exten => recq,n,Set(CDR(recordingpath)=${ASTSPOOLDIR}/monitor/${MIXMON_DIR}${YEAR}/${MONTH}/${DAY}/${CALLFILENAME}.${MON_FMT}) ;SalesPlatform override exten => recq,n,Return() exten => recconf,1,Set(__CALLFILENAME=${IF($[${MEETME_INFO(parties,${ARG2})}]?${DB(RECCONF/${ARG2})}:${ARG1}-${ARG2}-${ARG3}-${TIMESTR}-${UNIQUEID})}) exten => recconf,n,ExecIf($[!${MEETME_INFO(parties,${ARG2})}]?Set(DB(RECCONF/${ARG2})=${CALLFILENAME})) exten => recconf,n,Set(MEETME_RECORDINGFILE=${IF($[${LEN(${MIXMON_DIR})}]?${MIXMON_DIR}:${ASTSPOOLDIR}/monitor/)}${YEAR}/${MONTH}/${DAY}/${CALLFILENAME}) exten => recconf,n,Set(MEETME_RECORDINGFORMAT=${MIXMON_FORMAT}) exten => recconf,n,ExecIf($["${REC_POLICY_MODE}"!="always"]?Return()) exten => recconf,n,Set(__REC_STATUS=RECORDING) exten => recconf,n,Set(CDR(recordingfile)=${CALLFILENAME}.${MON_FMT}) exten => recconf,n,Set(CDR(recordingpath)=${ASTSPOOLDIR}/monitor/${MIXMON_DIR}${YEAR}/${MONTH}/${DAY}/${CALLFILENAME}.${MON_FMT}) ;SalesPlatform override exten => recconf,n,Return()
Настройка Менеджера PBX
Для использования возможностей IP-телефонии необходимо настроить Менеджер PBX.
Для это выполните шаги, представленные ниже:
1) Зайдите в меню Настройки → Менеджер Модулей и нажмите на иконку "Менеджер PBX -> Конфигурация сервера".
2) В новом появившемся окне следует ввести информацию о Asterisk Connector.
Совет: Значения вводимых вами полей уточните у системного администратора.
3) Для того, чтобы пользователь CRM имел доступ к функциям модуля интеграции с IP-телефонией, в его личных настройках должен быть указан номер внутренней линии SIP. Это можно осуществить в разделе “Мои настройки”:
Ввод дополнительных внутренних номеров
В случае, если есть внутренние номера, для которых нет возможности указать пользователей в CRM, необходимо внести их в файле config.inc.php (в корне директории инсталляции CRM) в параметр $crm_user_phones. В противном случае возможны ситуации, когда определение направления вызова будет неверно - так как направление определяется по соответствию номера звонящего внутренним номерам CRM. Если такое соответствие найдено, то звонок считается исходящим, в противном случае входящим.
Например вот так выглядит добавление двух внутренних номеров 100 и 101, которым не соответствует ни один пользователь в CRM:
$crm_user_phones = array(100, 101);
Но при звонке с этих номеров направление вызова будет определяться корректно.
История звонков
Для просмотра истории звонков записи (например Контакта) необходимо перейти в детальный вид записи и нажать на ссылку Менеджер PBX в правой части экрана.
В истории звонков отображаются все входящие и исходящие звонки контакта, выполненные через IP-АТС Asterisk и связанные с внутренними номерами пользователей CRM.
Детальный вид звонка выглядит следующим образом:
Осуществление вызова через CRM
Осуществление исходящего вызова выполняется автоматически при нажатии на номер телефона в карточке Обращения, Контрагента или Контакта. Сразу после нажатия в правом углу окна браузера отображается всплывающее окно:
При этом звонит внутренний SIP-телефон пользователя CRM. При снятии трубки SIP-телефона вызов автоматически перенаправляется на вызываемого абонента и фиксируется в истории звонков.
Кроме того, можно осуществлять вызов просто набрав номер на телефоне - звонок все равно зафиксируется.
Важно: Для осуществления исходящего звонка по клику на номер, у текущего пользователя должен быть введен внутренний номер CRM. В противном случае такое действие приведет к ошибке.
Уведомления о входящих звонках
При поступлении входящего звонка на внутренний SIP-телефон пользователя CRM в правом углу окна браузера отображается всплывающее окно. В случае, если абонент найден в базе данных CRM, во всплывающем окне отображается имя звонящего, ответственный за запись и имя пользователя crm, кому предназначен звонок с возможностью перейти на карточку Обращения/Контрагента/Клиента с подробной информацией.
Важно: В дистрибутиве SalesPlatform была изменена логика показа - всплывающее окно показывается только тому пользователю, которому адресован звонок, а не всем как в дистрибутиве Vtiger CRM.
Примечание
В дистрибутиве SalesPlatform Vtiger CRM исправлена логика определения клиента по номеру - если длинна номера телефона больше или равна 10 цифрам, то сравнение идет по этим 10 цифрам (Например: +79117775390 и 89117775390 будут идентичны), если длина номера меньше 10 цифр используется точное сравнение номеров. В дистрибутиве Vtiger CRM сравнение производится по части номера, поэтому, к примеру входящий звонок с номер 600 может быть отнесен к клиенту, у которого номер телефона 6000000.
В случае, если абонент не найден в базе данных CRM, во всплывающем окне можно создать запись о звонящем абоненте.