Чек ККМ / Форма смешанной оплаты / Модуль формы

файл

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

&НаСервере
Процедура ПриСозданииНаСервере(Отказ, СтандартнаяОбработка)
	
	// Пропускаем инициализацию, чтобы гарантировать получение формы при передаче параметра "АвтоТест".
	Если Параметры.Свойство("АвтоТест") Тогда
		Возврат;
	КонецЕсли;
	
	РозничныеПродажи.ПодписатьГорячиеКлавишиНаКнопках(ЭтотОбъект);
	Дисплеи.ЗагрузитьЗначения(МенеджерОборудованияВызовСервера.ОборудованиеПоПараметрам("ДисплейПокупателя"));
	АвтоматическиСоздаватьПартнеров = Константы.АвтоматическиСоздаватьПартнеровПриОтправкеЭлектронногоЧекаПокупателю.Получить();
	АвтоматическиОбновлятьКонтактыПартнеров = Константы.ОбновлятьКонтактнуюИнформациюПартнеровПриОтправкеЭлектронныхЧеков.Получить();
	
	//++ Локализация
	ОтправкаЭлектронныхЧековПослеПробитияЧека = Константы.ОтправкаЭлектронныхЧековПослеПробитияЧека.Получить();
	//-- Локализация
	
	КоличествоСимволовПослеЗапятой = 2;
	РазделительЦелойИДробнойЧасти = Сред(Формат(1.1, "ЧЦ=2; ЧДЦ=1"),2,1);
	ПолученоНаличнымиФорматПредставленияЦелыхЧисел = "ЧН=0; ЧГ=3,0";
	
	ИнформацияОбОплате = Параметры.ИнформацияОбОплате;
	Документ = ИнформацияОбОплате.Документ;
	
	КОплате           = ИнформацияОбОплате.СуммаКОплате;
	ПолученоНаличными = Формат(ИнформацияОбОплате.Наличные, ПолученоНаличнымиФорматПредставленияЦелыхЧисел);
	ОплаченоСертификатами = ИнформацияОбОплате.ПодарочныеСертификаты;
	ОплаченоБонуснымиБаллами = ИнформацияОбОплате.БонусныеБаллы;
	
	КлючСохраненияПоложенияОкна = "377c7c49-b1da-44f8-bcc6-8f35916a4354";

	ЭтоПолнаяОплатаПлатежнойКартой = Ложь;
	ЭтоПолнаяОплатаПодарочнымиСертификатами = Ложь;
	ЭтоПолнаяОплатаЧерезСБП = Ложь;
	
	ЭтоВозврат = Ложь;
	ЭтоПолныйВозвратВСменуПродажи = Ложь;
	Если ТипЗнч(Документ) = Тип("ДокументСсылка.ЧекККМВозврат")
		ИЛИ ТипЗнч(Документ) = Тип("ДокументСсылка.ВозвратПодарочныхСертификатов") Тогда
		КлючСохраненияПоложенияОкна = "e5abb7c5-8718-44b7-9eaf-728457d19608";
		ЭтоВозврат = Истина;
		ОплаченоПлатежнымиКартами = ИнформацияОбОплате.ПлатежныеКартыОтменено;
		Если Параметры.Свойство("ЭтоПолныйВозвратВСменуПродажи") 
			И Параметры.ЭтоПолныйВозвратВСменуПродажи = Истина Тогда
			ЭтоПолныйВозвратВСменуПродажи = Истина;
		КонецЕсли;
		
		Если Параметры.Свойство("СтатусОплатыСБПЧекаПродажи") Тогда
			СтатусОплатыСБПЧекаПродажи = Параметры.СтатусОплатыСБПЧекаПродажи;
		КонецЕсли;
	Иначе
		ОплаченоПлатежнымиКартами = ИнформацияОбОплате.ПлатежныеКарты;
	КонецЕсли;
	Если КОплате = ОплаченоПлатежнымиКартами Тогда
		КлючСохраненияПоложенияОкна = "06cf07e4-6da2-4e18-910e-e9eb70d61006";
		ЭтоПолнаяОплатаПлатежнойКартой = Истина;
	ИначеЕсли КОплате = ОплаченоСертификатами Тогда
		КлючСохраненияПоложенияОкна = "2c9507fb-3fc6-4175-bbd9-1a05f3aded5c";
		ЭтоПолнаяОплатаПодарочнымиСертификатами = Истина;
	КонецЕсли;
	ПриСозданииНаСервереЛокализация(ИнформацияОбОплате);
	
	НастроитьВидимостьЭлементов(ИнформацияОбОплате);
	
	Элементы.ГруппаОтправкаЭлектронногоЧека.Видимость = Истина;
	ЦветФонаВыделенияПоля = ЦветаСтиля.ЦветФонаВыделения;
	
	Партнер = Параметры.Партнер;
	РозничныеПродажи.ЗаполнитьПараметрыОтправкиЭлектронногоЧекаПоПартнеру(ЭтотОбъект);
	
	РозничныеПродажиКлиентСервер.УстановитьАктивныйЭлемент(ЭтотОбъект, Элементы.ПолеПолученоНаличными);
	РозничныеПродажиКлиентСервер.УстановитьДоступностьКнопокКлавиатурыФормыСмешаннойОплаты(ЭтотОбъект);
	Телефон = РозничныеПродажиКлиентСервер.ОтформатироватьНомерТелефона(Телефон10Знаков);
	
	РассчитатьИтоги(ЭтотОбъект, ИнформацияОбОплате);
	
