Scripts (версия 3.xx)/Приём SMS

Материал из 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\\SMS.js')); // Работа с сообщениями eval (Script.GetFileContent ('Common\\Classes\\Device.js')); // Устройство eval (Script.GetFileContent ('Common\\Classes\\DataSearch.js')); // Поиск данных

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

// =================== Начало работы сценария ===================

Script.InLogInfo ('Старт');

try {

  var Info   = new CInfo ();
  var Device = new CDevice ();
  if (Device.Open ()) {
     var Time = new CTime ();
     if (!Time.CheckTime ()) Device.Wait (1000);        // Ждём наступления времени обзвона
     while (Time.CheckTime ()) {                        // Выполняем, пока совпадает время обзвона
        var AnswerMode = new CAnswerMode ();
        AnswerMode.Purge ();                            // Проверка на необходимость удаления имеющихся сообщений
        var Database = new CDatabase ();
        if (Database.Open ()) {
           while (!Script.IsStop ()) {                  // Основной цикл ожидания входящих SMS
              Script.WaitPause ();                      // Ожидание, если нажали на Паузу
              var SMSList = Device.SMSList ();
              if (SMSList.length) {
                 Script.InLogInfo ('Количество входящих SMS сообщений: ' + SMSList.length);
                 for (var i in SMSList) {
                    if (Script.IsStop ()) break;
                    try {
                       var Phone = SMSList[i].Phone;
                       if (Phone) Script.InLogInfo ('Входящее сообщение от %s поступило', Phone);
                       else       Script.InLogInfo ('Входящее сообщение поступило');
                       var SMS;
                       var OutText = (SMSList[i].Text + ).replace(/'/g, "");  // Экранируем одинарные кавычки
                       var DataSearchSMS = new CDataSearch ();
                       if (AnswerMode.IsAnswer ()) {             // Ответное сообщение требуется
                          if (AnswerMode.IsSearch ()) {          // Есть поиск в БД
                             var Record = DataSearchSMS.GetRecord (Database, Phone);
                             if (Record.Fetch () && Phone) {        // Нашли телефон в БД
                                SMS = Script.GetConfig ('SMS', 'Found');
                                OutText = Record.GetExpressionValue (SMS.Text);
                                Info.Ok++;                          // добавляем найденный телефон в статистику
                             }
                             else {                                 // НЕ нашли
                                SMS = Script.GetConfig ('SMS', 'NotFound');
                                OutText = Record.GetExpressionValue (SMS.Text);
                                Info.Fail++;                        // добавляем неизвестный телефон в статистику
                             }
                             Record.Close ();
                          }
                          else {                                    // Общее сообщение без поиска в БД
                             SMS = Script.GetConfig ('SMS', 'ForAll');
                          }
                       }
                       OutText = Script.GetExpressionValue (OutText, {'intext': OutText,
                                                                     'inphone': Phone});
                       Info.All++;                                  // Увеличиваем счетчик принятых звонков в статистике
                       Info.Update (DataSearchSMS.IsSearch ());        // Показываем статистику
                       if (AnswerMode.IsRecord ()) {  // Если запись
                          DataWrite = new CDataWriteSMS ();
                          var Query = Script.GetExpressionValue (DataWrite.Query (),
                                                                 {'ColumnSMS': OutText,
                                                                'ColumnPhone': Phone,
                                                                     'intext': OutText,
                                                                    'inphone': Phone});
                          try {
                             Script.InLogInfo ('Сохранение входящего SMS');
                             Database.Query (Query);
                             Script.InLogInfo ('Сохранение входящего SMS завершено');
                          }
                          catch (Err) {
                             Script.InLogError ('Ошибка в SQL запросе для записи входящего SMS: %s. %s. Код ошибки: %s',
                                                 Query,  Err.description, Err.number);
                             Script.StopError ();
                          }
                       }
                       if (AnswerMode.IsAnswer ()) {  // Если требуется ответ
                          if (Script.IsStop ()) break;
                          try {
                             if (/^[\+0-9]+$/.test (Phone)) {
                                Script.InLogInfo ('Отправка ответного сообщения %s по номеру %s', OutText, Phone);
                                var ResultSend = Device.SendSMS (SMSList[i].Phone, OutText, SMS.Sender);
                                switch (ResultSend) {
                                   case  0: Script.InLogInfo ('Ответное сообщение отправлено успешно'); break;
                                   case  4: Script.InLogError ('Отправка ответного сообщения прервана пользователем'); break;
                                   case  5: Script.InLogError ('Время ожидания отправки ответного сообщения истекло'); break;
                                   default: Script.InLogError ('Неизвестная ошибка отправки ответного сообщения: ' + ResultSend); break;
                                }
                             }
                             else {
                                Script.InLogError ('Номер телефона %s не цифровой. Ответное сообщене не отправлено.', Phone);
                             }


                          }
                          catch (Err) {
                             Script.InLogError ('Ошибка отправки ответного SMS: ' + Err.description);
                          }
                       }
                       Script.InLogInfo ('Удаление входящего SMS (Id = %s)', SMSList[i].Id);
                       Device.DeleteSMS (SMSList[i].Id);
                       Script.InLogInfo ('Удаление входящего SMS (Id = %s) завершено', SMSList[i].Id);
                       Script.InLogInfo ('Входящее SMS № %s обработано', Info.All);
                    }
                    catch (Err) {
                       Script.InLogError ('Ошибка обработки входящего сообщения. %s. Код ошибки: %s',
                                          Err.description, Err.number);
                       if (Script.StopError ()) break;
                    }
                 }
              }
              Script.InLogInfo ('Поступившие SMS обработаны');
              Script.InLogInfo ('Ожидание входящего сообщения...');
              switch (Device.WaitForSMS (Time.TimeOut ())) {   // Ждем входящего СМС заданное время
                 case 0: // СМС поступило
                    break;
                 default:
                    Script.Stop ();
              }
           }
        }
        Database.Close ();
        if (Script.IsStop ()) break;
     }
     Device.Close ();
  }
  Script.InLogInfo ('Стоп');

} catch (Err) {

  Script.InLogError ('Ошибка при работe сценария. %s. Код ошибки: %s', Err.description, Err.number);
  if (Database) Database.Close ();
  if (Device  ) Device.Close ();

}