<?php 

/* Оплата через платежную систему Yandex.Деньги */
/* Возможна оплата как через интерфейс Яндекс.Денег и кошелек */
class system_of_pay_handler
{
	// Тип работы обработчика платежной системы:
	// 0 - прямой платеж на кошелек
	// 1 - платеж для магазина (нужно заключить договор с Яндекс.Деньги)
	var $type = 0;
	
	// ---------------------------------
	// НАСТРОЙКИ ДЛЯ ПРЯМОГО ПЛАТЕЖА НА КОШЕЛЕК
	// ---------------------------------
	
	// Идентификатор валюты. Указывается ID валюты рубли (RUR)
	var $ym_currency_id = 1;

	// Коэффициент увеличения цены при оплате Яндекс.Деньгами
	var $ym_coefficient = 1;

	/* Идентификатор счета получателя для оплаты на кошелек */
	var $ym_account_id = "1234567891234";

	/* Адрес магазина*/
	var $ym_shop_address = 'admin@localhost.ru';

	// ---------------------------------
	// Для оплаты через "Яндекс.Деньги"
	// ---------------------------------

	// код валюты - рубли
	//var $TargetCurrency = 643;
	var $TargetCurrency = 10643;

	// код валюты - рубли
	//var $currency = 643;
	var $currency = 10643;

	// идентификатор процессингового центра платежной системы
	//var $BankID = 100;
	var $BankID = 1003;

	// идентификатор процессингового центра платежной системы
	//var $TargetBankID = 1001;
	var $TargetBankID = 1003;

	// тип платежа: по технологии PayCash
	var $PaymentTypeCD = 'PC';
	
	// ---------------------------------
	// НАСТРОЙКИ ПЛАТЕЖА ДЛЯ МАГАЗИНА
	// ---------------------------------
	
	/* Идентификатор магазина в ЦПП - уникальное значение,
	присваивается Магазину платежной системой после заключения договора */
	var $ym_shop_id = 0;

	/* Номер витрины магазина в ЦПП. Выдается ЦПП. */
	var $ym_scid = 0;
	
	// ---------------------------------
	
	/* Адрес платежной системы
	 * money.yandex.ru - реальный режим работы
	 * demomoney.yandex.ru - демо-режим
	 */ 
	//var $action = 'http://money.yandex.ru/select-wallet.xml';
	var $action = 'http://demomoney.yandex.ru/select-wallet.xml';

