SalesPlatform vtiger crm 640 Техническое руководство

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

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



Содержание

Миграция с предыдущих версий

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

Миграция представляет собой процесс, при котором вы можете обновить установленную версию vtiger CRM до последней версии.

Бэкап данных

1). Сделайте бэкап папки, в которую установлена систем vtiger CRM.

2). Сделайте бэкап базы данных.

mysqldump -u(mysql_username) -p(mysql-password) -P(mysql_port) database_name > dump_filename.sql


Процесс миграции

Первым делом необходимо определиться какая версия SalesPlatform Vtiger у Вас установлена. Посмотреть номер текущей версии можно, например, открыв файл vtigerversion.php находящийся в папке с исходным кодом системы.

Далее, в зависимости от Вашей версии Vtiger нажмите на ссылку ниже:

Vt note.png Примечание
Для *nix ОС не забудьте перед запуском миграции добавить полные права веб-серверу на запись в директорию с установленной системой.
Vt note.png Примечание
Начиная с версии 6.2.0-201505 в папке с установленной системой после миграции создается лог-файл - migration_log.txt, в котором содержится подробный протокол миграции.
Vt note.png Примечание
Если в процессе миграции появилась надпись «Invalid request», то, не закрывая страницу браузера, необходимо в файле csrf-magic.php в переменной $GLOBALS[‘csrf’][‘secret’] в кавычках задать любой набор символов, далее обновить страницу, не запуская установку заново.


Миграция с версии меньшей, чем 5.4.0-201310

Обновление системы версии 5.1.0 и старше (5.x) до версии SalesPlatform Vtiger 6.1.0-201410.

Процесс миграции будет происходить в 2 этапа.

1 этап - обновление до версии 5.4.0-201310.

