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 InText  = (SMSList[i].Text + '').replace(/'/g, "''");  // Экранируем одинарные кавычки
                        var OutText = '';
 
                        Script.InLogInfo ('"' + InText + '"');
 
                        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': InText,
                                                                      'inphone': Phone});
 
                        Info.All++;                                  // Увеличиваем счетчик принятых звонков в статистике
                        Info.Update (DataSearchSMS.IsSearch ());        // Показываем статистику
 
                        if (AnswerMode.IsRecord ()) {  // Если запись
 
                           DataWrite = new CDataWriteSMS ();
 
                           var Query = Script.GetExpressionValue (DataWrite.Query (),
                                                                  {'ColumnSMS': InText,
                                                                 'ColumnPhone': Phone,
                                                                      'intext': InText,
                                                                     '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 ('Отправка ответного сообщения <i>%s</i> по номеру %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.WaitForIncoming (Time.TimeOut (), 2)) {      // Ждем входящего СМС заданное время
 
                  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 ();
}