SalesPlatform vtiger crm 7 Техническое руководство
Миграция с предыдущих версий
Краткий обзор
Миграция представляет собой процесс, при котором вы можете обновить установленную версию 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 находящийся в папке с исходным кодом системы.
Важно
- Убедитесь, что системное окружение сервера соответствует системным требования новой версии системы.
Важно
- Если в системе были установлены сторонние модули, убедитесь, что они поддерживают новую версию системы. Перед началом миграции все сторонние модули необходимо отключить в настройках системы.
Важно
- Для *nix ОС не забудьте после копирования мастера миграции перед запуском миграции добавить полные права веб-серверу на запись в директорию с установленной системой. После завершения миграции права необходимо вернуть в исходное состояние.
Примечание
- Начиная с версии 6.2.0-201505 в папке с установленной системой после миграции создается лог-файл - migration_log.txt, в котором содержится подробный протокол миграции.
Примечание
- Если в процессе миграции появилась надпись «Invalid request», то, не закрывая страницу браузера, необходимо в файле csrf-magic.php в переменной $GLOBALS[‘csrf’][‘secret’] в кавычках задать любой набор символов, далее обновить страницу, не запуская установку заново.
Примечание
- После завершения миграции необходимо очистить директорию test/templates_c/v7/ (для версий < 7 директорию test/templates_c/vlayout/), а также кеш и сохраненные куки браузера.
Далее, в зависимости от Вашей версии Vtiger нажмите на ссылку ниже:
- «Моя версия меньше 5.4.0-201310»
- «Моя версия 5.4.0-201310»
- «Моя версия 6.0.0-201403»
- «Моя версия 6.1.0-201410»
- «Моя версия 6.1.0-201412»
- «Моя версия 6.2.0-201505»
- «Моя версия 6.3.0-201507 и выше»
Миграция с версии меньшей, чем 5.4.0-201310
Обновление системы версии 5.1.0 и старше (5.x) до версии SalesPlatform Vtiger 6.1.0-201410.
Процесс миграции будет происходить в 2 этапа.
1 этап - обновление до версии 5.4.0-201310.
Примечание
- После миграции необходимо проверить значение $default_charset в файле config.inc.php. Если значение = ISO-8859-1, заменить на UTF-8.
Примечание
- Если миграция осуществляется с версии 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 необходимо выполнить следующие шаги:
- Загрузить Менеджер миграции SalesPlatform с официального сайта http://community.salesplatform.ru/download/
- Распаковать архив в папку с установленной системой
- Открыть в браузере ваша_система/migrate
- Далее следуйте инструкциям Менеджера миграции
Миграция с версии 6.0.0-201403
Для обновления системы с версии 6.0.0-201403 до 6.1.0-201410 необходимо выполнить следующие шаги:
- Загрузить Менеджер миграции SalesPlatform с официального сайта http://community.salesplatform.ru/download/
- Распаковать архив в папку с установленной системой
- Открыть в браузере ваша_система/migrate
- Далее следуйте инструкциям Менеджера миграции
Миграция с версии 6.1.0-201410
Для обновления системы с версии 6.1.0-201410 до 6.1.0-201412 необходимо выполнить следующие шаги:
- Загрузить Менеджер миграции SalesPlatform с официального сайта http://community.salesplatform.ru/download/
- Распаковать архив в папку с установленной системой
- Открыть в браузере http://ваша_система/migrate
- Далее следуйте инструкциям Менеджера миграции
- Для использования КЛАДР необходимо следовать инструкции по Интеграции с КЛАДР
Миграция с версии 6.1.0-201412
Для обновления системы с версии 6.1.0-201412 до 6.2.0-201505 необходимо выполнить следующие шаги:
- Загрузить Менеджер миграции SalesPlatform с официального сайта http://community.salesplatform.ru/download/
- Распаковать архив в директорию с установленной системой
- Открыть в браузере http://ваша_система/migrate
- Далее следуйте инструкциям Менеджера миграции
- Для использования КЛАДР необходимо следовать инструкции по Интеграции с КЛАДР
Миграция с версии 6.2.0-201505
Для обновления системы с версии 6.2.0-201505 до 6.3.0-201507 необходимо выполнить следующие шаги:
- Загрузить Менеджер миграции SalesPlatform с официального сайта http://community.salesplatform.ru/download/
- Распаковать архив в директорию с установленной системой
- Открыть в браузере http://ваша_система/migrate
- Далее следуйте инструкциям Менеджера миграции
- Для использования КЛАДР необходимо следовать инструкции по Интеграции с КЛАДР
Важно
- После миграции на новую версию следует проверить корректность формирования шаблонов 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 с официального сайта http://community.salesplatform.ru/download/
- Распаковать архив в директорию с установленной системой
- Открыть в браузере http://ваша_система/migrate
- Далее следуйте инструкциям Менеджера миграции
Краткая инструкция по установке SalesPlatform vtiger CRM в Linux Debian
Требования к установке
Минимальные системные требования к серверу (до 5 активных пользователей): 1Ghz x 1CPU, 1Gb RAM, 20Gb HDD.
Основными требованиями для установки являются web-сервер Apache, интерпретатор PHP (версия >= 5.4) и СУБД MySQL (версия >= 5.0). Вполне подойдут версии этих пакетов, находящиеся в стандартном репозитории Debian. Установим их с помощью aptitude:
# aptitude update
# 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-7.0.1-201707.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 sql_mode=NO_ZERO_IN_DATE,NO_ZERO_DATE,ERROR_FOR_DIVISION_BY_ZERO,NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTION init_connect='SET collation_connection = utf8_general_ci' init_connect='SET NAMES utf8' default-character-set=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/ со следующим содержимым:
MAILTO="" */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.5.0-201611.tar.gz
Загруженный дамп можно восстановить как в основную базу данных (БД) SalesPlatform Vtiger CRM, так и в отдельную БД (начиная с версии SalesPlatform Vtiger CRM 6.2.0-201505):
$ mysql -u <пользователь> -p<пароль> kladrdb -q < salesplatform-kladr.sql
Внимание: Данная операция может занять значительное количество времени.
Если установлена 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';
Базовые настройки безопасности Vtiger для веб-сервера
В конфигурационном файле Apache (например, /etc/apache2/sites-enabled/000-default.conf):
<Directory /var/www/> Options -Indexes AllowOverride All </Directory>
В файле .htaccess Vtiger (например, /var/www/vtigercrm/.htaccess):
RedirectMatch 403 (?i)/+storage/ RedirectMatch 403 (?i)/+.*\.txt RedirectMatch 403 (?i).*\.log$ RedirectMatch 403 (?i)/+(soap|cache|data|include|includes|logs|modules|pkg)/.(php|tpl)
Настройка SalesPlatform Vtiger Asterisk Connector
SalesPlatform Vtiger Asterisk Connector представляет из себя серверное приложение. Для удобства, структура каталогов, конфигурационных файлов и логика запуска/останова приложения аналогична Vtiger Asterisk Connector. В этом разделе описывается логика функционирования приложения, установка, настройка конфигурационных файлов и приводятся настройки Asterisk для поддержки записи разговоров, фиксации входящей линии и приводится пример настройки FreePBX для возможности использования коннектора.
Внимание: желательно, чтобы SalesPlatform Vtiger Asterisk Connector функционировал на том же сервере, что и Asterisk. В противном случае для прослушки звонков в CRM, необходимо будет монтировать каталог с записями разговоров с сервера Asterisk, на сервер, где развернут SalesPlatform Vtiger Asterisk Connector.
Логика функционирования
С точки зрения фиксации информации о звонках, функционирование коннектора сводится к прослушке событий AMI интерфейса. При поступлении определенного события, на основании его названия и параметров производятся сохранение информации о происходящем звонке в локальном хранилище коннектора и передача необходимой информации в SalesPlapform Vtiger CRM. Ниже приводится соответствие AMI-событий этапам звонка:
- Начало звонка - соответствует событию Dial (или DialBegin для версий Asterisk 12+). Из этого события извлекаются номер звонящего и номер того, кому адресован звонок. Эта информация передается в CRM, где производится обработка этой информации, определение направления звонка и извещение пользователя всплывающим окном.
- Поднята трубка - соответствует событию Bridge. Из этого события извлекается информация о том, что соединение между абонентами было установлено, и передается далее в CRM. CRM при получении этой информации меняет статус звонка с "Звонок" на "В прогрессе"
- Разговор завершен - соответствует событию HangUp. Из этого события извлекается информация о том, как был завершен разговор (занято, нет ответа, нормальное завершение и т.п). На основании этой информации CRM меняет статус звонка.
- Детали звонка - соответствует событию CDR. Из этого события извлекаются детали звонка (длительность разговора, общая продолжительность, статус и опционально - ссылка на запись разговора). На основании этой информации в CRM производится обновление деталей звонка.
Важно: информация о звонке будет зафиксирована в CRM только в том случае, если найдено соответствие хотя бы одному из номеров среди пользователей в CRM системе. Указать внутренний номер сотрудника вашей компании можно в поле "Внутренний номер" карточки пользователя в CRM системе.
Исходящий вызов можно осуществить двумя способами:
- Пользователь вручную набирает номер клиента, которому требуется совершить звонок. При этом все детали звонка будут зафиксированы в CRM системе.
- Пользователь в CRM системе нажимает на номер клиента. После этого коннектор отправит управляющий запрос в Asterisk для осуществления исходящего вызова (Originate запрос). При этом начинает звонить телефон пользователя. Необходимо ответить на звонок - после этого пойдет реальный дозвон до клиента. Это стандартное поведение для click2call. Звонок также будет зафиксирован в системе.
Установка
Необходимы требования для установки:
- JDK/JRE версии 1.7+
- Asterisk 1.8, 11, 12, 13, 14.
Для установки необходимо скачать 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/vtiger7) |
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 |
Далее необходимо настроить права на каталоги и файлы:
- Пользователь, от имени которого будет запущен коннектор, должен иметь права на чтение/запись в директорию, указанную в параметре AsteriskAppDBPath.
- Файлы в директории приложения /bin должны быть доступны на запуск.
- Директория /log должна быть доступна на чтение/запись для пользователя, запустившего коннектор.
- Все остальные файлы в директории приложения должны быть доступны на чтение.
- Файлы записей разговоров, создаваемые Asterisk, должны быть доступны на чтение для пользователя от имени которого будет запущен коннектор.
Запуск/останов
Запуск коннектора сводится к запуску на исполнение скрипта bin/start.sh в каталоге инсталляции коннектора. Останов коннектора сводится к запуску скрипта bin/stop.sh.
Примечание
Для автоматического запуска коннектора при старте системы можно прописать необходимую команду в /etc/rc.local
После запуска, протоколирование работы производится в директории коннектора в папке logs. Для каждого нового запуска создается новый файл лога. Все ошибки и предупреждения записываются в лог-файл. При этом степень детализации логирования можно изменить - для этого необходимо в файле source/log4j.properties изменить уровень логирования с WARN на требуемый (в соответствии с уровнями log4j), после чего для вступления изменений в силу необходимо перезапустить коннектор.
Внимание: После установки и настройки коннектора необходимо выполнить настройку модуля Менеджер 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 либо не устанавливайте ссылку на файл в опциональное пользовательское поле.
Внимание: Директория, указанная в команде 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()