	/**
	 * Метод, запускающий выполнение обработчика
	 *
	 */
	function Execute()
	{
		/* Обработчик формы оплаты "Оплата при получении" */
		
		$shop = & singleton('shop');
		
		/* ID платежной системы берем из сессии */
		$system_of_pay_id = to_int($_SESSION['system_of_pay_id']);
		$row_system_of_pay = $shop->GetSystemOfPay($system_of_pay_id);
		
		if ($row_system_of_pay)
		{
			$shop_id = $row_system_of_pay['shop_shops_id'];
		}
		else
		{
			return false;
		}

		if (class_exists('SiteUsers'))
		{
			/* Получаем id текущего пользователя сайта */
			$SiteUsers = & singleton('SiteUsers');
			$site_users_id = $SiteUsers->GetCurrentSiteUser();
		}
		else
		{
			$site_users_id = false;
		}

		// статус платежа, по умолчанию 0
		$order_row['status_of_pay'] = 0 ;

		// дата платежа, по умолчанию пустая строка
		$order_row['date_of_pay'] = '';

		$order_row['description'] = to_str($_SESSION['description']);
		
		// описание и системная информация, по умолчанию пустая строка
		if (to_str($_SESSION['shop_coupon_text']) != '')
		{
			$order_row['description'] .= "Купон на скидку: ".to_str($_SESSION['shop_coupon_text'])."\n";
		}

		if (!isset($_SESSION['last_order_id']))
		{
			$_SESSION['last_order_id'] = 0;
		}

		// Если заказ еще не был оформлен
		if ($_SESSION['last_order_id'] == 0)
		{
			/* Оформляем заказ */
			$order_id = $shop->ProcessOrder($shop_id, $site_users_id, $system_of_pay_id, $order_row);
		}
		else
		{
			$order_id = $_SESSION['last_order_id'];
		}

		if ($order_id > 0)
		{
			if (!class_exists('SiteUsers'))
			{
				/* Класс пользователей сайта не существует, дописываем информацию о заказчике
				в поле shop_order_description из текущей сессии */
				if ($order_row)
				{
					/* Описание заказчика */
					$order_row['description'] .= "Информация о заказчике:\n"
					."Имя: ".to_str($_SESSION['site_users_name'])."\n"
					."Фамилия: ".to_str($_SESSION['site_users_surname'])."\n"
					."Отчество: ".to_str($_SESSION['site_users_patronymic'])."\n"
					."E-Mail: ".to_str($_SESSION['site_users_email'])."\n"
					."Телефон: ".to_str($_SESSION['site_users_phone'])."\n"
					."Факс: ".to_str($_SESSION['site_users_fax'])."\n"
					."Адрес: ".to_str($_SESSION['site_users_address'])."\n";

					/* Дополнительная информация о заказе */
					$order_row['system_information'] = to_str($_SESSION['system_information']);	

					/* Обязательно добавляем идентификатор! */
					$order_row['id'] = $order_id;

					$shop->InsertOrder($order_row);
				}
			}

			$order_row = $shop->GetOrder($order_id);
			
			if ($order_row)
			{
				$this->PrintOrder($order_id);
			}
			
			$shop_row = $shop->GetShop($shop_id);

			if ($_SESSION['last_order_id'] == 0)
			{
				$structure = & singleton('Structure');
				$structure_row = $structure->GetStructureItem(to_int($shop_row['structure_id']));

				$lib = new lib();
				$LA = $lib->LoadLibPropertiesValue(to_int($structure_row['lib_id']), to_int($structure_row['structure_id']));

				$date_str = date("d.m.Y H:i:s");

				if (trim(to_str($order_row['shop_order_account_number'])) != '')
				{
					$shop_order_account_number = trim(to_str($order_row['shop_order_account_number']));
				}
				else
				{
					$shop_order_account_number = $order_id;
				}
				
				/* Отправляем письмо заказчику */
				$shop->SendMailAboutOrder($shop_id,
				$order_id,
				$site_users_id,
				to_str($LA['xsl_letter_to_admin']),
				to_str($LA['xsl_letter_to_user']),
				$order_row['shop_order_users_email'],
				array('admin-content-type' => 'html',
				'user-content-type' => 'html',
				'admin-subject' => sprintf($GLOBALS['MSG_shops']['shop_order_admin_subject'], $shop_order_account_number, $shop_row['shop_shops_name'], $date_str),
				'user-subject' => sprintf($GLOBALS['MSG_shops']['shop_order_user_subject'], $shop_order_account_number, $shop_row['shop_shops_name'], $date_str),
				'email_from_admin' => $order_row['shop_order_users_email']));
			}
			
			// Сохраняем ID последнего оформленного заказа ТОЛЬКО ПОСЛЕ ОТПРАВКИ ПИСЬМА
			$_SESSION['last_order_id'] = $order_id;
		}
		else
		{
			switch ($order_id)
			{
				case -1:
					{
						?><div id="error">Ошибка вставки заказа в базу данных. Обратитесь к администратору.</div><?php
						break;
					}
				case -2:
					{
						?><div id="error">Ошибка - не найден магазин. Обратитесь к администратору.</div><?php
						break;
					}
				case -3:
					{
						?><div id="error">Ошибка - корзина пуста. Добавьте товар в корзину и оформите заказ.</div><?php
						break;
					}
			}
		}
	}

