Бонусные программы лояльности / Оплата бонусными баллами / Модуль формы

файл

#Область ОбработчикиСобытийФормы

&НаСервере
Процедура ПриСозданииНаСервере(Отказ, СтандартнаяОбработка)
	
	Если Параметры.Свойство("АвтоТест") Тогда // Возврат при получении формы для анализа.
		Возврат;
	КонецЕсли;
	
	ВыборкаБонуснаяПрограммаЛояльности = БонусныеБаллыСервер.БонуснаяПрограммаКартыЛояльности(Параметры.КартаЛояльности);
	БонуснаяПрограммаЛояльности = ВыборкаБонуснаяПрограммаЛояльности.БонуснаяПрограммаЛояльности;
	Партнер                     = Параметры.Партнер;
	
	ВалютаДокумента         = Параметры.Валюта;
	ВалютаБонуснойПрограммы = ВыборкаБонуснаяПрограммаЛояльности.Валюта;
	
	СтруктураКурсовВалютыДокумента         = РаботаСКурсамиВалютУТ.ПолучитьКурсВалюты(ВалютаДокумента,         ТекущаяДатаСеанса());
	СтруктураКурсовВалютыБонуснойПрограммы = РаботаСКурсамиВалютУТ.ПолучитьКурсВалюты(ВалютаБонуснойПрограммы, ТекущаяДатаСеанса());
	КурсКонвертацииБонусовВВалюту          = ВыборкаБонуснаяПрограммаЛояльности.КурсКонвертацииБонусовВВалюту;

	// Расчет максимальной суммы оплаты бонусами
	ТабличнаяЧастьТовары = ПолучитьИзВременногоХранилища(Параметры.АдресТабличнойЧастиТовары); // ТабличнаяЧасть, ТаблицаЗначений
	ТабличнаяЧастьТовары.Колонки.Добавить("МаксимальнаяСуммаОплаты", ОбщегоНазначенияУТ.ОписаниеТипаДенежногоПоля());
	ТабличнаяЧастьТовары.Колонки.Добавить("МаксимальнаяСуммаОплатыВБаллах", ОбщегоНазначенияУТ.ОписаниеТипаДенежногоПоля());
	
	Запрос = Новый Запрос("ВЫБРАТЬ
	|	Товары.НомерСтроки КАК НомерСтроки,
	|	Товары.КлючСвязи КАК КлючСвязи,
	|	ВЫРАЗИТЬ(Товары.Номенклатура КАК Справочник.Номенклатура) КАК Номенклатура,
	|	Товары.Характеристика КАК Характеристика,
	|	Товары.КоличествоУпаковок КАК КоличествоУпаковок,
	|	Товары.Цена КАК ЦенаЗаУпаковку,
	|	Товары.ПроцентАвтоматическойСкидки КАК ПроцентАвтоматическойСкидки,
	|	Товары.СуммаАвтоматическойСкидки КАК СуммаАвтоматическойСкидки
	|ПОМЕСТИТЬ ВременнаяТаблицаТовары
	|ИЗ
	|	&Товары КАК Товары
	|;
	|
	|////////////////////////////////////////////////////////////////////////////////
	|ВЫБРАТЬ
	|	Товары.НомерСтроки КАК НомерСтроки,
	|	Товары.КлючСвязи КАК КлючСвязи,
	|	Товары.Номенклатура КАК Номенклатура,
	|	Товары.Характеристика КАК Характеристика,
	|	Товары.КоличествоУпаковок КАК КоличествоУпаковок,
	|	ЕСТЬNULL(ЕСТЬNULL(ТабличнаяЧастьЦеновыеГруппы.МаксимальныйПроцентОплатыБонусами,
	|		БонусныеПрограммыЛояльности.МаксимальныйПроцентОплатыБонусами), 0) КАК МаксимальныйПроцентОплатыБонусами,
	|	Товары.КоличествоУпаковок * Товары.ЦенаЗаУпаковку КАК Сумма,
	|	Товары.ПроцентАвтоматическойСкидки КАК ПроцентАвтоматическойСкидки,
	|	Товары.СуммаАвтоматическойСкидки КАК СуммаАвтоматическойСкидки,
	|	ВЫБОР
	|		КОГДА БонусныеПрограммыЛояльности.СегментНоменклатуры <> ЗНАЧЕНИЕ(Справочник.СегментыНоменклатуры.ПустаяСсылка)
	|			ТОГДА ВЫБОР
	|				КОГДА НоменклатураСегмента.Сегмент = БонусныеПрограммыЛояльности.СегментНоменклатуры
	|					ТОГДА ИСТИНА
	|				ИНАЧЕ ЛОЖЬ
	|			КОНЕЦ
	|		ИНАЧЕ ИСТИНА
	|	КОНЕЦ КАК ВходитВДоступныйСегмент,
	|	БонусныеПрограммыЛояльности.БезУчетаПредоставленныхСкидок
	|ИЗ
	|	ВременнаяТаблицаТовары КАК Товары
	|		ЛЕВОЕ СОЕДИНЕНИЕ Справочник.БонусныеПрограммыЛояльности.ЦеновыеГруппы КАК ТабличнаяЧастьЦеновыеГруппы
	|		ПО (ТабличнаяЧастьЦеновыеГруппы.Ссылка = &БонуснаяПрограммаЛояльности)
	|		И (ТабличнаяЧастьЦеновыеГруппы.ЦеноваяГруппа = Товары.Номенклатура.ЦеноваяГруппа)
	|		ЛЕВОЕ СОЕДИНЕНИЕ Справочник.БонусныеПрограммыЛояльности КАК БонусныеПрограммыЛояльности
	|		ПО (БонусныеПрограммыЛояльности.Ссылка = &БонуснаяПрограммаЛояльности)
	|		ЛЕВОЕ СОЕДИНЕНИЕ РегистрСведений.НоменклатураСегмента КАК НоменклатураСегмента
	|		ПО Товары.Номенклатура = НоменклатураСегмента.Номенклатура
	|		И Товары.Характеристика = НоменклатураСегмента.Характеристика
	|		И НоменклатураСегмента.Сегмент = БонусныеПрограммыЛояльности.СегментНоменклатуры");
	
	Запрос.УстановитьПараметр("Товары", ТабличнаяЧастьТовары);
	Запрос.УстановитьПараметр("БонуснаяПрограммаЛояльности", БонуснаяПрограммаЛояльности);
	Выборка = Запрос.Выполнить().Выбрать();
	
	Пока Выборка.Следующий() Цикл
		
		Если Не Выборка.МаксимальныйПроцентОплатыБонусами > 0 Тогда
			Продолжить;
		КонецЕсли;
		
		Если Не Выборка.ВходитВДоступныйСегмент Тогда
			Продолжить;
		КонецЕсли;
		
		Если Не Выборка.БезУчетаПредоставленныхСкидок 
			И Выборка.ПроцентАвтоматическойСкидки > Выборка.МаксимальныйПроцентОплатыБонусами Тогда
			Продолжить;
		КонецЕсли;
		
		СтрокаТЧ = ТабличнаяЧастьТовары.Найти(Выборка.НомерСтроки, "НомерСтроки");
		
		Если Выборка.БезУчетаПредоставленныхСкидок Тогда
			СтрокаТЧ.МаксимальнаяСуммаОплаты = (Выборка.МаксимальныйПроцентОплатыБонусами / 100) * (Выборка.Сумма-Выборка.СуммаАвтоматическойСкидки);
		Иначе
			СтрокаТЧ.МаксимальнаяСуммаОплаты = ((Выборка.МаксимальныйПроцентОплатыБонусами - Выборка.ПроцентАвтоматическойСкидки) / 100) * Выборка.Сумма;
		КонецЕсли;
		
		СтрокаТЧ.МаксимальнаяСуммаОплатыВБаллах = РаботаСКурсамиВалютУТ.ПересчитатьПоКурсу(
			СтрокаТЧ.МаксимальнаяСуммаОплаты,
			СтруктураКурсовВалютыДокумента,
			СтруктураКурсовВалютыБонуснойПрограммы) / КурсКонвертацииБонусовВВалюту;
		
	КонецЦикла;
	
	ОстаткиБонусныхБаллов.Загрузить(БонусныеБаллыСервер.ОстаткиИДвиженияБонусныхБаллов(БонуснаяПрограммаЛояльности, Параметры.Партнер));
	НачальныйОстатокВБаллах = ОстаткиБонусныхБаллов[0].Сумма;
	
	НачальныйОстаток = РаботаСКурсамиВалютУТ.ПересчитатьПоКурсу(
		НачальныйОстатокВБаллах * КурсКонвертацииБонусовВВалюту,
		СтруктураКурсовВалютыБонуснойПрограммы,
		СтруктураКурсовВалютыДокумента);
	
	МаксимальнаяСуммаОплаты        = Мин(ТабличнаяЧастьТовары.Итог("МаксимальнаяСуммаОплаты"), НачальныйОстаток);
	МаксимальнаяСуммаОплатыВБаллах = Мин(ТабличнаяЧастьТовары.Итог("МаксимальнаяСуммаОплатыВБаллах"), НачальныйОстатокВБаллах);
	
	ОписаниеМаксимальнаяСуммаОплаты = НСтр("ru = 'Максимальная сумма оплаты составляет %1 %2 или %3'");
	ОписаниеМаксимальнаяСуммаОплаты = СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку(
		ОписаниеМаксимальнаяСуммаОплаты,
		МаксимальнаяСуммаОплаты,
		ВалютаДокумента,
		СтроковыеФункцииКлиентСервер.ЧислоЦифрамиПредметИсчисленияПрописью(
			МаксимальнаяСуммаОплатыВБаллах,
			НСтр("ru = 'балл, балла, баллов'")));
	
	Элементы.СуммаОплаты.МаксимальноеЗначение = МаксимальнаяСуммаОплаты;
	Элементы.СуммаОплатыВБаллах.МаксимальноеЗначение = МаксимальнаяСуммаОплатыВБаллах;
	
	Если МаксимальнаяСуммаОплаты = 0 Тогда
		Элементы.СуммаОплаты.Доступность = Ложь;
		Элементы.СуммаОплатыВБаллах.Доступность = Ложь;
		Элементы.ФормаОплатитьБаллами.Доступность = Ложь;
	КонецЕсли;
	
	СуммаОплаты        = МаксимальнаяСуммаОплаты;
	СуммаОплатыВБаллах = МаксимальнаяСуммаОплатыВБаллах;
	
	АдресВоВременномХранилище = ПоместитьВоВременноеХранилище(ТабличнаяЧастьТовары, УникальныйИдентификатор);

	СобытияФорм.ПриСозданииНаСервере(ЭтаФорма, Отказ, СтандартнаяОбработка);

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

#КонецОбласти

#Область ОбработчикиСобытийЭлементовШапкиФормы

&НаКлиенте
Процедура СуммаОплатыПриИзменении(Элемент)
	
	СуммаОплатыВБаллах = РаботаСКурсамиВалютУТКлиентСервер.ПересчитатьПоКурсу(
		СуммаОплаты,
		СтруктураКурсовВалютыДокумента,
		СтруктураКурсовВалютыБонуснойПрограммы) / КурсКонвертацииБонусовВВалюту;
	
КонецПроцедуры

&НаКлиенте
Процедура СуммаОплатыВБаллахПриИзменении(Элемент)
	
	СуммаОплаты = РаботаСКурсамиВалютУТКлиентСервер.ПересчитатьПоКурсу(
		СуммаОплатыВБаллах * КурсКонвертацииБонусовВВалюту,
		СтруктураКурсовВалютыБонуснойПрограммы,
		СтруктураКурсовВалютыДокумента);
	
КонецПроцедуры

#КонецОбласти

#Область ОбработчикиКомандФормы

&НаКлиенте
Процедура ОплатитьБаллами(Команда)
	
	ПараметрыДанных = Новый Структура;
	ПараметрыДанных.Вставить("АдресВоВременномХранилище", АдресВоВременномХранилище(ВладелецФормы.УникальныйИдентификатор));
	
	Закрыть(ПараметрыДанных);
	
КонецПроцедуры

&НаКлиенте
Процедура Подключаемый_ВыполнитьПереопределяемуюКоманду(Команда)
	
	СобытияФормКлиент.ВыполнитьПереопределяемуюКоманду(ЭтаФорма, Команда);
	
КонецПроцедуры

#КонецОбласти

#Область СлужебныеПроцедурыИФункции

&НаСервере
Функция АдресВоВременномХранилище(УникальныйИдентификаторВладельцаФормы)
	
	СтрокиТабличнойЧасти = ПолучитьИзВременногоХранилища(АдресВоВременномХранилище);
	
	СуммаКРаспределению = СуммаОплатыВБаллах;
	СуммаКРаспределениюВВалюте = СуммаОплаты;
	
	МаксимальнаяСуммаОплатыВБаллах = СтрокиТабличнойЧасти.Итог("МаксимальнаяСуммаОплатыВБаллах");
	
	Для каждого СтрокаТЧ Из СтрокиТабличнойЧасти Цикл
		
		Если МаксимальнаяСуммаОплатыВБаллах <= 0 Тогда
			Прервать;
		КонецЕсли;
		
        ТекСуммаБонусныхБалловКСписанию = СтрокаТЧ.МаксимальнаяСуммаОплатыВБаллах * (СуммаКРаспределению / МаксимальнаяСуммаОплатыВБаллах);
		СтрокаТЧ.СуммаБонусныхБалловКСписанию = Мин(ТекСуммаБонусныхБалловКСписанию, СуммаКРаспределению);
		
		ТекСуммаБонусныхБалловКСписаниюВВалюте = РаботаСКурсамиВалютУТ.ПересчитатьПоКурсу(
			СтрокаТЧ.СуммаБонусныхБалловКСписанию * КурсКонвертацииБонусовВВалюту,
			СтруктураКурсовВалютыБонуснойПрограммы,
			СтруктураКурсовВалютыДокумента);
		СтрокаТЧ.СуммаБонусныхБалловКСписаниюВВалюте = Мин(ТекСуммаБонусныхБалловКСписаниюВВалюте, СуммаКРаспределениюВВалюте);
		
		СуммаКРаспределению = СуммаКРаспределению - СтрокаТЧ.СуммаБонусныхБалловКСписанию;
		МаксимальнаяСуммаОплатыВБаллах = МаксимальнаяСуммаОплатыВБаллах - СтрокаТЧ.МаксимальнаяСуммаОплатыВБаллах;

		СуммаКРаспределениюВВалюте = СуммаКРаспределениюВВалюте - СтрокаТЧ.СуммаБонусныхБалловКСписаниюВВалюте;
		
	КонецЦикла;
	
	Возврат ПоместитьВоВременноеХранилище(СтрокиТабличнойЧасти, УникальныйИдентификаторВладельцаФормы);
	
КонецФункции

#КонецОбласти

Связанные материалы