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