Пороги списания бонусов. УНФ 3.0
В УНФ 3.0 бонусная программа имеет только максимальный процент оплаты бонусами (МаксимальныйПроцентОплаты).
А маркетологи любят предоставлять скидки в виде таблицы порогов вида:
Мне была поставлена такая задача и я ее реализовал не особо затратно по времени.
В справочник «Бонусные программы» добавил строковый реквизит для задания порогов:
Они должны быть отсортированы. Проверки не делал ради экономии бюджета. Так можно было бы и в виде таблицы оформить.
Код для добавления поля максимального процента в форму:
&НаСервере Процедура дор_ПриСозданииНаСервереПосле(Отказ, СтандартнаяОбработка) Привязка = Элементы.ГруппаМаксимальныйПроцент; Элемент = ЭтаФорма.Элементы.Добавить("дор_МаксимальныйПроцентОплаты", Тип("ПолеФормы"), Привязка); Элемент.Вид = ВидПоляФормы.ПолеВвода; Элемент.АвтоМаксимальнаяШирина = ложь; Элемент.ПутьКДанным = "Объект.дор_МаксимальныйПроцентОплаты"; КонецПроцедуры
Расчет отрабатывает корректно:
При реализации использовал уже знакомую и обкатанную технологию «спуска параметра».
Можно было, конечно, сделать расширение через «Изменение и контроль», но оно могло бы слететь быстрее, при очередном обновлении. А так проработает достаточно долго. Каких-то религиозных предубеждений против использования параметра у меня нет.
Расширяю форму ФормаОплаты документа ЧекККМ:
&НаСервере &Вместо("СписатьБаллыНаСервере") Процедура дор_СписатьБаллыНаСервере(ТекущаяСтрокаИдентификатор) УстановитьПривилегированныйРежим(Истина); ПараметрыСеанса.дор_СуммаЧекаДляБаллов = Объект.СуммаДокумента; ПродолжитьВызов(ТекущаяСтрокаИдентификатор); КонецПроцедуры &НаСервере &Вместо("ОпределитьОграничениеБонуснойПрограммы") Функция дор_ОпределитьОграничениеБонуснойПрограммы(ДисконтнаяКарта) Результат = ПродолжитьВызов(ДисконтнаяКарта); УстановитьПривилегированныйРежим(Истина); Попытка дор_СуммаЧекаДляБаллов = ПараметрыСеанса.дор_СуммаЧекаДляБаллов; БонуснаяПрограмма = ДисконтнаяКарта.Владелец.БонуснаяПрограмма; Если ЗначениеЗаполнено(БонуснаяПрограмма) Тогда дор_МаксимальныйПроцентОплаты = БонуснаяПрограмма.дор_МаксимальныйПроцентОплаты; дор_МаксимальныйПроцентОплаты = СтрЗаменить(дор_МаксимальныйПроцентОплаты, Символы.ПС, ","); //Чтобы с новой строки дор_МаксимальныйПроцентОплаты = СтрЗаменить(дор_МаксимальныйПроцентОплаты, "-", ","); //Чтобы можно было тире дор_МаксимальныйПроцентОплаты = СтрЗаменить(дор_МаксимальныйПроцентОплаты, ".", ""); //Чтобы можно было точками разделять разряды М = СтрРазделить(дор_МаксимальныйПроцентОплаты, ","); Для Инд = 1 По Цел(М.Количество()/2) Цикл Порог = Число(СокрЛП(М[Инд*2-2])); Сумма = Число(СокрЛП(М[Инд*2-1])); Если дор_СуммаЧекаДляБаллов <= Порог Тогда //Пример сумма документа 4000, порог до 5к = 300 бонусов //Процент = 100 - (4000-300)/4000 *100 = 100 - 3700/4000 *100 = 100 - 92.5 = 7.5% //Сумма скидки = 4000 * 7.5% = 300 Результат = 100 - (дор_СуммаЧекаДляБаллов - Сумма) / дор_СуммаЧекаДляБаллов * 100; Если Результат >= 0 И Результат < 100 Тогда Возврат Результат; КонецЕсли; КонецЕсли; КонецЦикла КонецЕсли; Исключение Сообщить("Ошибка при определении ограничения бонусной программы, сообщите программисту: " + ОписаниеОшибки()); КонецПопытки; Возврат Результат; КонецФункции
Обратите внимание — надо возвращать не максимальную сумму, а максимальный процент, отсюда необходимость пересчета суммы в проценты.
Среда: УНФ 3.0.4.88. Объем: 1.5 час
Свежие комментарии