Начисление и списание бонусных баллов / Модуль менеджера

файл
#Если Сервер Или ТолстыйКлиентОбычноеПриложение Или ВнешнееСоединение Тогда

#Область ПрограммныйИнтерфейс

#Область Проведение

// Описывает учетные механизмы используемые в документе для регистрации в механизме проведения.
//
// Параметры:
//  МеханизмыДокумента - Массив - список имен учетных механизмов, для которых будет выполнена
//              регистрация в механизме проведения.
//
Процедура ЗарегистрироватьУчетныеМеханизмы(МеханизмыДокумента) Экспорт
	
	МеханизмыДокумента.Добавить("ЦеныИСкидки");
	
КонецПроцедуры

// Возвращает таблицы для движений, необходимые для проведения документа по регистрам учетных механизмов.
//
// Параметры:
//  Документ - ДокументСсылка, ДокументОбъект - ссылка на документ или объект, по которому необходимо получить данные
//  Регистры - Структура - список имен регистров, для которых необходимо получить таблицы
//  ДопПараметры - Структура - дополнительные параметры для получения данных, определяющие контекст проведения.
//
// Возвращаемое значение:
//  Структура - коллекция элементов - таблиц значений - данных для отражения в регистр.
//
Функция ДанныеДокументаДляПроведения(Документ, Регистры, ДопПараметры = Неопределено) Экспорт
	
	Если ДопПараметры = Неопределено Тогда
		ДопПараметры = ПроведениеДокументов.ДопПараметрыИнициализироватьДанныеДокументаДляПроведения();
	КонецЕсли;
	
	Если ТипЗнч(Документ) = Тип("ДокументОбъект.НачислениеИСписаниеБонусныхБаллов") Тогда
		ДокументСсылка = Документ.Ссылка;
	Иначе
		ДокументСсылка = Документ;
	КонецЕсли;
	
	Запрос			= Новый Запрос;
	ТекстыЗапроса	= Новый СписокЗначений;
	
	Если Не ДопПараметры.ПолучитьТекстыЗапроса Тогда
		////////////////////////////////////////////////////////////////////////////
		// Создадим запрос инициализации движений
		
		ЗаполнитьПараметрыИнициализации(Запрос, ДокументСсылка);
		
		////////////////////////////////////////////////////////////////////////////
		// Сформируем текст запроса
		
		ТекстЗапросаБонусныеБаллы(Запрос, ТекстыЗапроса, Регистры);
	КонецЕсли;
	
	////////////////////////////////////////////////////////////////////////////
	// Получим таблицы для движений
	
	Возврат ПроведениеДокументов.ИнициализироватьДанныеДокументаДляПроведения(Запрос, ТекстыЗапроса, ДопПараметры);
	
КонецФункции

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

// Определяет список команд создания на основании.
//
// Параметры:
//  КомандыСозданияНаОсновании - см. СозданиеНаОснованииПереопределяемый.ПередДобавлениемКомандСозданияНаОсновании.КомандыСозданияНаОсновании
//  Параметры - см. СозданиеНаОснованииПереопределяемый.ПередДобавлениемКомандСозданияНаОсновании.Параметры
//
Процедура ДобавитьКомандыСозданияНаОсновании(КомандыСозданияНаОсновании, Параметры) Экспорт
	
	
	
КонецПроцедуры

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

		Возврат КомандаСоздатьНаОсновании;
	КонецЕсли;

	Возврат Неопределено;
КонецФункции

// Определяет список команд отчетов.
//
// Параметры:
//   КомандыОтчетов - См. ВариантыОтчетовПереопределяемый.ПередДобавлениемКомандОтчетов.КомандыОтчетов
//   Параметры - См. ВариантыОтчетовПереопределяемый.ПередДобавлениемКомандОтчетов.Параметры
//
Процедура ДобавитьКомандыОтчетов(КомандыОтчетов, Параметры) Экспорт
	
	
	
КонецПроцедуры