КонецПроцедуры

&НаКлиенте
Процедура ПриЗакрытии(ЗавершениеРаботы)
	
	ТекущееОповещение = ОписаниеОповещенияОЗакрытии;
	Если ЗавершениеРаботы 
		И ТипЗнч(ТекущееОповещение) = Тип("ОписаниеОповещения")
		И ТипЗнч(ТекущееОповещение.ДополнительныеПараметры) = Тип("Структура")Тогда
		
		ТекущееОповещение.ДополнительныеПараметры.Вставить("ЗавершениеРаботы", ЗавершениеРаботы);
		
	КонецЕсли;
	
КонецПроцедуры

&НаКлиенте
Процедура ПриОткрытии(Отказ)
	
	ПодключитьОбработчикОжидания("ВывестиИнформациюНаДисплейПокупателя", 0.1, Истина);
	
	ПодключитьОбработчикОжидания("УстановитьАктивностьЭлементов", 1, Ложь);
	
КонецПроцедуры

&НаКлиенте
Процедура ПередЗакрытием(Отказ, ЗавершениеРаботы, ТекстПредупреждения, СтандартнаяОбработка)
	
	Если ПринудительноЗакрытьФорму ИЛИ ЗавершениеРаботы Тогда
		Возврат;
	КонецЕсли;
	
	ПередЗакрытиемНаКлиенте(Отказ);
	
КонецПроцедуры

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

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

&НаКлиенте
Процедура ТелефонПриИзменении(Элемент)
	
	Телефон10Знаков = РозничныеПродажиКлиентСервер.НомерТелефонаВФормате10Знаков(Телефон);
	
КонецПроцедуры

&НаКлиенте
Процедура EmailПриИзменении(Элемент)
	
	РозничныеПродажиКлиентСервер.УстановитьВариантОтправкиЭлектронногоЧека(
		ЭтотОбъект,
		ПредопределенноеЗначение("Перечисление.ВариантыОтправкиЭлектронногоЧекаПокупателю.ОтправитьEmail"));
	
КонецПроцедуры

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

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

&НаКлиенте
Процедура Команда0(Команда)
	
	ДобавитьЦифру("0")
	
КонецПроцедуры

&НаКлиенте
Процедура Команда1(Команда)
	
	ДобавитьЦифру("1")
	
КонецПроцедуры

&НаКлиенте
Процедура Команда2(Команда)
	
	ДобавитьЦифру("2")
	
КонецПроцедуры

&НаКлиенте
Процедура Команда3(Команда)
	
	ДобавитьЦифру("3")
	
КонецПроцедуры

&НаКлиенте
Процедура Команда4(Команда)
	
	ДобавитьЦифру("4")
	
КонецПроцедуры

&НаКлиенте
Процедура Команда5(Команда)
	
	ДобавитьЦифру("5")
	
КонецПроцедуры

&НаКлиенте
Процедура Команда6(Команда)
	
	ДобавитьЦифру("6")
	
КонецПроцедуры

&НаКлиенте
Процедура Команда7(Команда)
	
	ДобавитьЦифру("7")
	
КонецПроцедуры

&НаКлиенте
Процедура Команда8(Команда)
	
	ДобавитьЦифру("8")
	
КонецПроцедуры