Vt note.png Примечание
После миграции необходимо проверить значение $default_charset в файле config.inc.php. Если значение = ISO-8859-1, заменить на UTF-8.
Vt note.png Примечание
Если миграция осуществляется с версии 5.2.1 или старее, то необходимо скопировать файлы user_privileges_1.php и sharing_privileges_1.php, вставить и поменять имена файлов на user_privileges_.php и sharing_privileges_.php. (баг: ​http://trac.vtiger.com/cgi-bin/trac.cgi/ticket/7081). Данное утверждение верно, если пользователь является администратором с id=1 и он совершает миграцию. Если у пользователя id не равен 1, то необходимо скопировать файлы user_privileges_X.php и sharing_privileges_X.php(если есть), где X - id пользователя.

2 этап - обновление с версии 5.4.0-201310 до 6.1.0-201410


Миграция с версии 5.4.0-201310

Для обновления системы с версии 5.4.0-201310 до 6.1.0-201410 необходимо выполнить следующие шаги:


Миграция с версии 6.0.0-201403

Для обновления системы с версии 6.0.0-201403 до 6.1.0-201410 необходимо выполнить следующие шаги:


Миграция с версии 6.1.0-201410

Для обновления системы с версии 6.1.0-201410 до 6.1.0-201412 необходимо выполнить следующие шаги:


Миграция с версии 6.1.0-201412

Для обновления системы с версии 6.1.0-201412 до 6.2.0-201505 необходимо выполнить следующие шаги:


Миграция с версии 6.2.0-201505

Для обновления системы с версии 6.2.0-201505 до 6.3.0-201507 необходимо выполнить следующие шаги:

Vt important.png Важно
После миграции на новую версию следует проверить корректность формирования шаблонов PDF. Для генерации PDF используется библиотека tcpdf версии 6.2.9. В новой версии удаляется пустая строка после тега
<hr>
. Для добавления пустой строки нужно после тега
<hr>
добавить
<p><br></p>
Пример:
 <hr size="2">
 <p><br></p>

При возникновении ошибки: TCPDF ERROR: TCPDF requires the Imagick or GD extension to handle PNG images with alpha channel. Установить sudo apt-get install php5-gd и перезапустить apache.

Миграция с версии 6.3.0-201507 и выше

Для обновления системы необходимо выполнить следующие шаги:



Краткая инструкция по установке SalesPlatform vtiger CRM в Linux Debian

Требования к установке

Основными требованиями для установки являются web-сервер Apache, интерпретатор PHP (версия PHP >= 5.4) и СУБД MySQL (5.0 <= версия MySQL <= 5.6). Вполне подойдут версии этих пакетов, находящиеся в стандартном репозитории Debian. Установим их с помощью aptitude:

 # aptitude install apache2 mysql-server php5 

Помимо этих основных зависимостей следует установить также дополнительные:

 # aptitude install binutils cpp flex gcc  libarchive-zip-perl libc6-dev
   libcompress-zlib-perl libpcre3 libpopt-dev lynx m4 make  ncftp nmap
   openssl perl perl-modules unzip zip zlib1g-dev autoconf 
   automake1.9 libtool bison autotools-dev gcc libpng12-dev libjpeg62-dev
   libfreetype6-dev libssl-dev libxml2-dev libxml2 g++ gawk
   libapache2-mod-php5 php5-gd php5-imap php5-zlib php5-curl php5-mysql
 
 # pecl install timezonedb

Установка дистрибутива

Затем распаковываем дистрибутив в каталоге /var/www:

 # cd /var/www
 # tar xzf <путь_к_дистрибутиву>/salesplatform-vtigercrm-6.2.0-201505.tar.gz 

На время выполнения установки дадим веб-серверу права на запись для всех файлов и каталогов. Сделаем это, изменив владельца и группу на www-data (стандартный пользователь сервера Apache в Debian):

 # cd vtigercrm
 # chown -R www-data.www-data * 

Настройки php

Необходимо также исправить конфигурационный файл PHP (/etc/php5/apache2/php.ini), задав следующие значения параметров (для PHP >= 5.4 опция allow_call_time_pass_reference не требуется):

 allow_call_time_pass_reference = on
 error_reporting = E_ALL & ~E_NOTICE & ~E_DEPRECATED & ~E_STRICT
 safe_mode = off
 display_errors = off
 file_uploads = on
 max_execution_time = 600
 memory_limit = 128M
 log_errors = on
 output_buffering = on
 register_globals = off
 short_open_tag = on
 max_input_vars = 5000
 extension=timezonedb.so 

Если установлен модуль PHP suhosin, то необходимо также исправить конфигурационный файл этого модуля (/etc/php5/conf.d/suhosin.ini), задав следующие значения параметров:

 suhosin.get.max_value_length = 8192
 suhosin.post.max_vars = 5000
 suhosin.request.max_vars = 5000 

Настройки MySQL

В настройках MySQL рекомендуется установить UTF8 в качестве кодировки по умолчанию. Для этого создадим файл /etc/mysql/conf.d/utf8.cnf со следующим содержанием (для MySQL версии 5.5 и выше опции default-character-set не требуются):

 [mysqld]
 collation_server=utf8_general_ci
 character_set_server=utf8
 default-character-set=utf8
 init_connect='SET collation_connection = utf8_general_ci'
 init_connect='SET NAMES utf8'
 [mysql]
 default-character-set = utf8

Для корректной работы с кодировками при импорте данных в CRM на сервере должны быть установлены соответствующие кодировкам локали: CP1251, UTF-8 и ISO-8859-1. Необходимо проверить существующие локали и установить недостающие (важно точное соответствие названия кодировки и локали):

 # locale -a
 # localedef -i ru_RU -f CP1251 CP1251
 # localedef -i ru_RU -f UTF-8 UTF-8
 # localedef -i en_US -f ISO-8859-1 ISO-8859-1 

Действия после установки

Перезапускаем серверы:

 # /etc/init.d/mysql restart
 # /etc/init.d/apache2 restart 

Наконец, все готово. Переходим в браузере по адресу: http://адрес_сервера/vtigercrm и попадаем в мастер начальной установки vtiger CRM, который в интерактивном режиме поможет выполнить начальную конфигурацию БД vtiger CRM.

После установки снимем права на запись для ряда подкаталогов системы:

 # cd /var/www/vtigercrm
 # chown -R root.root *
 # chown -R www-data.www-data cache logs modules storage test user_privileges tabdata.php parent_tabdata.php config.inc.php
 # chmod +x /var/www/vtigercrm/cron/vtigercron.sh

Для работы Планировщика необходимо создать файл в /etc/cron.d/ со следующим содержимым:

 */5 * * * * www-data /usr/bin/flock -n /tmp/vtigercron.lock /var/www/vtigercrm/cron/vtigercron.sh

Необходимо убедиться, что в скрипте vtigercron.sh указан верный путь к интерпретатору php.

Интеграция с КЛАДР

Интеграция с КЛАДР реализована в SalesPlatform Vtiger CRM версии 6.1.0-201412 и выше.

Для интеграции с КЛАДР потребуется загрузить дамп данных КЛАДР с официального сайта SalesPlatform и распаковать архив с sql-дампом адресов:

 $ cd <путь_к_бд_адресов>
 $ tar xzf salesplatform-kladr-6.1.0-201412.tar.gz

Загруженный дамп можно восстановить как в основную базу данных (БД) SalesPlatform Vtiger CRM, так и в отдельную БД (начиная с версии SalesPlatform Vtiger CRM 6.2.0-201505):

  $ mysql -u <пользователь> -p<пароль> kladrdb -q < salesplatform-kladr.sql

Vt caution.png Внимание: Данная операция может занять значительное количество времени.

Если установлена SalesPlatform Vtiger CRM версии 6.2.0-201505 и выше, то далее необходимо изменить файл настроек КЛАДР, который находится в директории с установленной системой modules/SPKladr/kladrDB.config.inc. В данном файле введите параметры подключения к БД и название БД с данными КЛАДР. На фрагменте ниже представлен случай, когда дамп КЛАДР загружен в БД - kladrdb:

 $spKladrDB['host'] = 'localhost';
 $spKladrDB['port'] = ':3306';
 $spKladrDB['username'] = 'kladr';
 $spKladrDB['password'] = 'xxx';
 $spKladrDB['name'] = 'kladrdb';
 $spKladrDB['type'] = 'mysqli';

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

Настройка SalesPlatform Vtiger Asterisk Connector

SalesPlatform Vtiger Asterisk Connector представляет из себя серверное приложение. Для удобства, структура каталогов, конфигурационных файлов и логика запуска/останова приложения аналогична Vtiger Asterisk Connector. В этом разделе описывается логика функционирования приложения, установка, настройка конфигурационных файлов и приводятся настройки Asterisk для поддержки записи разговоров, фиксации входящей линии и приводится пример настройки FreePBX для возможности использования коннектора.


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


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

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


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


Исходящий вызов можно осуществить двумя способами:


Установка

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

Для установки необходимо скачать SalesPlatform Vtiger Asterisk Connector с официального сайта http://community.salesplatform.ru/download/. После этого необходимо разархивировать его в директорию, из которой он будет запускаться.

Настройка

Настройка сводится к вводу требуемых значений в конфигурационные файлы, назначению прав на запуск и доступа к определенным файлам и каталогам.


В папке с приложением заполните файл 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/vtiger640)
VtigerSecretKey Скопируйте сюда значение Секретный ключ в настройках Менеджера PBX Vtiger
CheckKeyOnListenRequest Начиная с версии 1.4.1. Если установлено в true, то коннектор не будет проверять секретный ключ при запросе записи разговора. Для старых версии CRM системы (<= 6.4) может потребоваться установить значение в false для возможности прослушивания разговоров из CRM
LookUpVariablesNames Начиная с версии 1.4.1. Имена пользовательских переменных которые будут передавать в CRM систему. Формат ввода через запятую. Значения данных переменных можно устанавливать через метод Set в плане набора asterisk. Пример конфигурации пользовательских переменных: myTestVarFirst,myTestVarSecond
DefaultOriginateChannelProtocol Протокол канала для события Originate по умолчанию. Используется при осуществлении click2call из CRM системы. Примеры значений параметра: SIP, IAX, Local. Опция применяется ко всем внутренним номерам. Для конкретного номера можно переопределить протокол с помощью опиций, указанных ниже.
<номер телефона> Один или несколько внутренних номеров, для которых необходимо задать протокол канала, отличный от DefaultOriginateChannelProtocol. Каждый новый номер указывается с новой строки. Опциональные параметры, можно их не указывать. Задается в виде <номер телефона> = <протокол>, например 100=Local 101=IAX


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

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

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