	/**
	 * Метод для отображения формы заказа для печати.
	 *
	 * @param int $order_id идентификатор заказа
	 */
	function PrintOrder($order_id)
	{
		$shop = & singleton('shop');
		
		$order_row = $shop->GetOrder($order_id);
		if (!$order_row)
		{
			return false;
		}
		
		if ($order_row)
		{
			$shop_row = $shop->GetShop($order_row['shop_shops_id']);

			/* Делаем перерасчет суммы в валюты, выбранные для WebMoney */
			$shop_currency_id = $shop_row['shop_currency_id'];
			$coefficient = $shop->GetCurrencyCoefficientToShopCurrency($shop_currency_id, $this->ym_currency_id);

			$order_sum = $shop->GetOrderSum($order_id);
			
			$ym_sum = round($order_sum * $coefficient * $this->ym_coefficient, 2);

			// Определим ФИО заказчика
			if (!class_exists('SiteUsers'))
			{
				$fio = trim(to_str($_SESSION['site_users_surname']) . ' ' .
				to_str($_SESSION['site_users_name']) . ' ' .
				to_str($_SESSION['site_users_patronymic']));

				$address = to_str($_SESSION['full_address']);

				$email = to_str($_SESSION['site_users_email']);
			}
			else
			{
				$fio = trim($order_row['shop_order_users_surname'] . ' ' .
				$order_row['shop_order_users_name'] . ' ' .
				$order_row['shop_order_users_patronymic']);

				$address = $order_row['shop_order_index'] . ' ' . $order_row['shop_order_address'];

				$email = $order_row['shop_order_users_email'];
			}

			?>
			<!-- Форма для оплаты через Yandex.Деньги -->
			<h1>Из какого Кошелька вы будете платить?</h1>
			
			<div style="color: #000; background-color: #D8F0C6; padding: 20px; margin-right: 5%; float: left; width: 40%">
			
				<span style="font-size: 150%">Яндекс.Кошелек</span>
			
				<p>Чтобы пользоваться Яндекс.Кошельком, достаточно активировать его и создать платежный пароль.</p>

				<form method="post" action="<?php echo $this->action?>">
					<input type="hidden" name="TargetCurrency" value="<?php echo $this->TargetCurrency?>">
					<input type="hidden" name="currency" value="<?php echo $this->currency?>">
					<input type="hidden" name="wbp_InactivityPeriod" value="2">
					<input type="hidden" name="wbp_ShopAddress" value="wn1.paycash.ru:8828">
					<input type="hidden" name="wbp_Version" value="1.0">
					<input type="hidden" name="BankID" value="<?php echo $this->BankID?>">
					<input type="hidden" name="TargetBankID" value="<?php echo $this->TargetBankID?>">
					<input type="hidden" name="PaymentTypeCD" value="<?php echo $this->PaymentTypeCD?>">
					<?php if ($this->type == 0)
					{
					?>
					<input type="hidden" name="ShopID" value="<?php echo $this->ym_shop_id?>">
					<input type="hidden" name="scid" value="<?php echo $this->ym_scid?>">
					<?php 
					}
					?>
					<input type="hidden" name="CustomerNumber" value="<?php echo $order_id?>">
					<input type="hidden" name="Sum" value="<?php echo $ym_sum?>">
					<input type="hidden" name="CustName" value="<?php echo $fio?>">
					<input type="hidden" name="CustAddr" value="<?php echo $address?>">
					<input type="hidden" name="CustEMail" value="<?php echo $email?>">
					<!-- Содержание заказа: -->
					<!-- <input type="hidden" name="OrderDetails" value=""> -->
					<input type="submit" value="Перейти к оплате" style="font-weight: bold">
				</form>
			</div>
			
			<?php if ($this->type == 0)
			{
			?>
			<div style="color: #000; background-color: #EEEEF2; padding: 20px; margin-right: 5%; float: left; width: 35%">
			
				<span style="font-size: 150%">«Интернет.Кошелек» на моем компьютере</span>
				
				<p>Проверьте, не забыли ли вы запустить программу.</p>
			
				<form action="http://127.0.0.1:8129/wallet" method="POST">
					<input type="hidden" name="wbp_Version" value="2">
					<input type="hidden" name="wbp_MessageType" value="DirectPaymentIntoAccountRequest">
					<input type="hidden" name="wbp_ShopAddress" value="<?php echo $this->ym_shop_address?>">
					<input type="hidden" name="wbp_accountid" value="<?php echo $this->ym_account_id?>">
					<input type="hidden" name="wbp_currencyamount" value="643;<?php echo $ym_sum?>">
					<input type="hidden" name="wbp_ShopErrorInfo" value="Деньги не отправлены">
					<input type="hidden" name="wbp_shortdescription" value="<?php echo $order_id?>">
					<input type="hidden" name="wbp_template_1" value="Оплата заказа №<?php echo $order_id?>">
					<input type="hidden" name="wbp_template_2" value="<?php echo to_str($shop_row['shop_order_address'])?>">
					Сумма заказа: <strong><?php echo $ym_sum?>&nbsp;руб.</strong>
					<p>
						<input type="submit" name="submit" value="Перейти к оплате" style="font-weight: bold">
					</p>
				</form>			
			</div>
			<?php
			}
			?>
			
			<div style="clear: both"></div>
			<?php 
		}
	}