&НаКлиенте
Процедура Команда9(Команда)
	
	ДобавитьЦифру("9")
	
КонецПроцедуры

&НаКлиенте
Процедура Команда0ПраваяКлавиатура(Команда)
	
	ДобавитьЦифру("0")
	
КонецПроцедуры

&НаКлиенте
Процедура Команда1ПраваяКлавиатура(Команда)
	
	ДобавитьЦифру("1")
	
КонецПроцедуры

&НаКлиенте
Процедура Команда2ПраваяКлавиатура(Команда)
	
	ДобавитьЦифру("2")
	
КонецПроцедуры

&НаКлиенте
Процедура Команда3ПраваяКлавиатура(Команда)
	
	ДобавитьЦифру("3")
	
КонецПроцедуры

&НаКлиенте
Процедура Команда4ПраваяКлавиатура(Команда)
	
	ДобавитьЦифру("4")
	
КонецПроцедуры

&НаКлиенте
Процедура Команда5ПраваяКлавиатура(Команда)
	
	ДобавитьЦифру("5")
	
КонецПроцедуры

&НаКлиенте
Процедура Команда6ПраваяКлавиатура(Команда)
	
	ДобавитьЦифру("6")
	
КонецПроцедуры

&НаКлиенте
Процедура Команда7ПраваяКлавиатура(Команда)
	
	ДобавитьЦифру("7")
	
КонецПроцедуры

&НаКлиенте
Процедура Команда8ПраваяКлавиатура(Команда)
	
	ДобавитьЦифру("8")
	
КонецПроцедуры

&НаКлиенте
Процедура Команда9ПраваяКлавиатура(Команда)
	
	ДобавитьЦифру("9")
	
КонецПроцедуры

&НаКлиенте
Процедура КомандаТочка(Команда)
	
	Если АктивноеПоле = Элементы.ПолеПолученоНаличными.Имя Тогда
		
		Если ПолученоНаличными = "" Тогда
			ПолученоНаличными = "0";
		КонецЕсли;
		
		Если Не ПолученоНаличнымиЭтоДробноеЧисло Тогда
			ПолученоНаличнымиЭтоДробноеЧисло = Истина;
			ПолученоНаличными = ПолученоНаличными + РазделительЦелойИДробнойЧасти;
		КонецЕсли;
		
		РассчитатьИтоги(ЭтотОбъект);
		ПодключитьОбработчикОжидания("ВывестиИнформациюНаДисплейПокупателя", 0.1, Истина);
		
	Иначе
		
		Телефон10Знаков = "";
		
	КонецЕсли;
	
КонецПроцедуры

&НаКлиенте
Процедура КомандаСтереть(Команда)
	
	Если АктивноеПоле = Элементы.ПолеПолученоНаличными.Имя Тогда
		
		ПолученоНаличными = "0";
		ПолученоНаличнымиЭтоДробноеЧисло = Ложь;
		
		РассчитатьИтоги(ЭтотОбъект);
		ПодключитьОбработчикОжидания("ВывестиИнформациюНаДисплейПокупателя", 0.1, Истина);
		
	ИначеЕсли АктивноеПоле = Элементы.Телефон.Имя Тогда
		
		Телефон10Знаков = "";
		Телефон = РозничныеПродажиКлиентСервер.ОтформатироватьНомерТелефона(Телефон10Знаков);
		
	ИначеЕсли АктивноеПоле = Элементы.Email.Имя Тогда
		
		Email = "";
		
	КонецЕсли;
	
КонецПроцедуры

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

&НаКлиенте
Процедура ЗакрытьФорму(Команда)
	
	ПередЗакрытиемНаКлиенте(Истина);
	
КонецПроцедуры

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

&НаКлиенте
Процедура ОплатитьСБП(Команда)
	
	ОплатитьСБПЛокализация();
	
КонецПроцедуры

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

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

&НаКлиенте
Процедура КомандаСторно(Команда)
	
	ДополнительныеПараметры = Новый Структура;
	ДополнительныеПараметры.Вставить("ОповещениеВФормуОплаты", Новый ОписаниеОповещения("ОплатаЗавершение", ЭтотОбъект));
	ДополнительныеПараметры.Вставить("ПолученоНаличными", РозничныеПродажиКлиентСервер.ПривестиСтрокуКЧислу(ПолученоНаличными));
	
	ВыполнитьОбработкуОповещения(
		Новый ОписаниеОповещения("ОтменитьОплатыПлатежнымиКартами", ВладелецФормы, ДополнительныеПараметры),
		Истина);
	
