Пороги списания бонусов. УНФ 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 час

fixin

Программирую на 1С с 1999 года. В 1С просто Гений. В 2020 году ушел из офиса на вольные хлеба фриланса. Принимаю заказы.

Читайте также:

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *