В начало

Создание заданий на обзвон из документа

 

 

Листинг. Код в модуле формы списка документа

&НаСервере

Функция ИнициализироватьПроцессорВывода(НужнаТЗ)

            Схема = Элементы.Список.ПолучитьИсполняемуюСхемуКомпоновкиДанных();

            Настройки = Элементы.Список.ПолучитьИсполняемыеНастройкиКомпоновкиДанных();

           

            КомпоновщикМакета = Новый КомпоновщикМакетаКомпоновкиДанных();

            МакетКомпоновки = КомпоновщикМакета.Выполнить(Схема, Настройки, , , Тип("ГенераторМакетаКомпоновкиДанныхДляКоллекцииЗначений"));

           

            ПроцессорКомпоновки = Новый ПроцессорКомпоновкиДанных;

            ПроцессорКомпоновки.Инициализировать(МакетКомпоновки);

           

            ПроцессорВывода = Новый ПроцессорВыводаРезультатаКомпоновкиДанныхВКоллекциюЗначений;

           

            ТЗ = Новый ТаблицаЗначений;

            ПроцессорВывода.УстановитьОбъект(ТЗ);

           

            Попытка

                        ПроцессорВывода.Вывести(ПроцессорКомпоновки);

            Исключение

                        Сообщение = Новый СообщениеПользователю;

                        Сообщение.Текст = "Ошибка. Проверьте логичность устанавливаемых отборов";

                        Сообщение.Сообщить();

            КонецПопытки;

           

            КоличествоЗаписей = ТЗ.Количество();

           

            Если НужнаТЗ тогда

                        Возврат ТЗ;

            Иначе

                        Возврат Истина;

            КонецЕсли;

           

КонецФункции

 

&НаСервере

Функция СписокСсылокДляБота()

 

            ТЗ = ИнициализироватьПроцессорВывода(Истина);   

Возврат ТЗ.ВыгрузитьКолонку("Должник");

 

КонецФункции

 

&НаКлиенте

Процедура СоздатьЗаданиеДляГолосовогоБота(Команда)

            МассивСсылок = СписокСсылокДляБота();

           

            Парам1 = Новый Структура("МассивСсылок", МассивСсылок);

           

            ОткрытьФорму("Справочник.Партнеры.Форма.ФормаВводаПараметровБота", Парам1, ЭтаФорма);

 

КонецПроцедуры

 

 

Рис. Форма ввода параметров бота

 

Листинг. Содержимое модуля формы ввода параметров бота

&НаСервере

Процедура ПриСозданииНаСервере(Отказ, СтандартнаяОбработка)

            МассивПартнеров.ЗагрузитьЗначения(ЭтаФорма.Параметры.МассивСсылок);

КонецПроцедуры

 

 

Функция ПолучитьТокенTWIN()

    Адрес = "iam.twin24.ai";               

            Соединение = Новый HTTPСоединение(Адрес,443,,, ,30, Новый ЗащищенноеСоединениеOpenSSL);  

                       

            Заголовки = Новый Соответствие;             

            Заголовки.Вставить("Content-Type", "application/json");

            Запрос = Новый HTTPЗапрос("/api/v1/auth/login", Заголовки);

           

            ТелоЗапроса = "{

            | ""email"": ""pochta@mail.ru"",

            | ""password"": ""parol"",

            | ""ttl"": ""3600""

            | }";

 

            Запрос.УстановитьТелоИзСтроки(ТелоЗапроса, КодировкаТекста.UTF8);

            Результат = Соединение.ВызватьHTTPМетод("POST", Запрос);                      

            Сообщить("Токен: " + Результат.КодСостояния);

                       

            Если Результат.КодСостояния = 200 Тогда

                       

                        ЧтениеJSON = Новый ЧтениеJSON();

                        ЧтениеJSON.УстановитьСтроку(Результат.ПолучитьТелоКакСтроку(КодировкаТекста.UTF8));

                        РезСтруктура = ПрочитатьJSON(ЧтениеJSON);

                        ЧтениеJSON.Закрыть();

           

            Возврат РезСтруктура.token;                                         

            Иначе

                        Возврат "";

            КонецЕсли;   

 

КонецФункции

 