	/**
	 * Изменение статуса заказа. Позволяет пользователю внедрять собственные
	 * обработчики при изменении статуса.
	 *
	 * @param array $param массив атрибутов
	 * - $param['shop_order_id'] идентификатор заказа
	 * - $param['prev_order_row'] информация о предыдущем состоянии заказа (доступно не всегда)
	 * - $param['action'] выполняемое действие над заказом, может принимать значения:
	 * edit (редактирование заказа), cancel (отмена заказа),
	 * status (изменение статуса заказа), delete (удаление заказа),
	 * edit_item (редактирование товара в заказе), delete_item (удаление товара в заказе)
	 */
	function ChangeStatus($param = array())
	{
		// Если произошло изменение статуса или
		if (isset($param['action']) && in_array($param['action'], array('status', 'edit')))
		{
			$shop_order_id = to_int($param['shop_order_id']);

			$shop = & singleton('shop');

			$order_row = $shop->GetOrder($shop_order_id);

			// Получаем информацию о магазине
			$shop_id = to_int($order_row['shop_shops_id']);

			$shop_row = $shop->GetShop($shop_id);

			$structure = & singleton('Structure');
			$structure_row = $structure->GetStructureItem(to_int($shop_row['structure_id']));

			$lib = new lib();
			$LA = $lib->LoadLibPropertiesValue(to_int($structure_row['lib_id']), to_int($structure_row['structure_id']));

			if ($order_row)
			{
				$DateClass = new DateClass();
				$date_str = $DateClass->datetime_format($order_row['shop_order_date_time']);
			}
			else
			{
				$date_str = '';
			}

			// Если предыдущий статус заказа был 1, то меняем тему на подтверждение
			if (to_int($order_row['shop_order_status_of_pay']) == 1)
			{
				$admin_subject = $GLOBALS['MSG_shops']['shop_order_confirm_admin_subject'];
				$user_subject = $GLOBALS['MSG_shops']['shop_order_confirm_user_subject'];
			}
			else
			{
				$admin_subject = $GLOBALS['MSG_shops']['shop_order_admin_subject'];
				$user_subject = $GLOBALS['MSG_shops']['shop_order_user_subject'];
			}

			$not_paid = isset($param['prev_order_row']) && $param['prev_order_row']['shop_order_status_of_pay'] == 0;
			
			// Письмо отправляем только при установке статуса активности для заказа
			if (to_int($order_row['shop_order_status_of_pay']) == 1 && $not_paid)
			{
				if (trim(to_str($order_row['shop_order_account_number'])) != '')
				{
					$shop_order_account_number = trim(to_str($order_row['shop_order_account_number']));
				}
				else
				{
					$shop_order_account_number = $shop_order_id;
				}
				
				/* Отправляем письмо заказчику */
				$shop->SendMailAboutOrder($shop_id,
				$shop_order_id,
				$order_row['site_users_id'],
				to_str($LA['xsl_letter_to_admin']),
				to_str($LA['xsl_letter_to_user']),
				$order_row['shop_order_users_email'],
				array('admin-content-type' => 'html',
				'user-content-type' => 'html',
				'admin-subject' => sprintf($admin_subject, $shop_order_account_number, $shop_row['shop_shops_name'], $date_str),
				'user-subject' => sprintf($user_subject, $shop_order_account_number, $shop_row['shop_shops_name'], $date_str),
				'email_from_admin' => $order_row['shop_order_users_email']));
			}
		}
	}
}
?>