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\\DataRead.js'));                   // Чтение данных

// локальные модули для конкретного решения
eval (Script.GetFileContent ('Solutions\\Basic\\OutgoingCall\\Info.js'));        // Информация и статистика
eval (Script.GetFileContent ('Solutions\\Basic\\OutgoingCall\\CDataWrite.js'));  // Запись данных
eval (Script.GetFileContent ('Solutions\\Basic\\OutgoingCall\\COptions.js'));    // Расширенные настройки

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

try {
Далее определяется переменная класса Device, отвечающая за управление нашим устройством обзвона (модем, SIP и т.д.). Используется метод Open для устройства с проверкой успешности.
Устанавливается в единицу переменная CycleCount, отвечающая за количество сеансов обзвона.
   var Device = new CDevice ();

   if (Device.Open ()) {                                    // Если устройство открыто успешно

      var CycleCount = 1;

      var DataRead = new CDataRead ();

      while (DataRead.CheckCycle (CycleCount)) {            // Проверка количества попыток обзвона в сеансе

         Script.InLogInfo ('Цикл обзвона <b>%s</b>.', CycleCount);

         var Database = new CDatabase ();

         if (Database.Open ()) {                            // Если соединение с базой данных успешное

            var Info = new CInfo ();

            if (Info.Count (Database, DataRead)) {          // Подсчет статистики

               var Record = Database.Query (DataRead.Query ());      // Выбор записей в базе данных

               if (Record) {

                  var DataWrite = new CDataWrite ();

                  if (DataRead.CheckFields (Record) &&
                     DataWrite.CheckFields (Record)) {     // Проверка наличия полей для чтения и записи

                     while (Record.Fetch ()) {

                        Script.WaitPause ();          // Ожидание, если нажали на Паузу

                        Info.DataShow (Record);       // Показываем текущую запись в информационном окне

                        var Time = new CTime ();

                        Time.WaitTime ();             // Ожидаем время начала обзвона, если указано

                        var Status = '';

                        var Phone = DataRead.GetPhone (Record);

                        if (!empty (Phone)) {            // Если номер телефона не пуст

                           if (!DataRead.CheckIsOK (Record, Phone)) {       // Если статус - не прозвонен
                                                                            // и не достигнут предел количества попыток
                              try {

                                 for (var i in Phone) {

                                    Script.AddVariable ('Phone', Phone[i]);

                                    if (!Script.IsStop () &&
                                        DataRead.WaitBeforeCall ()) {           // Ожидание перед звонком

                                       var Sound = new CSound ();

                                       Sound.BeforeDial (Record);

                                       var PhoneStatus = '';                  // Начало звонка, текущий статус пуст

                                       var Result = Device.Dial (Phone[i]);   // Набираем номер

                                       var Options = new COptions ();

                                       if (Result == 0) {                     // Если абонент снял трубкy

                                          var StartTime = new Date ();        // Время начала разговора

                                          var Recording = new CRecording ();

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

                                          Sound.Say (Device, Record);         // Воспроизвести сообщение

                                          Recording.Stop (Device, Record);    // Завершаем запись сообщения

                                          PhoneStatus = Options.CheckCallTime (StartTime);      // Текущий статус по времени прослушивания
                                       }
                                       else {
                                          PhoneStatus = Device.GetDialErrorText (Result);   // Текущий статус при неудачном дозвоне
                                       }

                                       Device.HangUp ();

                                       if (Status != 'OK') Status = PhoneStatus;                // Статус записи

                                       if (DataRead.IsRemaining (PhoneStatus)) {

                                          break;           // Если удачный дозвон
                                                           // и не включен параметр звонить
                                                           // по оставшимся номерам в ячейке
                                       }

                                       if (Script.IsStop ()) break;

                                    } else Status = 'Прервано пользователем.';
                                 }
                              }
                              catch (Err) {
                                 Device.HangUp ();
                                 Status = Err.description;
                                 Script.StopError (Err.description);
                              }

                              DataWrite.SetStatus (Record, DataRead.GetPhone (Record, true), Status);       // Запись результата звонка

                              Info.Update (Status);                              // Обновление статистики

                              if (Script.IsStop ()) break;
                           }
                        } else Script.StopError ('Номер телефона пуст.');

                        if (Script.IsStop ()) break;

                        Record.Next ();
                     }
                  }                                                              // Отсутствуют необходимые поля базы данных

                  Record.Close ();
               } else Script.InLogError ('Ошибка получения данных для обзвона.');
            } else Script.InLogInfo ('Отсутствуют кандидаты на обзвон.');

            if (!Script.IsStop ()) DataRead.CycleWait ();

            Database.Close ();
         }

         CycleCount++;

         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 ('Стоп');