Функция СоздатьЗаданиеНаОбзвонВTWIN(Знач UuidСценария, Знач Токен)

            Адрес = "cis.twin24.ai"; 

            Соединение = Новый HTTPСоединение(Адрес,443,,,,30, Новый ЗащищенноеСоединениеOpenSSL);  

           

            Заголовки = Новый Соответствие;             

            Заголовки.Вставить("Content-Type", "application/json");

            Заголовки.Вставить("Authorization", "Bearer " + Токен);

            Запрос = Новый HTTPЗапрос("/api/v1/telephony/autoCall", Заголовки);

                                              

            ТелоЗапроса = "{

            | ""name"": ""Автотестовое задание"",

            | ""defaultExec"": ""robot"",

            | ""defaultExecData"": """ + UuidСценария + """,

            | ""secondExec"": ""end"",

            | ""secondExecData"": null,

            | ""cidType"": ""gornum"",

            | ""cidData"": ""efc1dea2-3ce4-5678-b098-18aff013ff20"",

            | ""startType"": ""manual"",

            | ""startMoment"": """",

            | ""cps"": ""1.01"",

            | ""taskComment"": ""ТестовоеЗадание1"",

            | ""webhookUrls"":[],

            | ""additionalOptions"":

            |           {""fullListMethod"":""external"",

            |            ""fullListTime"":""0"",

            |    ""useTr"":null,

            |    ""allowCallTimeFrom"":""32400"",

            |    ""allowCallTimeTo"":""82800"",

            |    ""recordCall"":""true"",

            |    ""recTrimLeft"":""1"",

            |    ""detectRobot"":""true"",

            |    ""detectRobotMode"":""block"",

            |    ""detectRobotGreeting"":null,

            |    ""providerId"":null

            |           },

            | ""redialStrategyOptions"":

            |   {""redialStrategyEn"":false,

            |    ""busy"":null,

            |    ""noAnswer"":null,

            |    ""answerMash"":null,

            |    ""congestion"":null,

            |    ""answerNoList"":null

            |   }

            | }"; 

 

            Запрос.УстановитьТелоИзСтроки(ТелоЗапроса, КодировкаТекста.UTF8);

            Результат = Соединение.ВызватьHTTPМетод("POST", Запрос);

            Результат2 = Результат.ПолучитьТелоКакСтроку(КодировкаТекста.UTF8);

           

            ЧтениеJSON = Новый ЧтениеJSON();

            ЧтениеJSON.УстановитьСтроку(Результат2);

            РезСтруктура = ПрочитатьJSON(ЧтениеJSON);

            ЧтениеJSON.Закрыть();

           

            Сообщить("Создание задания: " + Результат.КодСостояния);

                       

            Если Результат.КодСостояния = 200 Тогда

                        Возврат РезСтруктура.id.identity;

            Иначе

                        Возврат "";

            КонецЕсли;

 

КонецФункции

 

Процедура Пауза(Секунды) Экспорт

           

            ВремяОкончания = ТекущаяДата() + Секунды;

           

            Пока ТекущаяДата() <= ВремяОкончания Цикл   

            КонецЦикла;

           

КонецПроцедуры

 

Функция Заменить8на7вТелефонах(Знач М)//Заменяем первую [8] на [7] в номере телефона

            Индекс = 0;    

           

            Для Каждого Эл из М Цикл

                        Если Сред(Эл, 1, 1) = "8" Тогда

                                   М[Индекс] = "7" + Сред(Эл, 2, 10);

                        КонецЕсли;   

                        Индекс = Индекс + 1;

            КонецЦикла;                       

           

            Возврат М;

КонецФункции

 

&НаСервере

Процедура ДобавитьКандидатаВРегистр(Знач ИдЗадания, Знач МассивТелефонов, Знач СсылкаНаЛС)

           

            Для Каждого Эл Из МассивТелефонов Цикл

                        МЗ = РегистрыСведений.TWIN_ГолосовойБот.СоздатьМенеджерЗаписи();

                        МЗ.Период = ТекущаяДата();

                        МЗ.ИдентификаторЗадания = ИдЗадания;

                        МЗ.ТелефонИзЛС  = Эл;

                        МЗ.ЛС = СсылкаНаЛС;

                       

                        Если ЗначениеЗаполнено(МЗ.ИдентификаторЗадания) И

                                   ЗначениеЗаполнено(МЗ.ТелефонИзЛС) Тогда

                                   МЗ.Записать(Истина);

                        КонецЕсли;   

            КонецЦикла;  

 

КонецПроцедуры

 

&НаСервере

Функция ДатаБлижайшейОплатыИзСоглашения(Знач СсылкаНаСоглашение)

            Запрос = Новый Запрос;

            Запрос.Текст =

                        "ВЫБРАТЬ ПЕРВЫЕ 1

                        |           F1_СоглашениеОРассрочкеПлатежаГрафикПлатежей.Дата КАК Дата,

                        |           F1_СоглашениеОРассрочкеПлатежаГрафикПлатежей.Сумма КАК Сумма

                        |ИЗ

                        |           Документ.F1_СоглашениеОРассрочкеПлатежа.ГрафикПлатежей КАК F1_СоглашениеОРассрочкеПлатежаГрафикПлатежей

                        |ГДЕ

                        |           F1_СоглашениеОРассрочкеПлатежаГрафикПлатежей.Дата >= &Дата

                        |           И F1_СоглашениеОРассрочкеПлатежаГрафикПлатежей.Ссылка = &СсылкаНаСоглашение";

           

            Запрос.УстановитьПараметр("Дата", ТекущаяДата());

            Запрос.УстановитьПараметр("СсылкаНаСоглашение", СсылкаНаСоглашение);

           

            Результат = Запрос.Выполнить();

           

            Выборка = Результат.Выбрать();

           

            Если Выборка.Следующий() Тогда

                        Возврат Выборка.Дата;

            КонецЕсли;

           

КонецФункции

 

&НаСервере

Функция СписокКандидатовВJSON(autoCallId)           

 

            Запрос = Новый Запрос;

            Запрос.Текст =

                        "ВЫБРАТЬ

                        |           ВЫБОР

                        |                       КОГДА Партнеры.F1_Город.Наименование = ""Реутов""

                        |                                   ТОГДА 1

                        |                       КОГДА Партнеры.F1_Город.Наименование = ""Балашиха""

                        |                                   ТОГДА 2

                        |                       КОГДА Партнеры.F1_Город.Наименование = ""Королев""

                        |                                   ТОГДА 3

                        |                       ИНАЧЕ 0

                        |           КОНЕЦ КАК НомерОфиса,

                        |           Партнеры.УК_ФизЛицо.Имя КАК Имя,

                        |           Партнеры.F1_ТелефонСтрока КАК Телефоны,

                        |           Партнеры.УК_ЛицевойСчетЕИРЦ КАК ЛсЕирц,

                        |           Партнеры.F1_ДолгСПени КАК ДолгСПени,

                        |           Партнеры.F1_ДолгПени КАК ДолгПени,

                        |           Партнеры.Ссылка КАК СсылкаНаЛС,

                        |           Партнеры.F1_Город КАК Город,

                        |           F1_СоглашениеОРассрочкеПлатежа.Ссылка КАК СсылкаНаСоглашение

                        |ИЗ

                        |           Справочник.Партнеры КАК Партнеры

                        |                       ЛЕВОЕ СОЕДИНЕНИЕ Документ.F1_СоглашениеОРассрочкеПлатежа КАК F1_СоглашениеОРассрочкеПлатежа

                        |                       ПО F1_СоглашениеОРассрочкеПлатежа.Должник = Партнеры.Ссылка

                        |ГДЕ

                        |           Партнеры.Ссылка В(&МассивПартнеров)";

           

            Запрос.УстановитьПараметр("МассивПартнеров", ЭтаФорма.МассивПартнеров);

            Результат = Запрос.Выполнить();

           

            Выгрузка = Результат.Выгрузить();

           

            batch = Новый Массив();

 

            Для Каждого Эл из Выгрузка Цикл

                       

            //Переменные           

            variables = Новый Структура();

            variables.Вставить("name", Эл.Имя);

            АдресАбонента = "Московская область, г. " + Эл.СсылкаНаЛС.F1_Город + ", ул. " + Эл.СсылкаНаЛС.F1_Улица + ", д. " + Эл.СсылкаНаЛС.F1_Дом.НомерДома + ", кв. " + Эл.СсылкаНаЛС.УК_Помещение.НомерПомещенияРЦ;

            variables.Вставить("address", АдресАбонента);//Адрес абонента

            variables.Вставить("summa", Строка(Формат(Эл.ДолгСПени, "ЧДЦ=0; ЧГ="))); 

            variables.Вставить("peni", Строка(Эл.ДолгПени));

            Если ЗначениеЗаполнено(СценарийОбзвона) Тогда

                        НомерСценария = Число(СценарийОбзвона.Код);

            Иначе

                        НомерСценария = 0;

            КонецЕсли;   

            variables.Вставить("scenario", Строка(НомерСценария));//Номер сценария обзвона

            variables.Вставить("LS", Эл.ЛсЕирц);//Лицевой счет 

           

            Если ЗначениеЗаполнено(Эл.СсылкаНаСоглашение) Тогда

                        date_payS = Формат(ДатаБлижайшейОплатыИзСоглашения(Эл.СсылкаНаСоглашение), "ДФ=гггг-ММ-ддTЧЧ:мм:сс+ЧЧ:мм");

                        variables.Вставить("date_payS", date_payS);//Дата оплаты по [Соглашению]

            КонецЕсли;

           

            variables.Вставить("num_office", Строка(Эл.НомерОфиса));//Номер офиса КРКЦ (Реутов - 1, Балашиха - 2, Королев - 3)

 

            //Телефоны    

            Если СтрНайти(Эл.Телефоны, ";") <> 0 Тогда

                        phone = СтрРазделить(Эл.Телефоны, ";");

            Иначе                                                  

                        phone = Новый Массив();

                        phone.Добавить(Эл.Телефоны);     

            КонецЕсли;

           

            phone = Заменить8на7вТелефонах(phone);

           

            с1 = Новый Структура();

            с1.Вставить("id_debt", "");

            с1.Вставить("id_num", "");

           

            callbackData = Новый Массив();

            callbackData.Добавить(с1);

 

            Кандидат = Новый Структура();

            Кандидат.Вставить("phone", phone);

            Кандидат.Вставить("variables", variables);

            Кандидат.Вставить("callbackData", callbackData);

            Кандидат.Вставить("autoCallId", autoCallId);

                       

            batch.Добавить(Кандидат);

           

            ДобавитьКандидатаВРегистр(autoCallId, phone, Эл.СсылкаНаЛС);

           

            КонецЦикла;

           

            Данные = Новый Структура();

            Данные.Вставить("batch", batch);

           

            ЗаписьJSON = Новый ЗаписьJSON;                                

            ЗаписьJSON.УстановитьСтроку();

            ЗаписатьJSON(ЗаписьJSON, Данные);

           

            Возврат ЗаписьJSON.Закрыть();

КонецФункции

 

&НаСервере

Функция ДобавитьКандитатовНаОбзвонВTWIN(Знач Токен, Знач autoCallId)

            Адрес = "cis.twin24.ai";         

            Соединение = Новый HTTPСоединение(Адрес,443,,,,30, Новый ЗащищенноеСоединениеOpenSSL);  

           

            Заголовки = Новый Соответствие;             

            Заголовки.Вставить("Content-Type", "application/json");

            Заголовки.Вставить("Authorization", "Bearer " + Токен);

            Запрос = Новый HTTPЗапрос("/api/v1/telephony/autoCallCandidate/batch", Заголовки);

                                                                      

            ТелоЗапроса = СписокКандидатовВJSON(autoCallId);

            Запрос.УстановитьТелоИзСтроки(ТелоЗапроса, КодировкаТекста.UTF8);

           

            Результат = Соединение.ВызватьHTTPМетод("POST", Запрос);

            Результат2 = Результат.ПолучитьТелоКакСтроку(КодировкаТекста.UTF8);

                       

            Сообщить("Добавление кандидатов на обзвон: " + Результат.КодСостояния);

                       

            Если Результат.КодСостояния = 200 Тогда

                        //При успешном выполнении метода придет ответ с кодом 200 без тела

                        Возврат Результат.КодСостояния;

            Иначе

                        Возврат "";

            КонецЕсли;   

КонецФункции

 

 

&НаКлиенте

Процедура СоздатьЗадание(Команда)

            Если НЕ ЗначениеЗаполнено(ЭтотОбъект.СценарийОбзвона) Тогда

                        Сообщить("Выберете сценарий обзвона");

                        Возврат;

            КонецЕсли;   

           

            UuidСценария = "1f23456d-78c6-987a-a654-d4737800f856";

           

            Токен = ПолучитьТокенTWIN();

           

            autoCallId = СоздатьЗаданиеНаОбзвонВTWIN(UuidСценария, Токен);

            Пауза(5);//Требование на сайте TWIN       

            ДобавитьКандитатовНаОбзвонВTWIN(Токен, autoCallId);

           

КонецПроцедуры