Scripts (версия 3.xx)/Приём звонков

Материал из Call Office Wiki
Перейти к навигации Перейти к поиску
Первая часть скрипта подготавливает классы и объекты, необходимые для работы скрипта. Описание дано в комментариях к каждой строке за исключением класса Script, который отвечает за непосредственное выполнение скрипта.
eval (GetFileContent ('Common\\Classes\\Script.js'));
var Script = new Script ();                                                      // Основной класс сценария

// =================== Подключение модулей ===================
eval (Script.GetFileContent ('Common\\Classes\\Database.js'));                   // База данных
eval (Script.GetFileContent ('Common\\Classes\\Time.js'));                       // Расписание
eval (Script.GetFileContent ('Common\\Classes\\Sound.js'));                      // Воспроизведение звуков
eval (Script.GetFileContent ('Common\\Classes\\Device.js'));                     // Устройство
eval (Script.GetFileContent ('Common\\Classes\\Recording.js'));                  // Запись разговора
eval (Script.GetFileContent ('Common\\Classes\\DataSearch.js'));                 // Поиск данных

eval (Script.GetFileContent ('Solutions\\Basic\\IncomingCall\\Info.js'));        // Информация и статистика
eval (Script.GetFileContent ('Solutions\\Basic\\IncomingCall\\CDataWrite.js'));  // Запись данных
eval (Script.GetFileContent ('Solutions\\Basic\\IncomingCall\\CAnswerMode.js')); // Режим обработки входящего звонка

// =================== Начало работы сценария ===================
Командой Script.SetDebug включается/отключается режим вывода дополнительных отладочных сообщений во время работы сценария. Как правило, это излишняя информация. Включать данный параметр рекомендуется только в случае, если сценарий выполняется некорректно и надо отправить разработчикам журнал с большим количеством информации. Без передачи параметра (true/false) функция включает режим отображения так, как установлено в конфигурации.
Script.SetDebug ();
Команда Script.InLogInfo позволяет выводить информацию в журнал в интерфейсе программы и одновременно записывать её в системный журнал. В данном случае будет отметка о том, что сценарий загрузил все необходимые данные и запустился.
Script.InLogInfo ('Старт');