КонецПроцедуры

&НаКлиенте
Процедура КомандаОтправитьSMS(Команда)
	
	РозничныеПродажиКлиентСервер.УстановитьАктивныйЭлемент(ЭтотОбъект, Элементы.Телефон);
	РозничныеПродажиКлиентСервер.УстановитьДоступностьКнопокКлавиатурыФормыСмешаннойОплаты(ЭтотОбъект);
	РозничныеПродажиКлиентСервер.УстановитьВариантОтправкиЭлектронногоЧека(
		ЭтотОбъект,
		ПредопределенноеЗначение("Перечисление.ВариантыОтправкиЭлектронногоЧекаПокупателю.ОтправитьSMS"));
	
КонецПроцедуры

&НаКлиенте
Процедура КомандаОтправитьEmail(Команда)
	
	РозничныеПродажиКлиентСервер.УстановитьАктивныйЭлемент(ЭтотОбъект, Элементы.Email);
	РозничныеПродажиКлиентСервер.УстановитьДоступностьКнопокКлавиатурыФормыСмешаннойОплаты(ЭтотОбъект);
	РозничныеПродажиКлиентСервер.УстановитьВариантОтправкиЭлектронногоЧека(
		ЭтотОбъект,
		ПредопределенноеЗначение("Перечисление.ВариантыОтправкиЭлектронногоЧекаПокупателю.ОтправитьEmail"));
	
КонецПроцедуры

&НаКлиенте
Процедура КомандаОтправкаНеТребуется(Команда)
	
	РозничныеПродажиКлиентСервер.УстановитьВариантОтправкиЭлектронногоЧека(
		ЭтотОбъект,
		ПредопределенноеЗначение("Перечисление.ВариантыОтправкиЭлектронногоЧекаПокупателю.НеОтправлять"));
	
КонецПроцедуры

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

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

&НаКлиенте
Процедура ДобавитьЦифру(ВведеннаяЦифраСтрокой)
	
	Если АктивноеПоле = Элементы.ПолеПолученоНаличными.Имя Тогда
	
		Запятая = Сред(ПолученоНаличными, СтрДлина(ПолученоНаличными) - КоличествоСимволовПослеЗапятой, 1);
		ЗапятаяВКонцеСтроки = Прав(ПолученоНаличными,1) = РазделительЦелойИДробнойЧасти;
		
		ПолученоНаличнымиЦелаяЧастьЧислом = Цел(РозничныеПродажиКлиентСервер.ПривестиСтрокуКЧислу(ПолученоНаличными));
		ПолученоНаличнымиЦелаяЧасть = Формат(ПолученоНаличнымиЦелаяЧастьЧислом, "ЧН=0; ЧГ=0");
		ПолученоНаличнымиДробнаяЧасть = Прав(ПолученоНаличными, СтрДлина(ПолученоНаличными) - СтрДлина(Формат(ПолученоНаличнымиЦелаяЧастьЧислом, ПолученоНаличнымиФорматПредставленияЦелыхЧисел)));
		
		Если ПолученоНаличнымиЭтоДробноеЧисло Тогда
			Если Не Запятая = РазделительЦелойИДробнойЧасти Тогда
				ПолученоНаличнымиДробнаяЧасть = ПолученоНаличнымиДробнаяЧасть + ВведеннаяЦифраСтрокой;
			Иначе
				Возврат;
			КонецЕсли;
		Иначе
			ПолученоНаличнымиЦелаяЧасть = ПолученоНаличнымиЦелаяЧасть + ВведеннаяЦифраСтрокой;
		КонецЕсли;
		
		ПолученоНаличными = Формат(Число(ПолученоНаличнымиЦелаяЧасть), ПолученоНаличнымиФорматПредставленияЦелыхЧисел) + ПолученоНаличнымиДробнаяЧасть;
		
		РассчитатьИтоги(ЭтотОбъект);
		ПодключитьОбработчикОжидания("ВывестиИнформациюНаДисплейПокупателя", 0.1, Истина);
		
	ИначеЕсли АктивноеПоле = Элементы.Телефон.Имя Тогда
		
		Телефон10Знаков = Телефон10Знаков + ВведеннаяЦифраСтрокой;
		Телефон = РозничныеПродажиКлиентСервер.ОтформатироватьНомерТелефона(Телефон10Знаков);
		
		Если СтрДлина(Телефон10Знаков) = 10 Тогда
			ТекущийЭлемент = Элементы.КомандаПробитьЧек;
		КонецЕсли;
		
		РозничныеПродажиКлиентСервер.УстановитьВариантОтправкиЭлектронногоЧека(
			ЭтотОбъект,
			ПредопределенноеЗначение("Перечисление.ВариантыОтправкиЭлектронногоЧекаПокупателю.ОтправитьSMS"));
		
	ИначеЕсли АктивноеПоле = Элементы.Email.Имя Тогда
		
		Email = СокрЛП(Email) + ВведеннаяЦифраСтрокой;
		
	КонецЕсли;
	
