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

Материал из Call Office Wiki
Перейти к навигации Перейти к поиску
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.InLogInfo ('Старт');

try {

   var Device = new CDevice ();

   var Info = new CInfo ();

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

      var AnswerMode = new CAnswerMode ();
      var Time       = new CTime       ();

      if (AnswerMode.IsDatabase ()) {                             // Если есть запись или поиск телефона в базе

         var Database = new CDatabase ();

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

            while (Time.WaitTime ()) {                            // Выполняем, пока совпадает время работы

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

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

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

                  case 0:                    // Звонок поступил

                     var Phone = ('' + Device.GetCallerId ()).replace (new RegExp (/[^0-9]*/g), '');

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

                     Script.AddVariable ('Phone', Phone);

                     if (Script.IsStop ()) break;

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

                     var Recording = new CRecording ();

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

                     var DataSearch = new CDataSearch ();

                     if (DataSearch.IsSearch ()) {       // если есть поиск в базе данных

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

                        if (Record.Fetch () && Phone) {                          // Нашли телефон, произносим для него сообщение

                           var Sound = new CSound ('Found');

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

                           Info.Ok++;                    // добавляем найденный телефон в статистику
                        }
                        else {                           // Не нашли, произносим общее для не найденных

                           var Sound = new CSound ('NotFound');

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

                           Info.Fail++;                     // добавляем неизвестный телефон в статистику
                        }

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

                        Record.Close ();

                     }
                     else {                                 // Поиск не включен, произноcим общее сообщение для всех

                        var Sound = new CSound ('ForAll');

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

                        Sound.Say (Device, Record);

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

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

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

                     var DataWrite = new CDataWrite ();

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

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

                     break;

                  case 4:
                     break;
               }

               if (Script.IsStop ()) break;
            }

            Database.Close ();      // Закрываем БД
         }
      }
      else {                                                   // Без записи и поиска в БД

         while (Time.WaitTime ()) {                            // Выполняем, пока совпадает время работы

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

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

               case 0:                    // Звонок поступил

                  var Phone = Device.GetCallerId ();

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

                  Script.AddVariable ('Phone', Phone);

                  if (Script.IsStop ()) break;

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