Администраторы группы

  • Аватар

Модераторы группы

  • Аватар

Интеграция Vtiger CRM

Открытая группа активность: 2 нед., 5 дн. назад

Обсуждаем вопросы использования интеграции SalesPlatform Vtiger CRM с другими системами: Asterisk, 1С и др., а также использование Клиентского портала.

Интеграция Elastix 4 + AsteriskConnector 1.4.2 [РЕШЕНО] (записей: 14)

← Форум группы   Все форумы
  • Аватар Николай - 1 г., 7 мес. назад:

    Добрый день!
    Есть ли у кого-то опыт интеграции Elastix 4 с AsteriskConnect 1.4.2 (Vtiger 7)

    Имеется:
    elastix 4.0.0 (freePBX 2.11.0 + asterisk 11.20.0)
    vtiger CRM 7.0.1-201711 (salesplatform)
    Asterisk Connector 1.4.2

    Настроил все по инструкции кроме правки диалплана (так как такого контекста нету)

    Результат: исходящие работают (по вызову из CRM)
    Контекст указан from-internal

    Проблема: вызовы не фиксируются в модуле звонков (даже исходящие)
    ну и при входящем карточка вызова не всплывает

  • Аватар Николай - 1 г., 7 мес. назад:

    Почти разобрался! Вызовы начали отображаться в модуле звонков (был неверно указан адрес crm)!

    Уважаемые форумчане, подскажите как внести изменения в контекст для отображения записи разговоров?
    extensions_override_elastix.conf выглядит так

    [macro-hangupcall]
    include => macro-hangupcall-custom

    ; Validar si el archivo de MixMon existe. Puede no existir si la llamada cuelga
    ; del lado origen antes que el destino conteste (Elastix bug #422)
    exten => s,1,GotoIf($["${CDR(recordingfile)}" = ""]?endmixmoncheck)
    ; Este codigo es fragil. Actualizar si se averigua la manera de consultar AST_MONITOR_DIR
    exten => s,n,Set(MIXMON_CALLFILENAME=${ASTSPOOLDIR}/monitor/${CALLFILENAME}.${MIXMON_FORMAT})
    exten => s,n,GotoIf($["${MIXMON_DIR}" = ""]?defaultmixmondir)
    exten => s,n,Set(MIXMON_CALLFILENAME=${MIXMON_DIR}${CALLFILENAME}.${MIXMON_FORMAT})
    exten => s,n(defaultmixmondir),System(test -e ${MIXMON_CALLFILENAME})
    exten => s,n,Noop(SYSTEMSTATUS = ${SYSTEMSTATUS})
    exten => s,n,GotoIf($["${SYSTEMSTATUS}" = "SUCCESS"]?endmixmoncheck)
    ; Si archivo MixMon no existe, se anula CDR(recordingfile)
    exten => s,n,Set(CDR(recordingfile)=)
    exten => s,n(endmixmoncheck),Noop(End of MIXMON check)

    ; Validar si existe el archivo de grabacion de MeetMe. Puede que el archivo de
    ; grabacion sea distinto del especificado en el contexto, porque solo obedece
    ; la asignacion del primer conferencista que entra a la conferencia.
    exten => s,n,GotoIf($["${MEETME_RECORDINGFILE}" = ""]?nomeetmemon)
    exten => s,n,GotoIf($["${MEETME_ACTUAL_RECORDINGFILE}" = ""]?nomeetmemon)
    ; Revisar si existe ${MEETME_ACTUAL_RECORDINGFILE}.${MIXMON_FORMAT}
    exten => s,n,Set(MEETME_REAL_TESTFILE=${MEETME_ACTUAL_RECORDINGFILE}.${MIXMON_FORMAT})
    exten => s,n,Set(MEETME_ALIAS_TESTFILE=${MEETME_RECORDINGFILE}.${MIXMON_FORMAT})
    exten => s,n,System(test -e ${MEETME_REAL_TESTFILE})
    exten => s,n,Noop(SYSTEMSTATUS = ${SYSTEMSTATUS})
    exten => s,n,GotoIf($["${SYSTEMSTATUS}" = "SUCCESS"]?meetmemonexists)
    ; Revisar si existe ${MEETME_ACTUAL_RECORDINGFILE}.wav
    exten => s,n,Set(MEETME_REAL_TESTFILE=${MEETME_ACTUAL_RECORDINGFILE}.wav)
    exten => s,n,Set(MEETME_ALIAS_TESTFILE=${MEETME_RECORDINGFILE}.wav)
    exten => s,n,System(test -e ${MEETME_REAL_TESTFILE})
    exten => s,n,Noop(SYSTEMSTATUS = ${SYSTEMSTATUS})
    exten => s,n,GotoIf($["${SYSTEMSTATUS}" = "SUCCESS"]?meetmemonexists)
    exten => s,n,Goto(nomeetmemon)
    exten => s,n(meetmemonexists),Noop(MEETME recording is ${MEETME_REAL_TESTFILE})
    ; Revisar si MEETME_ACTUAL_RECORDINGFILE difiere de MEETME_RECORDINGFILE
    exten => s,n,GotoIf($["${MEETME_RECORDINGFILE}" = "${MEETME_ACTUAL_RECORDINGFILE}"]?meetmeskiplink)
    exten => s,n,Noop(Hardlinking ${MEETME_REAL_TESTFILE} to ${MEETME_ALIAS_TESTFILE})
    exten => s,n,System(ln ${MEETME_REAL_TESTFILE} ${MEETME_ALIAS_TESTFILE})
    exten => s,n(meetmeskiplink),Set(CDR(recordingfile)=${MEETME_ALIAS_TESTFILE})
    exten => s,n(nomeetmemon),Noop(End of MEETME check)

    ; Validar si existe el archivo de grabacion bajo demanda para la extension
    exten => s,n,GotoIf($["${TOUCH_MONITOR_OUTPUT}" = ""]?noautomon)
    exten => s,n,GotoIf($["${TOUCH_MONITOR_FORMAT}" = ""]?noautomonformat)
    exten => s,n,Set(CDR(recordingfile)=${TOUCH_MONITOR_OUTPUT}.${TOUCH_MONITOR_FORMAT})
    exten => s,n,Goto(noautomon)
    exten => s,n(noautomonformat),Set(CDR(recordingfile)=${TOUCH_MONITOR_OUTPUT}.wav)
    exten => s,n(noautomon),Noop(TOUCH_MONITOR_OUTPUT=${TOUCH_MONITOR_OUTPUT})

    ; Validar si existe el archivo de grabacion de la cola
    exten => s,n,GotoIf($["${MONITOR_FILENAME}" = ""]?noautomon2)
    exten => s,n,System(test -e ${MONITOR_FILENAME}*)
    exten => s,n,Noop(SYSTEMSTATUS = ${SYSTEMSTATUS})
    exten => s,n,GotoIf($["${SYSTEMSTATUS}" = "APPERROR"]?errornoautomon)
    exten => s,n,Set(CDR(recordingfile)=${MONITOR_FILENAME})
    exten => s,n(errornoautomon),Noop(End of MONITOR QUEUE check)
    exten => s,n(noautomon2),Noop(MONITOR_FILENAME=${MONITOR_FILENAME})

    ; Validar nombre de archivo de grabacion bajo demanda en FreePBX 2.11
    exten => s,n,GotoIf($["${MIXMONITOR_FILENAME}" = ""]?noautomon3)
    exten => s,n,System(test -e ${MIXMONITOR_FILENAME}*)
    exten => s,n,Noop(SYSTEMSTATUS = ${SYSTEMSTATUS})
    exten => s,n,GotoIf($["${SYSTEMSTATUS}" = "APPERROR"]?errornoautomon2)
    exten => s,n,Set(CDR(recordingfile)=${MIXMONITOR_FILENAME})
    exten => s,n(errornoautomon2),Noop(End of MIXMONITOR_FILENAME check)
    exten => s,n(noautomon3),Noop(MIXMONITOR_FILENAME=${MIXMONITOR_FILENAME})

    ; Validar si existe el archivo de grabacion bajo demanda en FreePBX 2.11 sin ruta
    exten => s,n,GotoIf($["${ONETOUCH_RECFILE}" = ""]?noautomon4)
    exten => s,n,Set(CDR(recordingfile)=${ONETOUCH_RECFILE})
    exten => s,n(noautomon4),Noop(ONETOUCH_RECFILE=${ONETOUCH_RECFILE})

    exten => s,n(start),GotoIf($["${USE_CONFIRMATION}"="" | "${RINGGROUP_INDEX}"="" | "${CHANNEL}"!="${UNIQCHAN}"]?skiprg)
    exten => s,n,Noop(Cleaning Up Confirmation Flag: RG/${RINGGROUP_INDEX}/${CHANNEL})
    exten => s,n(delrgi),Noop(Deleting: RG/${RINGGROUP_INDEX}/${CHANNEL} ${DB_DELETE(RG/${RINGGROUP_INDEX}/${CHANNEL})})
    exten => s,n(skiprg),GotoIf($["${BLKVM_BASE}"="" | "BLKVM/${BLKVM_BASE}/${CHANNEL}"!="${BLKVM_OVERRIDE}"]?skipblkvm)
    exten => s,n,Noop(Cleaning Up Block VM Flag: ${BLKVM_OVERRIDE})
    exten => s,n(delblkvm),Noop(Deleting: ${BLKVM_OVERRIDE} ${DB_DELETE(${BLKVM_OVERRIDE})})
    exten => s,n(skipblkvm),GotoIf($["${FMGRP}"="" | "${FMUNIQUE}"="" | "${CHANNEL}"!="${FMUNIQUE}"]?theend)
    exten => s,n(delfmrgp),Noop(Deleting: FM/DND/${FMGRP}/${CHANNEL} ${DB_DELETE(FM/DND/${FMGRP}/${CHANNEL})})
    exten => s,n(theend),AGI(hangup.agi)
    exten => s,n,Hangup

    [macro-record-enable]
    include => macro-record-enable-custom
    exten => s,1,GotoIf($["${BLINDTRANSFER}" = ""]?check)
    exten => s,n,ResetCDR(w)
    exten => s,n,StopMixMonitor()
    exten => s,n(check),ExecIf($["${ARG1}"=""]?MacroExit())
    exten => s,n,GotoIf($["${ARG2}"="Group"]?Group:OUT)
    exten => s,n(Group),Set(LOOPCNT=${FIELDQTY(ARG1,-)})
    exten => s,n,Set(ITER=1)
    exten => s,n(begin),GotoIf($["${CUT(DB(AMPUSER/${CUT(ARG1,-,${ITER})}/recording),=,3)}" != "Always"]?continue)
    exten => s,n,Set(TEXTEN=${CUT(ARG1,-,${ITER})})
    exten => s,n,Noop(Recording enable for ${TEXTEN})
    exten => s,n,Set(CALLFILENAME=g${TEXTEN}-${STRFTIME(${EPOCH},,%Y%m%d-%H%M%S)}-${UNIQUEID})
    exten => s,n,Goto(record)
    exten => s,n(continue),Set(ITER=$[${ITER}+1])
    exten => s,n,GotoIf($[${ITER} s,n(OUT),GotoIf($["${ARG2}"="IN"]?IN)
    exten => s,n,ExecIf($["${CUT(DB(AMPUSER/${ARG1}/recording),|,1):4}" != "Always"]?MacroExit())
    exten => s,n,Noop(Recording enable for ${ARG1})
    exten => s,n,Set(CALLFILENAME=OUT${ARG1}-${STRFTIME(${EPOCH},,%Y%m%d-%H%M%S)}-${UNIQUEID})
    exten => s,n,Goto(record)
    exten => s,n(IN),ExecIf($["${CUT(DB(AMPUSER/${ARG1}/recording),|,2):3}" != "Always"]?MacroExit())
    exten => s,n,Noop(Recording enable for ${ARG1})
    exten => s,n,Set(CALLFILENAME=${STRFTIME(${EPOCH},,%Y%m%d-%H%M%S)}-${UNIQUEID})
    exten => s,n(record),MixMonitor(${MIXMON_DIR}${CALLFILENAME}.${MIXMON_FORMAT},,${MIXMON_POST})
    exten => s,n,Set(CDR(recordingfile)=${CALLFILENAME}.${MIXMON_FORMAT})
    exten => s,n,MacroExit()

  • Аватар Николай - 1 г., 7 мес. назад:

    нашел контексты, которые надо было поправить по инструкции
    они лежат в extensions_additional.conf, внес изменения

    в консоли появилась директория патч
    — Executing [record@sub-record-check:4] Set(«SIP/system-0000008a», «CDR(recordingfile)=exten-103-79122355635-20180206-123702-1517899013.244.wav») in new stack
    — Executing [record@sub-record-check:5] Set(«SIP/system-0000008a», «CDR(recordingpath)=/var/spool/asterisk/monitor/2018/02/06/exten-103-79122355635-20180206-123702-1517899013.244.wav») in new stack

    но в модуле звонков – записи нет

  • Аватар Николай - 1 г., 7 мес. назад:

    Коллеги может кто готов помочь за $ ?
    Большая часть функционала работает! Надо добить немного, но в контекстах понять не могу

  • Аватар Александр - 1 г., 5 мес. назад:

    Вам удалось?
    Tоже Elastix 4 + AsteriskConnector 1.4.2 , звоники входящие отображаються в модуле звонков, всплывают карточкой, но звонить из СРМ не получается, записи звуков не слышны, есть только картинка плеера.

  • Аватар Николай - 1 г., 4 мес. назад:

    Да, получилось!
    На самом деле все работает «из коробки», чтоб работали исходящие в нашем случае не хватало вписать внешний ID номера в карточке пользователя в CRM
    По записям – все очень просто, где то не поправили extensions

  • Аватар Александр - 1 г., 4 мес. назад:

    Что то не соображу – это что «ID номера в карточке пользователя в CRM» и это где ?

  • Аватар Николай - 1 г., 4 мес. назад:

    внешний номер (СID) передаваемый через определенный транк!
    в случае с elastix указывается в конкретном транке либо в правили исходящих звонков.
    в случае с CRM указывается в строке тел. пользователя системы!

  • Аватар Александр - 1 г., 4 мес. назад:

    Я верно понимаю, что в CRM в
    строке тел. пользователя системы у всех прописывается один CID транка ? Я то думал , что внутренние номера.

  • Аватар Николай - 1 г., 4 мес. назад:

    Да верно! Ну если CID один! Если несколько то можно разные, соответственно исходящие тоже за разными CID пойдут. Внутренние номера в отдельной строке так и называется внутренний номер

  • Аватар Александр - 1 г., 4 мес. назад:

    Ох и тормозной я, ничего не понимаю.
    Итак номер сипнета 12345, транк 1, все звонят через него.
    Всех 10-12 человек.
    Есть у пользователя в карточке:
    Tел. ,
    Моб, тел,
    Дом. тел. ,
    Внутренний тел.,
    Другой тел.
    И что, внутренние у каждого свой,
    а Тел. = CID транка ,т.е 12345?

  • Аватар Василий - 1 г., 3 мес. назад:

    Я вот разобрался в конце-концов с отображением и регистрацией звонков – но не могу их прослушать из CRM – на папку со звуковыми файлами выставил разрешение 777, в карточке «Звонки» – указывается факт звонка, все номера, продолжительность – но плеер не работает. Куда еще копнуть?

  • Аватар Александр - 1 г., 3 мес. назад:

    Ха , у меня даже появились некоторые на прослушку, но не все, и стал вешаться интерфейс «Звонки». Прищлось поотключать. В Elastixe все записи есть, слушаются.
    Да , и звонить из Crm не получается. Без денег , и немалых, очевидно сие чудо не заведешь – смиритесть :D

  • Аватар george - 9 мес., 3 нед. назад:

    Настраивал коннектор для FreePBX, с убил уйму времени….
    могу помочь если кто натолкнется на эту тему (безвозмездно, кто сам страдал, скорей поймет другого)
    у меня только входящие записи не доступны для прослушивания из ЦРМ и окошко вызова в ЦРМ в углу не появляется. Всё остальное поднял