КонецПроцедуры

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

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

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

&НаСервере
Процедура НастроитьВидимостьЭлементов(ИнформацияОбОплате)
	
	ДоступныеВидыОплаты = ИнформацияОбОплате.ДоступныеВидыОплаты;
	
	Элементы.ПолеОплаченоПлатежнымиКартами.Видимость = ДоступныеВидыОплаты.ПлатежныеКарты;
	Элементы.ОплатаПлатежнаяКарта.Видимость          = ДоступныеВидыОплаты.ПлатежныеКарты;
	Элементы.КомандаСторно.Видимость                 = ДоступныеВидыОплаты.ПлатежныеКарты;
	
	Элементы.ПолеОплаченоСертификатами.Видимость     = ДоступныеВидыОплаты.ПодарочныеСертификаты;
	Элементы.ОплатаПодарочныйСертификат.Видимость    = ДоступныеВидыОплаты.ПодарочныеСертификаты;
	
	Элементы.ПолеОплаченоБонуснымиБаллами.Видимость  = ДоступныеВидыОплаты.БонусныеБаллы;
	Элементы.ОплатаБонусныеБаллы.Видимость           = ДоступныеВидыОплаты.БонусныеБаллы;
	
	Если ЭтоВозврат Тогда
		
		Заголовок = НСтр("ru = 'Возврат смешанной оплаты'");
		
		Элементы.КОплате.Заголовок      = НСтр("ru = 'К возврату'");
		Элементы.СуммаСдачи.Заголовок   = НСтр("ru = 'Получить сдачу'");
		Элементы.СуммаДоплаты.Заголовок = НСтр("ru = 'Осталось вернуть'");

		ОплатитьПлатежнойКартойЗаголовок       = НСтр("ru = 'Вернуть оплату на платежную карту'");
		ОплатитьПлатежнойКартойПодсказка       = НСтр("ru = 'Вернуть оплату на платежную карту'");
		Если ЭтоПолныйВозвратВСменуПродажи И ИнформацияОбОплате.ПлатежныеКарты > 0 Тогда
			ОплатитьПлатежнойКартойЗаголовок       = НСтр("ru = 'Отменить оплату платежными картами'");
			ОплатитьПлатежнойКартойПодсказка       = НСтр("ru = 'Отменить оплату платежными картами'");
		КонецЕсли;
		Команды.ОплатитьПлатежнойКартой.Заголовок = ОплатитьПлатежнойКартойЗаголовок;
		Команды.ОплатитьПлатежнойКартой.Подсказка = ОплатитьПлатежнойКартойПодсказка;
		Команды.ОплатитьПодарочнымСертификатом.Заголовок = НСтр("ru = 'Вернуть оплату подарочным сертификатом'");
		Команды.ОплатитьПодарочнымСертификатом.Подсказка = НСтр("ru = 'Вернуть оплату подарочным сертификатом'");
		Команды.ОплатитьБонуснымиБаллами.Заголовок = НСтр("ru = 'Отменить оплату бонусными баллами'");
		Команды.ОплатитьБонуснымиБаллами.Подсказка = НСтр("ru = 'Отменить оплату бонусными баллами'");
		
		Элементы.КомандаСторно.Видимость = Ложь;
		
	КонецЕсли;
	
	Если ЭтоПолнаяОплатаПлатежнойКартой Тогда
		
		Если ЭтоВозврат Тогда
			Заголовок = НСтр("ru = 'Возврат оплаты платежной картой'");
			Если ЭтоПолныйВозвратВСменуПродажи Тогда
				Заголовок = НСтр("ru = 'Отмена оплаты платежной картой'");
            КонецЕсли;
		Иначе
			Заголовок = НСтр("ru = 'Оплата платежной картой'");
		КонецЕсли;

		Элементы.КнопкаЗакрыть.Заголовок = НСтр("ru = 'Отменить оплату'");

		Элементы.ПолеПолученоНаличными.Видимость = Ложь;
		Элементы.ПолеОплаченоСертификатами.Видимость = Ложь;
		Элементы.ПолеОплаченоБонуснымиБаллами.Видимость = Ложь;
		Элементы.ПолеОплаченоСБП.Видимость = Ложь;
		Элементы.ГруппаВидыОплаты.Видимость = Ложь;
		
	ИначеЕсли ЭтоПолнаяОплатаПодарочнымиСертификатами Тогда
		
		Заголовок = НСтр("ru = 'Оплата подарочными сертификатами'");

		Элементы.КнопкаЗакрыть.Заголовок = НСтр("ru = 'Отменить оплату'");
		
		Элементы.ПолеПолученоНаличными.Видимость = Ложь;
		Элементы.ПолеОплаченоПлатежнымиКартами.Видимость = Ложь;
		Элементы.ПолеОплаченоБонуснымиБаллами.Видимость = Ложь;
		Элементы.ПолеОплаченоСБП.Видимость = Ложь;
		Элементы.ГруппаВидыОплаты.Видимость = Ложь;
		
	КонецЕсли;
	
	НастроитьВидимостьЭлементовЛокализация(ИнформацияОбОплате);
	
