SalesPlatform vtiger crm 620 Менеджер PBX

Материал из SalesPlatform Wiki
Перейти к: навигация, поиск

Главная страница руководства


Содержание

Краткий обзор

Asterisk® — свободное решение компьютерной телефонии, с открытым исходным кодом от компании Digium. Asterisk является программной реализацией PBX(Private Business eXchange). С помощью интеграции Asterisk с системой 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 для возможности использования коннектора.


Vt caution.png Внимание: в текущей версии коннектора необходимо чтобы он функционировал на том же сервере, что и Asterisk. В противном случае прослушка звонков в CRM будет невозможна. На другие функциональные возможности это требование не влияет.


Логика функционирования

Функционирование коннектора сводится к прослушке событий AMI интерфейса. При поступлении определенного события, на основании его названия и параметров производятся сохранение информации о происходящем звонке в локальном хранилище коннектора и передача необходимой информации в SalesPlapform Vtiger CRM. Ниже приводится соответствие AMI-событий этапам звонка:


Кроме того, есть возможность осуществлять звонок по нажатию на номер телефона в карточке клиента в CRM - при этом в коннектор из CRM передается соответствующий запрос, по которому он отправляет управляющее сообщение в Asterisk для начала звонка. При этом, для фиксации звонка в CRM не обязательно нажимать на номер в карточке - можно производить набор прямо с телефона и звонок все равно будет зафиксирован.

Установка

Необходимы требования для установки:

Для установки необходимо скачать 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


Далее необходимо настроить права на каталоги и файлы:

Запуск/останов

Запуск коннектора сводится к запуску на исполнение скрипта bin/start.sh в каталоге инсталляции коннектора. Останов коннектора сводится к запуску скрипта bin/stop.sh.


Vt note.png Примечание Для автоматического запуска коннектора при старте системы можно прописать необходимую команду в /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 либо не устанавливайте ссылку на файл в опциональное пользовательское поле.


Vt caution.png Внимание: Директория, указанная в команде 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 -> Конфигурация сервера".

Рис. 20.1: Менеджер PBX Настройки


2) В новом появившемся окне следует ввести информацию о Asterisk Connector.

Рис. 20.2: Настройки Asterisk Connector


Vt tip.png Совет: Значения вводимых вами полей уточните у системного администратора.

3) Для того, чтобы пользователь CRM имел доступ к функциям модуля интеграции с IP-телефонией, в его личных настройках должен быть указан номер внутренней линии SIP. Это можно осуществить в разделе “Мои настройки”:

Рис. 20.3: Мои Настройки


Vt caution.png Внимание: Звонки сохраняются в CRM только для тех номеров, у которых есть соответствие с Пользователями системы. Если номер в Asterisk не назначен ни одному Пользователю в Vtiger, то входящие и исходящие звонки на этот номер не будут регистрироваться в системе.

История звонков

Для просмотра истории звонков записи (например Контакта) необходимо перейти в детальный вид записи и нажать на ссылку Менеджер PBX в правой части экрана.

Рис. 20.4: История звонков контакта


В истории звонков отображаются все входящие и исходящие звонки контакта, выполненные через IP-АТС Asterisk и связанные с внутренними номерами пользователей CRM.
Детальный вид звонка выглядит следующим образом:

Рис. 20.5: Детальный вид звонка


Осуществление вызова через CRM

Осуществление исходящего вызова выполняется автоматически при нажатии на номер телефона в карточке Обращения, Контрагента или Контакта. Сразу после нажатия в правом углу окна браузера отображается всплывающее окно:

Рис. 20.6: Исходящий звонок


При этом звонит внутренний SIP-телефон пользователя CRM. При снятии трубки SIP-телефона вызов автоматически перенаправляется на вызываемого абонента и фиксируется в истории звонков. Кроме того, можно осуществлять вызов просто набрав номер на телефоне - звонок все равно зафиксируется.

Vt important.png Важно: Для осуществления исходящего звонка по клику на номер, у текущего пользователя должен быть введен внутренний номер CRM. В противном случае такое действие приведет к ошибке.

Уведомления о входящих звонках

При поступлении входящего звонка на внутренний SIP-телефон пользователя CRM в правом углу окна браузера отображается всплывающее окно. В случае, если абонент найден в базе данных CRM, во всплывающем окне отображается имя звонящего, ответственный за запись и имя пользователя crm, кому предназначен звонок с возможностью перейти на карточку Обращения/Контрагента/Клиента с подробной информацией.

Рис. 20.7: Входящий звонок от существующего абонента в crm


Vt important.png Важно: В дистрибутиве SalesPlatform была изменена логика показа - всплывающее окно показывается только тому пользователю, которому адресован звонок, а не всем как в дистрибутиве Vtiger CRM.

Vt note.png Примечание В дистрибутиве SalesPlatform Vtiger CRM исправлена логика определения клиента по номеру - если длинна номера телефона больше или равна 10 цифрам, то сравнение идет по этим 10 цифрам (Например: +79117775390 и 89117775390 будут идентичны), если длина номера меньше 10 цифр используется точное сравнение номеров. В дистрибутиве Vtiger CRM сравнение производится по части номера, поэтому, к примеру входящий звонок с номер 600 может быть отнесен к клиенту, у которого номер телефона 6000000.

В случае, если абонент не найден в базе данных CRM, во всплывающем окне можно создать запись о звонящем абоненте.

Рис. 20.8: Входящий звонок от не существующего абонента в crm



Главная страница руководства

Личные инструменты
Пространства имён
Варианты
Действия
Навигация
Документация
Разработчикам
Присоединяйтесь!
Инструменты