try {
Далее определяется переменная Device класса CDevice, отвечающая за управление нашим устройством приёма звонков (модем, SIP и т.д.). Используется метод Open для устройства с проверкой успешности.
Определяется переменная Info класса CInfo, отвечающая за отображение статистики во вкладке «Журнал». Проводится первый подсчёт статистики на основе выбранных в конфигурации параметров.
   var Device = new CDevice ();

   var Info = new CInfo ();

   if (Device.Open ()) {                                          // Если устройство открыто успешно
Далее определяются переменные: AnswerMode класса CAnswerMode, отвечающая за режим обработки входящих звонков, Time класса CTime, отвечающая за работу с временем и расписание.
      var AnswerMode = new CAnswerMode ();
      var Time       = new CTime       ();
Блок, выполняемый, если есть поиск в базе данных или запись звонков в базу данных.
      if (AnswerMode.IsDatabase ()) {                                // Если есть запись или поиск телефона в базе
Определяется переменная Database класса CDatabase, отвечающая за работу с источником данных. Проверяется соединение с базой данных.
         var Database = new CDatabase ();

         if (Database.Open ()) {                                     // Если соединение с базой данных успешное
Проверяется время наступления работы, если определено расписание.
            while (Time.WaitTime ()) {                               // Выполняем, пока совпадает время работы
При нажатии кнопки «Пауза» ожидается действие пользователя. Если пауза не нажата, выводится в журнал текст «Ожидание входящего звонка...». Если указано расписание работы, то время ожидания звонка определяется функцией Time.TimeOut (), если расписание не включено, то ожидание бесконечное. При входящем звонке (метод WaitForIncoming возвращает ноль) обрабатывается входящий звонок.
               Script.WaitPause ();                                      // Ожидание, если нажали на Паузу

               Script.InLogInfo ('Ожидание входящего звонка...');

               switch (Device.WaitForIncoming (Time.TimeOut (), 1)) {    // Ждем звонка заданное время

                  case 0:                    // Звонок поступил
В переменную Phone заносится номер, с которого поступил входящий звонок (только цифры). Если номер определился, выводим в журнал сообщение о входящем звонке с указанием номера, если не определился, то просто о входящем звонке. Добавляется глобальная переменная сценария Phone, содержащая полученный номер телефона.
                     var Phone = ('' + Device.GetCallerId ()).replace (new RegExp (/[^0-9]*/g), '');

                     if (!empty (Phone)) Script.InLogInfo ('Входящий звонок от %s поступил', Phone);
                     else                Script.InLogInfo ('Входящий звонок поступил');

                     Script.AddVariable ('Phone', Phone);

                     if (Script.IsStop ()) break;
В переменную StartTime заносится время начала разговора.
Определяется переменная Recording класса CRecording, отвечающая за запись ответа абонента, при соответствующих настройках сценария включается запись разговора.
Определяется переменная DataSearch класса CDataSearch, отвечающая за поиск номера телефона в базе данных.
                     var StartTime = new Date ();                    // Время начала разговора

                     var Recording = new CRecording ();

                     Recording.Start (Device);                       // проверка на включение записи разговора перед сообщением

                     var DataSearch = new CDataSearch ();
При включенном поиске номера телефона в базе данных определяется переменная Record, содержащая записи базы данных с указанным номером телефона. Если записи есть и номер телефона определён, производится переход к произнесению сообщения для найденных номеров телефонов.
                     if (DataSearch.IsSearch ()) {                   // если есть поиск в базе данных

                        var Record = DataSearch.GetRecord (Database, Phone);     // выбираем записи в БД

                        if (Record.Fetch () && Phone) {                          // Нашли телефон, произносим для него сообщение
Определяется переменная Sound класса CSound, отвечающая за произнесение сообщений для найденных номеров ('Found'). Выводится сообщение в журнал о произнесении сообщения и произносится определённое конфигурацией звуковое сообщение. В статистике добавляется успешно принятый звонок.
                           var Sound = new CSound ('Found');

                           Script.InLogInfo ('Номер абонента найден в базе данных');
                           Script.InLogInfo ('Начало передачи сообщения');
                           Sound.Say (Device, Record);

                           Info.Ok++;                          // добавляем найденный телефон в статистику
                        }
Определяется переменная Sound класса CSound, отвечающая за произнесение сообщений для ненайденных номеров ('NotFound'). Выводится сообщение в журнал о произнесении сообщения и произносится определённое конфигурацией звуковое сообщение. В статистике добавляется неизвестный принятый звонок.
                        else {                                 // Не нашли, произносим общее для не найденных

                           var Sound = new CSound ('NotFound');

                           Script.InLogInfo ('Номер абонента не найден в базе данных');
                           Script.InLogInfo ('Начало передачи сообщения');
                           Sound.Say (Device, Record);

                           Info.Fail++;                        // добавляем неизвестный телефон в статистику
                        }
Завершается, если была включена, запись разговора, записывается ответ абонента, если в конфигурации определена запись после произнесения сообщения.
                        Recording.Stop (Device, Record);       // Завершаем запись разговора, если была включена
Закрывается соединение с выбранными по номеру телефона записями.
                        Record.Close ();

                     }
Определяется переменная Sound класса CSound, отвечающая за произнесение сообщения для всех входящих без поиска в базе данных ('ForAll'). Выводится сообщение в журнал о произнесении сообщения и произносится определённое конфигурацией звуковое сообщение.
                     else {                                    // Поиск не включен, произноcим общее сообщение для всех

                        var Sound = new CSound ('ForAll');

                        Script.InLogInfo ('Начало передачи сообщения');

                        Sound.Say (Device, Record);
Завершается, если была включена, запись разговора, записывается ответ абонента, если в конфигурации определена запись после произнесения сообщения. После завершения записи устройство «кладёт трубку».
                        Recording.Stop (Device);               // Завершаем запись разговора, если была включена
                     }

                     Device.HangUp ();                         // Кладём трубку
Увеличивается значение счётчика успешных звонков, обновляется информация в окне статистики.
                     Info.All++;                               // Увеличиваем счетчик принятых звонков в статистике
                     Info.Update (DataSearch.IsSearch ());     // Показываем статистику
Определяется переменная DataWrite класса CDataWrite, отвечающая за запись в базу данных информации о звонке. Если это указано в конфигурации, записывается информация о поступившем звонке в базу данных.
В журнал выводится информация о том, что звонок обработан.
                     var DataWrite = new CDataWrite ();

                     DataWrite.WriteResult (Database, Phone);  // Записываем звонок, если необходимо

                     if (!empty (Phone)) Script.InLogInfo ('Входящий звонок от %s обработан.', Phone);
                     else                Script.InLogInfo ('Входящий звонок обработан.');

                     break;
В случае, если ожидание прервано пользователем.
                  case 4:
                     break;
               }

               if (Script.IsStop ()) break;
            }

            Database.Close ();      // Закрываем БД
         }
      }
Блок, выполняемый в случае, если нет поиска и записи в базу данных.
      else {                                                   // Без записи и поиска в БД

         while (Time.WaitTime ()) {                            // Выполняем, пока совпадает время работы
При нажатии кнопки «Пауза» ожидается действие пользователя. Если пауза не нажата, выводится в журнал текст «Ожидание входящего звонка...». Если указано расписание работы, то время ожидания звонка определяется функцией Time.TimeOut (), если расписание не включено, то ожидание бесконечное. При входящем звонке (метод WaitForIncoming возвращает ноль) обрабатывается входящий звонок.
            Script.WaitPause ();                                      // Ожидание, если нажали на Паузу

            Script.InLogInfo ('Ожидание входящего звонка...');

            switch (Device.WaitForIncoming (Time.TimeOut (), 1)) {    // Ждем звонка заданное время

               case 0:                    // Звонок поступил
В переменную Phone заносится номер, с которого поступил входящий звонок (только цифры). Если номер определился, выводим в журнал сообщение о входящем звонке с указанием номера, если не определился, то просто о входящем звонке. Добавляется глобальная переменная сценария Phone, содержащая полученный номер телефона.
                  var Phone = ('' + Device.GetCallerId ()).replace (new RegExp (/[^0-9]*/g), '');

                  if (!empty (Phone)) Script.InLogInfo ('Входящий звонок от %s поступил', Phone);
                  else                Script.InLogInfo ('Входящий звонок поступил');

                  Script.AddVariable ('Phone', Phone);

                  if (Script.IsStop ()) break;
В переменную StartTime заносится время начала разговора.
Определяется переменная Recording класса CRecording, отвечающая за запись ответа абонента, при соответствующих настройках сценария включается запись разговора.
                  var StartTime = new Date ();        // Время начала разговора

                  var Recording = new CRecording ();

                  Recording.Start (Device);           // проверка на включение записи разговора перед сообщением

                  var Sound = new CSound ('ForAll');

                  Sound.Say (Device);

                  Recording.Stop (Device);            // Завершаем запись разговора, если была включена

                  Device.HangUp ();                      // Кладём трубку

                  Info.All++;                            // Увеличиваем счетчик принятых звонков в статистике
                  Info.Update (false);                   // Показываем статистику

                  if (!empty (Phone)) Script.InLogInfo ('Входящий звонок от %s обработан.', Phone);
                  else                Script.InLogInfo ('Входящий звонок обработан.');

                  break;

               case 4:
                  break;
            }

            if (Script.IsStop ()) break;
         }
      }

      Device.Close ();           // Закрываем устройство
   }
}
catch (Err) {
   Script.InLogError ('Ошибка при работe сценария. %s. Код ошибки: %s', Err.description, Err.number);
   if (Database) Database.Close ();
   if (Device  ) Device.Close ();
}

Script.InLogInfo ('Стоп');