КонецПроцедуры

&НаКлиенте
Процедура ВывестиИнформациюНаДисплейПокупателя()
	
	Если Не ВводДоступен() Тогда
		Возврат;
	КонецЕсли;
	
	ФорматнаяСтрока = "ЧДЦ=2; ЧРГ=' '; ЧН=0.00; ЧГ=0";
	ДлинаТекста = 20;
	
	Если ТипЗнч(Документ) = Тип("ДокументСсылка.ЧекККМ")
		ИЛИ ТипЗнч(Документ) = Тип("ДокументСсылка.РеализацияПодарочныхСертификатов") Тогда
		ТекстКОплате = НСтр("ru = 'К оплате'")  + ":";
		ТекстСдача   = НСтр("ru = 'Сдача'")     + ":";
		ТекстДоплата = НСтр("ru = 'Доплатить'") + ":";
	Иначе
		ТекстКОплате = НСтр("ru = 'К возврату'") + ":";
		ТекстСдача   = НСтр("ru = 'Сдача'")      + ":";
		ТекстДоплата = НСтр("ru = 'Вернуть'")    + ":";
	КонецЕсли;
	
	ДПТекст1 = РозничныеПродажиКлиент.ПодготовитьСтрокуКВыводуНаДисплейПокупателя(ТекстКОплате, КОплате);
	
	Если СуммаДоплаты > 0 Тогда
		ДПТекст2 = РозничныеПродажиКлиент.ПодготовитьСтрокуКВыводуНаДисплейПокупателя(ТекстДоплата, СуммаДоплаты);
	ИначеЕсли СуммаСдачи > 0 Тогда
		ДПТекст2 = РозничныеПродажиКлиент.ПодготовитьСтрокуКВыводуНаДисплейПокупателя(ТекстСдача, СуммаСдачи);
	Иначе
		ДПТекст2 = "";
	КонецЕсли;
	
	РозничныеПродажиКлиент.ВывестиТекстНаДисплеиПокупателя(
		ВладелецФормы,
		Дисплеи,
		ДПТекст1 + Символы.ПС + ДПТекст2);
	
КонецПроцедуры

&НаКлиенте
Процедура УстановитьАктивностьЭлементов()
	
	РозничныеПродажиКлиентСервер.УстановитьАктивностьЭлементов(ЭтотОбъект);
	РозничныеПродажиКлиентСервер.УстановитьДоступностьКнопокКлавиатурыФормыСмешаннойОплаты(ЭтотОбъект);
	
КонецПроцедуры

&НаСервере
Функция ОбработатьДанныеЭлектронногоЧека()
	
	Возврат РозничныеПродажи.ОбработатьДанныеЭлектронногоЧека(ЭтотОбъект);
	
КонецФункции

&НаКлиенте
Функция ПараметрыЗакрытияФормы()
	
	ПараметрыЗакрытия = Новый Структура;
	ПараметрыЗакрытия.Вставить("Отмена", "Отмена");
	
	Возврат ПараметрыЗакрытия;
	