Vt note.png Примечание Для автоматического запуска коннектора при старте системы можно прописать необходимую команду в /etc/rc.local


После запуска, протоколирование работы производится в директории коннектора в папке logs. Для каждого нового запуска создается новый файл лога. Все ошибки и предупреждения записываются в лог-файл. При этом степень детализации логирования можно изменить - для этого необходимо в файле source/log4j.properties изменить уровень логирования с WARN на требуемый (в соответствии с уровнями log4j), после чего для вступления изменений в силу необходимо перезапустить коннектор.


Vt caution.png Внимание: После установки и настройки коннектора необходимо выполнить настройку модуля Менеджер PBX (Звонки).


Настройка Asterisk для фиксации входящей линии в CRM

Начиная с версии 1.2 SalesPlatform Vtiger Asterisk Connector позволяет фиксировать входящую линию, через которую производится звонок. Для этого в настройках плана набора для соответствующего контекста транка, через который осуществляется звонок, необходимо добавить следующее правило:

exten => _X., n, SET(CONNECTEDLINE(name, i)=<Требуемое значение>)

То есть, для фиксации значения линии 111-11-11, необходимо добавить правило вида:

exten => _X., n, SET(CONNECTEDLINE(name, i)=111-11-11)

Если один контекст используется для звонков через несколько транков, то можно создать контекст-обертку над каждым транком с включением в него требуемого контекста, содержащего правила дозвона, следующим образом:

exten => _X.,1, SET(CONNECTEDLINE(name, i)=<Требуемое значение>)
include => <требуемый контекст>


Настройка FreePBX для фиксации входящей линии в CRM

Стандартный план набора, генерируемый FreePBX, изначально содержит установку входящей линии, поэтому дополнительная настройка FreePBX не требуется. В случае выхода новых версий FreePBX где это утверждение неверно, необходимо вручную переопределить стандартный контекст from-trunk, добавив в него указанное выше правило дозвона.


Настройка 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 на запись 


Включение поддержки CRD - файл cdr.conf:

[general]
enable=yes


Активация 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()

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

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