<?php 

/* Оплата через RBK Money */
class system_of_pay_handler
{
	/* Идентификатор сайта в системе RBK Money, например 12345 */
	var $rbkmoney_id = '12345';

	/* Идентификатор валюты, в которой будет производиться платеж.
	Сумма к оплате будет пересчитана из валюты магазина в указанную валюту */
	var $rbkmoney_currency_id = 1;

	/* Секретные ключи для кошельков, должны совпадать с настройками сайта на www.rbkmoney.ru */
	var $rbkmoney_secret_key = 'hostmake';

	/**
	 * Обработка статуса оплаты
	 *
	 */
	function ProcessResult()
	{
		/* Проверяем сооответствие ID магазина */
		if (!isset($_POST['eshopId']) || $_POST['eshopId'] != $this->rbkmoney_id)
		{
			return false;
		}
		
		/* Информация о заказе */
		$order_id = to_int($_POST['paymentId']);

		if (!$order_id)
		{
			return false;
		}

		$shop = & singleton('shop');

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

		if (!$order_row)
		{
			return false;
		}
		
		$shop_row = $shop->GetShop($order_row['shop_shops_id']);

		/* paymentStatus может быть 3 и 5
		3 - Платеж принят на обработку (нас не интересует)
		5 - Платеж зачислен
		*/
		if (to_str($_POST['paymentStatus']) == 5)
		{
			// Индикатор запроса
			$eshopId = to_str($_POST["eshopId"]);

			// Внутренний номер покупки продавца
			$orderId = to_str($_POST["orderId"]);

			// Описание покупки
			$serviceName = to_str($_POST["serviceName"]);
			
			// Номер счета в системе RBKMoney 
			$eshopAccount = to_str($_POST["eshopAccount"]);

			// Сумма платежа
			$recipientAmount = to_str($_POST["recipientAmount"]);
			
			// Валюта платежа
			$recipientCurrency = to_str($_POST["recipientCurrency"]);
			
			// Статус платежа
			// 3 - Платеж принят на обработку
			// 5 - Платеж зачислен
			$paymentStatus = to_str($_POST["paymentStatus"]);
			
			// Имя покупателя 
			$userName = to_str($_POST["userName"]);
			
			// Email покупателя 
			$userEmail = to_str($_POST["userEmail"]);

			// Дата и время выполнения платежа
			$paymentData = to_str($_POST["paymentData"]);

			// Контрольная подпись
			$secretKey = to_str($_POST["secretKey"]);

			/* Проверяем целостность данных */
			$str = $eshopId.'::'.
			$orderId.'::'.
			$serviceName.'::'.
			$eshopAccount.'::'.
			$recipientAmount.'::'.
			$recipientCurrency.'::'.
			$paymentStatus.'::'.
			$userName.'::'.
			$userEmail.'::'.
			$paymentData.'::'.
			$this->rbkmoney_secret_key;

			$str_md5 = md5($str);

			/* Устанавливаем параметры */
			$param['id'] = $order_row['shop_order_id'];
			$param['shop_shops_id'] = $order_row['shop_shops_id'];
			$param['location_id'] = $order_row['shop_location_id'];
			$param['country_id'] = $order_row['shop_country_id'];
			$param['shop_city_id'] = $order_row['shop_city_id'];
			$param['city_area_id'] = $order_row['shop_city_area_id'];
			$param['shop_cond_of_delivery_id'] = $order_row['shop_cond_of_delivery_id'];
			$param['delivery_price'] = $order_row['shop_order_delivery_price'];
			$param['site_user_id'] = $order_row['site_users_id'];
			$param['shop_order_status_id'] = $order_row['shop_order_status_id'];
			$param['currency_id'] = $order_row['shop_currency_id'];
			$param['shop_system_of_pay_id'] = $order_row['shop_system_of_pay_id'];
			$param['order_date_time'] = $order_row['shop_order_date_time'];
			$param['status_of_pay'] = $order_row['shop_order_status_of_pay'];
			$param['date_of_pay'] = $order_row['shop_order_date_of_pay'];
			$param['address'] = $order_row['shop_order_address'];
			$param['index'] = $order_row['shop_order_index'];
			$param['phone'] = $order_row['shop_order_phone'];
			$param['description'] = $order_row['shop_order_description'];

			/* Сравниваем хэши */
			if ($str_md5 == to_str($_POST['hash']))
			{
				// Определим текстовое название статуса
				switch ($paymentStatus)
				{
					case 3:
						$rbkmoney_status_txt = '3 - Платеж принят на обработку';
						break;
					case 5:
						$rbkmoney_status_txt = '5 - Платеж зачислен';
						break;

					default:
						$rbkmoney_status_txt = 'Не определен';
						break;
				}

				/* Проверка прошла успешно!
				 * Добавляем комментарий */
				$param['system_information'] = "Товар оплачен через RBK Money.\n".
				"Атрибуты:\n".
				"Номер сайта продавца: {$eshopId}\n".
				"Внутренний номер покупки продавца: {$orderId}\n".
				"Сумма платежа: {$recipientAmount}\n".
				"Валюта платежа: {$recipientCurrency}\n".
				"Номер счета в системе RBK Mone: {$eshopAccount}\n".
				"Дата и время выполнения платежа: {$paymentData}\n".
				"Статус платежа: {$rbkmoney_status_txt}";

				// Статус оплаты обновляем только если платеж удачно завершен
				if ($paymentStatus == 5)
				{
					/* Устанавливаем признак оплаты */
					$param['date_of_pay'] = date("Y-m-d H:i:s");
					$param['status_of_pay'] = true;
				}
			}
			else
			{
				$param['system_information'] = 'Хэш не совпал!';
			}

			$shop->InsertOrder($param);

			// Отправляем письмо администратору о подтверждении платежа
			$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']));

			// Отправляем письмо администратору о подтверждении платежа
			$shop->SendMailAboutOrder($order_row['shop_shops_id'], $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($GLOBALS['MSG_shops']['shop_order_confirm_admin_subject'], $order_id, $shop_row['shop_shops_name'], $param['date_of_pay']),
			'user-subject' => sprintf($GLOBALS['MSG_shops']['shop_order_confirm_user_subject'], $order_id, $shop_row['shop_shops_name'], $param['date_of_pay'])));
		}