КонецФункции

&НаКлиенте
Процедура ПередЗакрытиемНаКлиенте(Отказ)
	
	Если РозничныеПродажиКлиентСервер.ПривестиСтрокуКЧислу(ПолученоНаличными) <> 0
		ИЛИ ОплаченоПлатежнымиКартами <> 0
		ИЛИ ОплаченоСертификатами <> 0
		ИЛИ ОплаченоБонуснымиБаллами
		ИЛИ ОплаченоСБП <> 0 Тогда
		
		Отказ = Истина;
		
		Если ЭтоВозврат Тогда
			
			Кнопки = Новый СписокЗначений;
			Кнопки.Добавить("ЗакрытьФорму", НСтр("ru = 'Закрыть окно'"));
			Кнопки.Добавить("Отмена", НСтр("ru = 'Отмена'"));
			
			
			МассивТекстВопроса = Новый Массив();
			Если ОплаченоПлатежнымиКартами <> 0 Тогда
				ТекстВопроса = НСтр("ru = 'Данные об отмене возврата на платежную карту отправлены в банк.'");
				МассивТекстВопроса.Добавить(ТекстВопроса);
			КонецЕсли;
			Если ОплаченоСБП <> 0 Тогда
				ТекстВопроса = НСтр("ru = 'Данные о возврате оплаты СБП отправлены в банк и банком подтверждена операция.'");
				МассивТекстВопроса.Добавить(ТекстВопроса);
			КонецЕсли;
			
			ТекстВопроса = НСтр("ru = 'Хотите закрыть окно с потерей введенных данных?'");
			МассивТекстВопроса.Добавить(ТекстВопроса);
			
			ПолныйТекстВопроса = "";
			Для Каждого ТекстВопроса Из МассивТекстВопроса Цикл
				Если ПолныйТекстВопроса <> "" Тогда
					ПолныйТекстВопроса = ПолныйТекстВопроса + Символы.ПС;
				КонецЕсли;
				
				ПолныйТекстВопроса = ПолныйТекстВопроса + ТекстВопроса;
			КонецЦикла;
			
			ПоказатьВопрос(
				Новый ОписаниеОповещения("ПередЗакрытиемВопросЗавершение", ЭтотОбъект),
				ПолныйТекстВопроса, Кнопки);
			
		Иначе
			
			Кнопки = Новый СписокЗначений;
			Кнопки.Добавить("ОтменитьОплату", НСтр("ru = 'Отменить оплату'"));
			Кнопки.Добавить("Отмена", НСтр("ru = 'Отмена'"));
			
			ТекстВопроса = НСтр("ru = 'Перед закрытием формы оплаты требуется отменить произведенную оплату.'");
			Если ОплаченоСБП <> 0 Тогда
				ТекстВопроса = НСтр("ru = 'По чеку проведена оплата СБП. Оплату СБП отменить нельзя, требуется пробить чек.
				                          |Отложить чек только в случае отказа оборудования до восстановления работы.
				                          |Откладывая чек другие произведенные формы оплаты потребуется отменить.'");
				Кнопки[0].Представление = НСтр("ru = 'Отложить чек'");
			КонецЕсли;
			
			ПоказатьВопрос(
				Новый ОписаниеОповещения("ПередЗакрытиемВопросЗавершение", ЭтотОбъект),
				ТекстВопроса, Кнопки);
				
		КонецЕсли;
		
	Иначе
		
		Закрыть(ПараметрыЗакрытияФормы().Отмена);
		
	КонецЕсли;
	
КонецПроцедуры

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

#Область Локализация

&НаСервере
Процедура НастроитьВидимостьЭлементовЛокализация(ИнформацияОбОплате)
	
	//++ Локализация
	ДоступныеВидыОплаты = ИнформацияОбОплате.ДоступныеВидыОплаты;
	РежимПолнойОплаты = ЭтоПолнаяОплатаПлатежнойКартой ИЛИ ЭтоПолнаяОплатаПодарочнымиСертификатами;
	
	Если ЭтоВозврат Тогда
		
		ВозвратНаОснованииПродажи = Истина;
		Если ТипЗнч(Документ) = Тип("ДокументСсылка.ЧекККМВозврат") Тогда
			ДокументОснование = ОбщегоНазначения.ЗначениеРеквизитаОбъекта(Документ, "ЧекККМ");
			ВозвратНаОснованииПродажи = ЗначениеЗаполнено(ДокументОснование);
		КонецЕсли;
		
		Элементы.ОплатаСБП.Заголовок = НСтр("ru = 'Возврат оплаты СБП'");
		
		Элементы.ПолеОплаченоСБП.Видимость = ВозвратНаОснованииПродажи И ИнформацияОбОплате.СБП > 0
												ИЛИ ДоступныеВидыОплаты.СБП И НЕ ВозвратНаОснованииПродажи;
		Элементы.ОплатаСБП.Видимость       = ВозвратНаОснованииПродажи И ИнформацияОбОплате.СБП > 0
												ИЛИ ДоступныеВидыОплаты.СБП И НЕ ВозвратНаОснованииПродажи;
		
		Если СтатусОплатыСБПЧекаПродажи = Перечисления.ТипыСтатусовОплатыСБП.ОжидаетПодтверждение Тогда
			Элементы.ОплатаСБП.Доступность = Ложь;
		Иначе
			Элементы.ОплатаСБП.Доступность = НЕ ИнформацияОбОплате.СБПОтменено > 0;
		КонецЕсли;
		
	Иначе
		
		Элементы.ПолеОплаченоСБП.Видимость = НЕ РежимПолнойОплаты И ДоступныеВидыОплаты.СБП;
		Элементы.ОплатаСБП.Видимость       = НЕ РежимПолнойОплаты И ДоступныеВидыОплаты.СБП;
		
		Элементы.ОплатаСБП.Доступность = НЕ ИнформацияОбОплате.СБП > 0;
		
	КонецЕсли;
	
	Если ЭтоПолнаяОплатаЧерезСБП Тогда
		
		Если ЭтоВозврат Тогда
			Заголовок = НСтр("ru = 'Возврат оплаты через СБП'");
		Иначе
			Заголовок = НСтр("ru = 'Оплата через СБП'");
		КонецЕсли;
		
		Если ОплаченоСБП = КОплате Тогда
			Элементы.КнопкаЗакрыть.Заголовок = НСтр("ru = 'Закрыть'");
		Иначе
			Элементы.КнопкаЗакрыть.Заголовок = НСтр("ru = 'Отменить оплату'");
		КонецЕсли;
		
		Элементы.ПолеПолученоНаличными.Видимость = Ложь;
		Элементы.ПолеОплаченоПлатежнымиКартами.Видимость = Ложь;
		Элементы.ПолеОплаченоСертификатами.Видимость = Ложь;
		Элементы.ПолеОплаченоБонуснымиБаллами.Видимость = Ложь;
		Элементы.ГруппаВидыОплаты.Видимость = Ложь;

	КонецЕсли
	//-- Локализация
	
КонецПроцедуры

&НаКлиенте
Процедура ОплатаЗавершениеЛокализация(ИнформацияОбОплате)
	
	//++ Локализация
	Если ЭтоВозврат Тогда
		ОплаченоСБП = ИнформацияОбОплате.СБПОтменено;
	Иначе
		ОплаченоСБП = ИнформацияОбОплате.СБП;
	КонецЕсли;
	//-- Локализация
	
КонецПроцедуры

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

&НаКлиенте
Функция ОтложитьЧекЛокализация(ИнформацияОбОплате)
	
	ОтложитьЧек = Ложь;
	
	//++ Локализация
	Если ИнформацияОбОплате.ИтогоОплачено = ИнформацияОбОплате.СБП Тогда
		ОтложитьЧек = Истина;
	КонецЕсли;
	//-- Локализация
	
	Возврат ОтложитьЧек;
	
КонецФункции

&НаСервере
Процедура ПриСозданииНаСервереЛокализация(ИнформацияОбОплате)
	
	//++ Локализация
	Если ЭтоВозврат Тогда
		ОплаченоСБП = ИнформацияОбОплате.СБПОтменено;
	Иначе
		ОплаченоСБП = ИнформацияОбОплате.СБП;
	КонецЕсли;
	
	Если КОплате = ОплаченоСБП Тогда
		КлючСохраненияПоложенияОкна = "07fb2c95-fc36-4517-d9bb-aded5c1a05f3";
		ЭтоПолнаяОплатаЧерезСБП = Истина;
	КонецЕсли;
	//-- Локализация
	
КонецПроцедуры

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


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