#Если Сервер Или ТолстыйКлиентОбычноеПриложение Или ВнешнееСоединение Тогда
#Область ПрограммныйИнтерфейс
#Область Проведение
Процедура ЗарегистрироватьУчетныеМеханизмы(МеханизмыДокумента) Экспорт
МеханизмыДокумента.Добавить("ЦеныИСкидки");
КонецПроцедуры
Функция ДанныеДокументаДляПроведения(Документ, Регистры, ДопПараметры = Неопределено) Экспорт
Если ДопПараметры = Неопределено Тогда
ДопПараметры = ПроведениеДокументов.ДопПараметрыИнициализироватьДанныеДокументаДляПроведения();
КонецЕсли;
Если ТипЗнч(Документ) = Тип("ДокументОбъект.НачислениеИСписаниеБонусныхБаллов") Тогда
ДокументСсылка = Документ.Ссылка;
Иначе
ДокументСсылка = Документ;
КонецЕсли;
Запрос = Новый Запрос;
ТекстыЗапроса = Новый СписокЗначений;
Если Не ДопПараметры.ПолучитьТекстыЗапроса Тогда
ЗаполнитьПараметрыИнициализации(Запрос, ДокументСсылка);
ТекстЗапросаБонусныеБаллы(Запрос, ТекстыЗапроса, Регистры);
КонецЕсли;
Возврат ПроведениеДокументов.ИнициализироватьДанныеДокументаДляПроведения(Запрос, ТекстыЗапроса, ДопПараметры);
КонецФункции
#КонецОбласти
Процедура ДобавитьКомандыСозданияНаОсновании(КомандыСозданияНаОсновании, Параметры) Экспорт
КонецПроцедуры
Функция ДобавитьКомандуСоздатьНаОсновании(КомандыСозданияНаОсновании) Экспорт
Если ПравоДоступа("Добавление", Метаданные.Документы.НачислениеИСписаниеБонусныхБаллов) Тогда
КомандаСоздатьНаОсновании = КомандыСозданияНаОсновании.Добавить();
КомандаСоздатьНаОсновании.Менеджер = Метаданные.Документы.НачислениеИСписаниеБонусныхБаллов.ПолноеИмя();
КомандаСоздатьНаОсновании.Представление = ОбщегоНазначенияУТ.ПредставлениеОбъекта(Метаданные.Документы.НачислениеИСписаниеБонусныхБаллов);
КомандаСоздатьНаОсновании.РежимЗаписи = "Проводить";
КомандаСоздатьНаОсновании.ФункциональныеОпции = "ИспользоватьБонусныеПрограммыЛояльности";
Возврат КомандаСоздатьНаОсновании;
КонецЕсли;
Возврат Неопределено;
КонецФункции
Процедура ДобавитьКомандыОтчетов(КомандыОтчетов, Параметры) Экспорт
КонецПроцедуры
Процедура ПриОпределенииНастроекВерсионированияОбъектов(Настройки) Экспорт
КонецПроцедуры
#КонецОбласти
#Область СлужебныеПроцедурыИФункции
#Область Проведение
Функция ДополнительныеИсточникиДанныхДляДвижений(ИмяРегистра) Экспорт
ИсточникиДанных = Новый Соответствие;
Возврат ИсточникиДанных;
КонецФункции
Процедура ЗаполнитьПараметрыИнициализации(Запрос, ДокументСсылка)
Запрос.МенеджерВременныхТаблиц = Новый МенеджерВременныхТаблиц;
Запрос.УстановитьПараметр("Ссылка", ДокументСсылка);
Запрос.Текст =
"ВЫБРАТЬ
| ДанныеДокумента.Ссылка КАК Ссылка,
| ДанныеДокумента.Дата КАК Период,
| ДанныеДокумента.БонуснаяПрограммаЛояльности КАК БонуснаяПрограммаЛояльности,
| ДанныеДокумента.ПериодДействия КАК ПериодДействия,
| ДанныеДокумента.КоличествоПериодовДействия КАК КоличествоПериодовДействия,
| ДанныеДокумента.ПериодОтсрочкиНачалаДействия КАК ПериодОтсрочкиНачалаДействия,
| ДанныеДокумента.КоличествоПериодовОтсрочкиНачалаДействия КАК КоличествоПериодовОтсрочкиНачалаДействия,
| ДанныеДокумента.ДатаОкончанияСрокаДействия КАК ДатаОкончанияСрокаДействия
|ИЗ
| Документ.НачислениеИСписаниеБонусныхБаллов КАК ДанныеДокумента
|ГДЕ
| ДанныеДокумента.Ссылка = &Ссылка";
Реквизиты = Запрос.Выполнить().Выбрать();
Реквизиты.Следующий();
Запрос.УстановитьПараметр("Ссылка", Реквизиты.Ссылка);
Запрос.УстановитьПараметр("Период", Реквизиты.Период);
Запрос.УстановитьПараметр("БонуснаяПрограммаЛояльности", Реквизиты.БонуснаяПрограммаЛояльности);
Запрос.УстановитьПараметр("ПериодДействия", Реквизиты.ПериодДействия);
Запрос.УстановитьПараметр("КоличествоПериодовДействия", Реквизиты.КоличествоПериодовДействия);
Запрос.УстановитьПараметр("ПериодОтсрочкиНачалаДействия", Реквизиты.ПериодОтсрочкиНачалаДействия);
Запрос.УстановитьПараметр("КоличествоПериодовОтсрочкиНачалаДействия", Реквизиты.КоличествоПериодовОтсрочкиНачалаДействия);
Запрос.УстановитьПараметр("ДатаОкончанияСрокаДействия", Реквизиты.ДатаОкончанияСрокаДействия);
Запрос.УстановитьПараметр("ТекущаяДата", ТекущаяУниверсальнаяДата());
Запрос.УстановитьПараметр("ДатаНачалаРаботыМеханизмаБонусныхБаллов_2_5", Константы.ДатаНачалаРаботыМеханизмаБонусныхБаллов_2_5.Получить());
ЭтоСрочныеБонунсыеБаллы = Реквизиты.КоличествоПериодовДействия > 0
ИЛИ ЗначениеЗаполнено(Реквизиты.ДатаОкончанияСрокаДействия);
Запрос.УстановитьПараметр("ЭтоСрочныеБонунсыеБаллы", ЭтоСрочныеБонунсыеБаллы);
ДатаНачалаДействияБаллов = ДатаНачалаДействияБаллов(
Реквизиты.Период,
Реквизиты.ПериодОтсрочкиНачалаДействия,
Реквизиты.КоличествоПериодовОтсрочкиНачалаДействия);
Запрос.УстановитьПараметр("ДатаНачалаДействияБаллов", ДатаНачалаДействияБаллов);
ДатаОкончанияДействияБаллов = ДатаОкончанияДействияБаллов(
ДатаНачалаДействияБаллов,
Реквизиты.ДатаОкончанияСрокаДействия,
Реквизиты.ПериодДействия,
Реквизиты.КоличествоПериодовДействия);
Запрос.УстановитьПараметр("ДатаОкончанияДействияБаллов", ДатаОкончанияДействияБаллов);
КонецПроцедуры
Функция ТекстЗапросаБонусныеБаллы(Запрос, ТекстыЗапроса, Регистры)
ИмяРегистра = "БонусныеБаллы";
Если НЕ ПроведениеДокументов.ТребуетсяТаблицаДляДвижений(ИмяРегистра, Регистры) Тогда
Возврат "";
КонецЕсли;
Если НЕ ПроведениеДокументов.ЕстьТаблицаЗапроса("ВтБонусныеБаллы", ТекстыЗапроса) Тогда
ТекстЗапросаВтБонусныеБаллы(Запрос, ТекстыЗапроса);
КонецЕсли;
ТекстЗапроса =
"ВЫБРАТЬ
| БонусныеБаллы.Период КАК Период,
| БонусныеБаллы.ДатаНачалаДействия КАК ДатаНачалаДействия,
| БонусныеБаллы.ДатаКОбработке КАК ДатаКОбработке,
| БонусныеБаллы.ВидДвижения КАК ВидДвижения,
| БонусныеБаллы.БонуснаяПрограммаЛояльности КАК БонуснаяПрограммаЛояльности,
| БонусныеБаллы.Партнер КАК Партнер,
| СУММА(БонусныеБаллы.Начислено) КАК Начислено,
| СУММА(БонусныеБаллы.КСписанию) КАК КСписанию
|ИЗ
| ВтБонусныеБаллы КАК БонусныеБаллы
|СГРУППИРОВАТЬ ПО
| БонусныеБаллы.БонуснаяПрограммаЛояльности,
| БонусныеБаллы.Партнер,
| БонусныеБаллы.Период,
| БонусныеБаллы.ДатаНачалаДействия,
| БонусныеБаллы.ДатаКОбработке,
| БонусныеБаллы.ВидДвижения
|ИМЕЮЩИЕ
| СУММА(БонусныеБаллы.Начислено) <> 0 ИЛИ
| СУММА(БонусныеБаллы.КСписанию) <> 0
|";
ТекстыЗапроса.Добавить(ТекстЗапроса, ИмяРегистра);
Возврат ТекстЗапроса;
КонецФункции
Функция ТекстЗапросаВтБонусныеБаллы(Запрос, ТекстыЗапроса)
ИмяРегистра = "ВтБонусныеБаллы";
ТекстЗапроса =
"ВЫБРАТЬ
| &ДатаНачалаДействияБаллов КАК Период,
| ВЫБОР
| КОГДА НАЧАЛОПЕРИОДА(&ДатаОкончанияДействияБаллов,
| ДЕНЬ) >= НАЧАЛОПЕРИОДА(&ДатаНачалаРаботыМеханизмаБонусныхБаллов_2_5, ДЕНЬ)
| ТОГДА НАЧАЛОПЕРИОДА(&ДатаНачалаДействияБаллов, ДЕНЬ)
| ИНАЧЕ ДАТАВРЕМЯ(1, 1, 1)
| КОНЕЦ КАК ДатаНачалаДействия,
| ВЫБОР
| КОГДА НАЧАЛОПЕРИОДА(&ДатаОкончанияДействияБаллов,
| ДЕНЬ) >= НАЧАЛОПЕРИОДА(&ДатаНачалаРаботыМеханизмаБонусныхБаллов_2_5, ДЕНЬ)
| ТОГДА &ТекущаяДата
| ИНАЧЕ ДАТАВРЕМЯ(1, 1, 1)
| КОНЕЦ КАК ДатаКОбработке,
| ЗНАЧЕНИЕ(ВидДвиженияНакопления.Приход) КАК ВидДвижения,
| &БонуснаяПрограммаЛояльности КАК БонуснаяПрограммаЛояльности,
| ТабличнаяЧасть.Партнер КАК Партнер,
| ТабличнаяЧасть.Баллы КАК Начислено,
| 0 КАК КСписанию
|ПОМЕСТИТЬ ВтБонусныеБаллы
|ИЗ
| Документ.НачислениеИСписаниеБонусныхБаллов.Начисление КАК ТабличнаяЧасть
|ГДЕ
| ТабличнаяЧасть.Ссылка = &Ссылка
|
|ОБЪЕДИНИТЬ ВСЕ
|
|ВЫБРАТЬ
| &ДатаОкончанияДействияБаллов,
| ВЫБОР
| КОГДА НАЧАЛОПЕРИОДА(&ДатаОкончанияДействияБаллов,
| ДЕНЬ) >= НАЧАЛОПЕРИОДА(&ДатаНачалаРаботыМеханизмаБонусныхБаллов_2_5, ДЕНЬ)
| ТОГДА НАЧАЛОПЕРИОДА(&ДатаНачалаДействияБаллов, ДЕНЬ)
| ИНАЧЕ ДАТАВРЕМЯ(1, 1, 1)
| КОНЕЦ,
| ВЫБОР
| КОГДА НАЧАЛОПЕРИОДА(&ДатаОкончанияДействияБаллов,
| ДЕНЬ) >= НАЧАЛОПЕРИОДА(&ДатаНачалаРаботыМеханизмаБонусныхБаллов_2_5, ДЕНЬ)
| ТОГДА &ТекущаяДата
| ИНАЧЕ ДАТАВРЕМЯ(1, 1, 1)
| КОНЕЦ,
| ЗНАЧЕНИЕ(ВидДвиженияНакопления.Приход),
| &БонуснаяПрограммаЛояльности,
| ТабличнаяЧасть.Партнер,
| 0,
| ТабличнаяЧасть.Баллы
|ИЗ
| Документ.НачислениеИСписаниеБонусныхБаллов.Начисление КАК ТабличнаяЧасть
|ГДЕ
| ТабличнаяЧасть.Ссылка = &Ссылка
| И &ЭтоСрочныеБонунсыеБаллы
|
|ОБЪЕДИНИТЬ ВСЕ
|
|ВЫБРАТЬ
| НАЧАЛОПЕРИОДА(&Период, ДЕНЬ),
| ДАТАВРЕМЯ(1, 1, 1),
| ВЫБОР
| КОГДА НАЧАЛОПЕРИОДА(&Период, ДЕНЬ) >= НАЧАЛОПЕРИОДА(&ДатаНачалаРаботыМеханизмаБонусныхБаллов_2_5, ДЕНЬ)
| ТОГДА &ТекущаяДата
| ИНАЧЕ ДАТАВРЕМЯ(1, 1, 1)
| КОНЕЦ,
| ЗНАЧЕНИЕ(ВидДвиженияНакопления.Расход),
| &БонуснаяПрограммаЛояльности,
| ТабличнаяЧасть.Партнер,
| ТабличнаяЧасть.Баллы,
| ВЫБОР
| КОГДА НАЧАЛОПЕРИОДА(&Период, ДЕНЬ) >= НАЧАЛОПЕРИОДА(&ДатаНачалаРаботыМеханизмаБонусныхБаллов_2_5, ДЕНЬ)
| ТОГДА 0
| ИНАЧЕ ТабличнаяЧасть.Баллы
| КОНЕЦ
|ИЗ
| Документ.НачислениеИСписаниеБонусныхБаллов.Списание КАК ТабличнаяЧасть
|ГДЕ
| ТабличнаяЧасть.Ссылка = &Ссылка";
ТекстыЗапроса.Добавить(ТекстЗапроса, ИмяРегистра);
Возврат ТекстЗапроса;
КонецФункции
#КонецОбласти
Функция ДатаНачалаДействияБаллов(Период, ВидПериода, КоличествоПериодовОтсрочки)
ДатаНачалаДействияБаллов = Период;
Если КоличествоПериодовОтсрочки > 0 Тогда
ДатаНачалаДействияБаллов = РозничныеПродажиКлиентСервер.РассчитатьИнтервалПериода(
Период,
ВидПериода,
КоличествоПериодовОтсрочки);
КонецЕсли;
Возврат НачалоДня(ДатаНачалаДействияБаллов);
КонецФункции
Функция ДатаОкончанияДействияБаллов(ПериодНачало, ПериодОкончание, ВидПериода, КоличествоПериодовОтсрочки)
Если НЕ ЗначениеЗаполнено(ПериодОкончание) И КоличествоПериодовОтсрочки = 0 Тогда
Возврат Дата(1, 1, 1);
КонецЕсли;
ДатаОкончанияДействияБаллов = ПериодОкончание;
Если КоличествоПериодовОтсрочки > 0 Тогда
ДатаОкончанияДействияБаллов = РозничныеПродажиКлиентСервер.РассчитатьИнтервалПериода(
ПериодНачало,
ВидПериода,
КоличествоПериодовОтсрочки);
КонецЕсли;
Возврат НачалоДня(ДатаОкончанияДействияБаллов);
КонецФункции
#КонецОбласти
#КонецЕсли