Создание скидки
Создаем новую скидку. Условие предоставления - "При предъявлении промокода / купона"
Указываем тип скидки, размер скидки, сегмент номенклатуры. В наименование скидки добавляем "SMS". После сохранения названия, активируется закладка "Рассылка СМС".
Переходим на закладку "Рассылка СМС" и вводим данные: "Количество дней отсрочки акции", "Количество дней действия акции" и шаблоны СМС. Сохраняем скидку.
Помещаем обработку "Рассылка СМС" в дополнительные отчеты и обработки и настраиваем расписание. Для файловых баз с распределенной структурой, обработка запускается только на главном узле.
Алгоритм действия обработки следующий.
1. По регистру сведений СостоянияОднократныхСкидокИКупонов ищутся записи со скидкой "SMS" рассылки по условию текущая дата больше даты активации скидки (период) и меньше дата начала акции, имеющие дисконтные карты с заполненным номером телефона.
2. Если документ информационная рассылка на текущую дату найден, то в него добавляются записи в таблицу адресаты с текстом СМС1, если документа нет, то он создается.
3. Ищется документ информационная рассылка на дату начала акции если документ найден, то в таблицу адресаты добавляются записи с текстом СМС2, если документа нет, то он создается.
4. Ищется документ информационная рассылка на дату середины акции если документ найден, то в таблицу адресаты добавляются записи с текстом СМС3, если документа нет, то он создается.
5. В регистре сведений СостоянияОднократныхСкидокИКупонов изменяются записи на период = дата начала акции и период действия = дата окончания акции
6. Адресатам документов с датой = текущая дата посылаются СМС. И в случае успешного отправления состояние строки адресата меняется на доставлено.
Обработка имеет следующие переменные.
Ответственный = Справочники.Пользователи.НайтиПоНаименованию("Администратор", Ложь);
СтоимостьСМС = 2.78;
МинимальнаяСуммаНасчету = 100;
ОтправитьДокументом = Ложь;
Ответственный - пользователь ссылка на которого пишется в документ "Информационная рассылка"
МинимальнаяСуммаНасчету - сумма после которой рассылка СМС блокируется. Перед блокировкой ответственному, если у него есть номер телефона в справочнике "Пользователи" или "Физические лица", посылается СМС с текстом "На баланссе меньше 100 р."
ОтправитьДокументом - если у вас настроена передача СМС документом "Информационная рассылка", то эту переменную необходимо установить в Истину. Переработанный код модуля формы документа "Информационная рассылка" ОтправитьНаСервере, вставлен в обработку. При этом необходимо помнить, что номер телефона берется почему то не из документа "Информационная рассылка", а из контактной информации.
Функция ОтправитьНаСервере(Объект)
КоличествоОтправленных = 0;
Если Не ОтправкаSMS.НастройкаОтправкиSMSВыполнена() Тогда
// Почму разработчики закомментировали этот код не разбирался
//ОбщегоНазначенияКлиентСервер.СообщитьПользователю(НСтр("ru = 'Не выполнены настройки отправки SMS.'"), , "Объект");
//Возврат КоличествоОтправленных;
КонецЕсли;
МассивАдресатов = ПолучитьСтруктуруКонтактнойИнформациейНаСервере(Объект.Адресаты.Выгрузить(,"Контакт").ВыгрузитьКолонку("Контакт"));
Для Каждого СтрокаАдресата Из Объект.Адресаты Цикл
Если не СтрокаАдресата.СостояниеСообщения= Перечисления.СостоянияСообщенияSMS.Исходящее Тогда
Продолжить;
КонецЕсли;
СтруктураОтбора = Новый Структура("Контакт", СтрокаАдресата.Контакт);
МассивКонтактнойИнформации = МассивАдресатов.НайтиСтроки(СтруктураОтбора);
Если МассивКонтактнойИнформации.Количество() > 0 Тогда
КонтактнаяИнформация = МассивКонтактнойИнформации[0].КонтактнаяИнформация;
КонецЕсли;
ТекстСообщения = СтрокаАдресата.ТекстСообщения;
МассивНомеров = Новый Массив;
МассивНомеров.Добавить(КонтактнаяИнформация);
РезультатОтправки = ОтправкаSMS.ОтправитьSMS(МассивНомеров, ТекстСообщения, Неопределено, Объект.ОтправлятьВТранслите);
СтрокаАдресата.СостояниеСообщения = Перечисления.СостоянияСообщенияSMS.ПустаяСсылка();
Если РезультатОтправки.ОтправленныеСообщения.Количество() = 0 Тогда
СтрокаАдресата.ИдентификаторСообщения = "";
СтрокаАдресата.СостояниеСообщения = Перечисления.СостоянияСообщенияSMS.НеУдалосьПередатьПровайдеру;
Иначе
Для Каждого ОтправленноеСообщение Из РезультатОтправки.ОтправленныеСообщения Цикл
СтрокаАдресата.ИдентификаторСообщения = ОтправленноеСообщение.ИдентификаторСообщения;
СтрокаАдресата.СостояниеСообщения = Перечисления.СостоянияСообщенияSMS.ОтправляетсяПровайдером;
КонецЦикла;
КонецЕсли;
Если РезультатОтправки.Свойство("ОписаниеОшибки")
И ЗначениеЗаполнено(РезультатОтправки.ОписаниеОшибки) Тогда
СтрокаАдресата.ТекстОшибки = РезультатОтправки.ОписаниеОшибки;
СтрокаАдресата.ИдентификаторСообщения = "";
Если НЕ ЗначениеЗаполнено(СтрокаАдресата.СостояниеСообщения) Тогда
СтрокаАдресата.СостояниеСообщения = Перечисления.СостоянияСообщенияSMS.НеУдалосьПередатьПровайдеру;
КонецЕсли;
Иначе
СтрокаАдресата.ТекстОшибки = "";
КонецЕсли;
КоличествоОтправленных = КоличествоОтправленных + РезультатОтправки.ОтправленныеСообщения.Количество();
КонецЦикла;
Возврат КоличествоОтправленных;
КонецФункции
Изначально обработка настроена на передачу СМС сервисом smsdelivery.ru - код в обработке
Функция ОтправитьSMSНаНомер(Номертелефона, ТекстСообщения) Экспорт
Если ТекстСообщения = "" Тогда
Возврат Ложь;
КонецЕсли;
// Сдесь вводятся реальные данные провайдера
Логин = "ЛогинУчетнойЗаписиSMSСервиса";
Пароль = "ПарольУчетнойЗаписиSMSСервиса";
ИмяОтправителяSMS = "ИмяОтправителяSMS";
//////////////////////////////////////
Возврат "OK"; // Это тестирование - после настройки удалить
/////////////////////////////////////
// Подключаем сервис
Определение = Новый WSОпределения("http://ws1.smsdelivery.ru/SMSWebservice.asmx?WSDL");
Прокси = Новый WSПрокси(Определение,"http://smsdelivery.ru/","SMSWebService","SMSWebServiceSoap");
Фабрика = Прокси.ФабрикаXDTO;
СтруктураБаланса = Прокси.GetBalance(Логин,Пароль);
Баланс = СтруктураБаланса.Balance;
Если СтруктураБаланса.Balance < МинимальнаяСуммаНасчету Тогда
Если СтруктураБаланса.Balance > МинимальнаяСуммаНасчету-2*СтоимостьСМС Тогда
Запрос = Новый Запрос;
Запрос.Текст =
"ВЫБРАТЬ
| ПользователиКонтактнаяИнформация.НомерТелефона КАК НомерТелефона,
| ФизическиеЛицаКонтактнаяИнформация.НомерТелефона КАК НомерТелефона1
|ИЗ
| Справочник.Пользователи КАК Пользователи
| ЛЕВОЕ СОЕДИНЕНИЕ Справочник.Пользователи.КонтактнаяИнформация КАК ПользователиКонтактнаяИнформация
| ПО (ПользователиКонтактнаяИнформация.Ссылка = Пользователи.Ссылка)
| ЛЕВОЕ СОЕДИНЕНИЕ Справочник.ФизическиеЛица.КонтактнаяИнформация КАК ФизическиеЛицаКонтактнаяИнформация
| ПО Пользователи.Ссылка.ФизическоеЛицо = ФизическиеЛицаКонтактнаяИнформация.Ссылка
|ГДЕ
| Пользователи.Ссылка = &Ссылка";
Запрос.УстановитьПараметр("Ссылка", Ответственный);
РезультатЗапроса = Запрос.Выполнить();
Если РезультатЗапроса.Пустой() Тогда
Возврат "На баланссе меньше 100 р.";
КонецЕсли;
Выборка = РезультатЗапроса.Выбрать();
Пока Выборка.Следующий() Цикл
Если ЗначениеЗаполнено(Выборка.НомерТелефона) Тогда
Номертелефона = Выборка.НомерТелефона;
ИначеЕсли ЗначениеЗаполнено(Выборка.НомерТелефона1) Тогда
Номертелефона = Выборка.НомерТелефона1;
Иначе
Возврат "На баланссе меньше 100 р.";
КонецЕсли;
ТекстСообщения = "На баланссе меньше 100 р.";
КонецЦикла;
Иначе
Возврат "На баланссе меньше 97 р.";
КонецЕсли;
КонецЕсли;
ВремяЖизни = 6; // время жизни СМС в часах в течении этого времени будут производится попытки отправки СМС
Результат = Прокси.SendMessage(Логин, Пароль, 0, ВремяЖизни, Сред(Номертелефона,2), ИмяОтправителяSMS, ТекстСообщения);
Возврат Результат.Result;
КонецФункции
Для тестирования и отладки обработка имеет форму с кнопкой "Разослать СМС".
Обработка и расширение тестировались на платформе 8.3.16.1063, конфигурация Розница 2.3.3.12, режим совместимости с 8.3.12.
В архиве расширение и обработка.
Проверено на следующих конфигурациях и релизах:
- Розница, редакция 2.3, релизы 2.3.12.34