// СтандартныеПодсистемы.ВерсионированиеОбъектов
// Определяет настройки объекта для подсистемы ВерсионированиеОбъектов.
//
// Параметры:
// Настройки - Структура - настройки подсистемы.
Процедура ПриОпределенииНастроекВерсионированияОбъектов(Настройки) Экспорт
КонецПроцедуры
// Конец СтандартныеПодсистемы.ВерсионированиеОбъектов

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

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

#Область Проведение

Функция ДополнительныеИсточникиДанныхДляДвижений(ИмяРегистра) Экспорт

	ИсточникиДанных = Новый Соответствие;

	Возврат ИсточникиДанных; 

КонецФункции

Процедура ЗаполнитьПараметрыИнициализации(Запрос, ДокументСсылка)
	
	Запрос.МенеджерВременныхТаблиц = Новый МенеджерВременныхТаблиц;
	Запрос.УстановитьПараметр("Ссылка", ДокументСсылка);
	Запрос.Текст =
	"ВЫБРАТЬ
	|	ДанныеДокумента.Ссылка                                   КАК Ссылка,
	|	ДанныеДокумента.Дата                                     КАК Период,
	|	ДанныеДокумента.БонуснаяПрограммаЛояльности              КАК БонуснаяПрограммаЛояльности,
	|	ДанныеДокумента.ПериодДействия                           КАК ПериодДействия,
	|	ДанныеДокумента.КоличествоПериодовДействия               КАК КоличествоПериодовДействия,
	|	ДанныеДокумента.ПериодОтсрочкиНачалаДействия             КАК ПериодОтсрочкиНачалаДействия,
	|	ДанныеДокумента.КоличествоПериодовОтсрочкиНачалаДействия КАК КоличествоПериодовОтсрочкиНачалаДействия,
	|	ДанныеДокумента.ДатаОкончанияСрокаДействия               КАК ДатаОкончанияСрокаДействия
	|ИЗ
	|	Документ.НачислениеИСписаниеБонусныхБаллов КАК ДанныеДокумента
	|ГДЕ
	|	ДанныеДокумента.Ссылка = &Ссылка";
	Реквизиты = Запрос.Выполнить().Выбрать();
	Реквизиты.Следующий();
	
	Запрос.УстановитьПараметр("Ссылка",                                   Реквизиты.Ссылка);
	Запрос.УстановитьПараметр("Период",                                   Реквизиты.Период);
	Запрос.УстановитьПараметр("БонуснаяПрограммаЛояльности",              Реквизиты.БонуснаяПрограммаЛояльности);
	Запрос.УстановитьПараметр("ПериодДействия",                           Реквизиты.ПериодДействия);
	Запрос.УстановитьПараметр("КоличествоПериодовДействия",               Реквизиты.КоличествоПериодовДействия);
	Запрос.УстановитьПараметр("ПериодОтсрочкиНачалаДействия",             Реквизиты.ПериодОтсрочкиНачалаДействия);
	Запрос.УстановитьПараметр("КоличествоПериодовОтсрочкиНачалаДействия", Реквизиты.КоличествоПериодовОтсрочкиНачалаДействия);
	Запрос.УстановитьПараметр("ДатаОкончанияСрокаДействия",               Реквизиты.ДатаОкончанияСрокаДействия);
	Запрос.УстановитьПараметр("ТекущаяДата",                              ТекущаяУниверсальнаяДата());
	Запрос.УстановитьПараметр("ДатаНачалаРаботыМеханизмаБонусныхБаллов_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 Тогда
		
		ДатаОкончанияДействияБаллов = РозничныеПродажиКлиентСервер.РассчитатьИнтервалПериода(
			ПериодНачало,
			ВидПериода,
			КоличествоПериодовОтсрочки);
		
	КонецЕсли;
	
	Возврат НачалоДня(ДатаОкончанияДействияБаллов);
	
КонецФункции

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

#КонецЕсли

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