		return true;
	}

	/**
	 * Отображает стартовую страницу для оплаты через rbkmoney.
	 *
	 */
	function ShowPurseRequest()
	{
		$shop_id = to_int($GLOBALS['shop_id']);

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

		/* ID платежной системы берем из сессии */
		$system_of_pay_id = to_int($_SESSION['system_of_pay_id']);

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

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

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

		$shop = & singleton('shop');

		/* Оформляем заказ */
		$order_id = $shop->ProcessOrder($shop_id, $site_users_id, $system_of_pay_id, $order_row);

		// Оформление заказа произошло успешно
		if ($order_id > 0)
		{
			if (!class_exists('SiteUsers'))
			{
				/* Класс пользователей сайта не существует, дописываем информацию о заказчике
				в поле shop_order_description из текущей сессии */
				if ($order_row)
				{
					/* E-Mail заказчика */
					$user_email = trim(to_str($_SESSION['site_users_email']));

					/* Описание заказчика */
					$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['id'] = $order_id;

					$shop->InsertOrder($order_row);
				}
			}
			else
			{
				$user_email = false;
			}

			if ($order_row)
			{
				$shop_row = $shop->GetShop($GLOBALS['shop_id']);

				/* Делаем перерасчет суммы в валюту */
				$shop_currency_id = $shop_row['shop_currency_id'];

				/* Определяем коэффициент пересчета */
				$coefficient = $shop->GetCurrencyCoefficientToShopCurrency($shop_currency_id, $this->rbkmoney_currency_id);

				$sum = round($order_row['sum'] * $coefficient, 2);

				// округляем до десятых после запятой
				$sum = round($sum, 2);

				/* Информация об алиасе сайта */
				$site = & singleton ('site');
				$site_alias = $site->GetCurrentAlias($shop_row['site_id']);

				/* Получаем путь к магазину */
				$Structure = & singleton('Structure');
				$shop_path = '/' . $Structure->GetStructurePath($shop_row['structure_id'], 0);

				$handler_url = 'http://'.$site_alias.$shop_path.'cart/';

				// Поулчаем название валюты, чтобы указать пользователю и передать в магазин
				$currency_row = $shop->GetCurrency($this->rbkmoney_currency_id);

				if ($currency_row)
				{
				?>
				<h1>Оплата через систему RBK Money</h1>
				<p>Сумма к оплате составляет <strong><?php echo $sum?> <?php echo $currency_row['shop_currency_name']?></strong></p>
				
				<p>Для оплаты нажмите кнопку "Оплатить".</p>
				
				<form action="https://rbkmoney.ru/acceptpurchase.aspx" name="pay" method="post">
					<input type="hidden" name="eshopId" value="<?php echo $this->rbkmoney_id?>">
					<input type="hidden" name="orderId" value="<?php echo $order_id?>">
					<input type="hidden" name="serviceName" value="Оплата счета N <?php echo $order_id?>">
					<input type="hidden" name="recipientAmount" value="<?php echo $sum?>">
					<input type="hidden" name="recipientCurrency" value="<?php echo $currency_row['shop_currency_international_name']?>">

					<input type="hidden" name="successUrl" value="<?php echo $handler_url?>">
					<input type="hidden" name="failUrl" value="<?php echo $handler_url?>">
					<input type="submit" name="button" value="Оплатить">
				</form>
				<?php
				}
				else
				{
					?>
					<h1>Не найдена валюта с идентификатором <?php $this->rbkmoney_currency_id?>!</h1>
					<?php
				}
			}

			/* Отправляем письмо заказчику о поступившем заказе */
			$shop->SendMailAboutOrder($shop_id, $order_id, $site_users_id,
			$GLOBALS['LA']['xsl_letter_to_admin'], $GLOBALS['LA']['xsl_letter_to_user'], $user_email,
			array('admin-content-type' => 'html', 'user-content-type' => 'html'));
		}
		else
		{
			switch ($order_id)
			{
				case -1:
					{
						echo "Ошибка вставки заказа в базу данных. Обратитесь к администратору.";
						break;
					}
				case -2:
					{
						echo "Ошибка - не найден магазин. Обратитесь к администратору.";
						break;
					}
			}
		}

		return true;
	}

	/**
	 * Метод, запускающий выполнение обработчика
	 *
	 */
	function Execute()
	{
		/* Обработка статуса оплаты */
		if (isset($_POST['eshopId']) && isset($_POST['paymentId']) && isset($_POST['paymentStatus']))
		{
			$this->ProcessResult();
			return true;
		}

		/* Иначе оформляем заказ и отображаем стартовую страницу для оплаты */
		$this->ShowPurseRequest();

		return true;
	}

	/**
	 * Метод для отображения формы заказа для печати.
	 *
	 * @param int $order_id идентификатор заказа
	 */
	function PrintOrder($order_id)
	{

	}
	
	/**
	 * Изменение статуса заказа. Позволяет пользователю внедрять собственные
	 * обработчики при изменении статуса.
	 * 
	 * @param array $param массив атрибутов
	 * - $param['shop_order_id'] идентификатор заказа
	 * - $param['action'] выполняемое действие над заказом, может принимать
	 * значения: edit (редактирование товара), cancel (отмена заказ),
	 * status (изменение статуса заказа), delete (удаление заказа)
	 */
	function ChangeStatus($param = array())
	{
		
	}
}
?>