<?php 
/* Оплата с лицевого счета */
class system_of_pay_handler
{
	/**
	 * Обработка статуса оплаты
	 *
	 */
	function ProcessResult()
	{

	}

	/**
	 * Отображает стартовую страницу для оплаты с лицевого счета.
	 *
	 */
	function ShowPurseRequest()
	{
		$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;
		}

		?>
		<h1>Оплата с лицевого счета пользователя</h1>
		<?php 

		/* Получаем id текущего пользователя сайта */
		if (class_exists('SiteUsers'))
		{
			/* Получаем id текущего пользователя сайта */
			$SiteUsers = & singleton('SiteUsers');
			$site_users_id = $SiteUsers->GetCurrentSiteUser();
		}
		else
		{
			?>
			<p>Вы не авторизированы. Для продолжения оплаты необходимо авторизироваться на сайте.</p>
			<?php 
			return 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";
		}

		$shop = & singleton('shop');

		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 ($order_row)
			{
				$shop_row = $shop->GetShop($shop_id);

				$order_sum = $shop->GetOrderSum($order_id);
				
				// Проводим транзакцию
				$this->AccountTransaction($site_users_id, $shop_id, $order_sum, $shop_row['shop_currency_id'], $order_id);
			}

			$order_row = $shop->GetOrder($order_id);
			
			/* Формируем XML */
			$xmlData = '<?xml version="1.0" encoding="UTF-8"?>'."\n";
			$xmlData .= '<document_list>'."\n";

			/* Ссылака на версию для печати */
			$shop_row = $shop->GetShop($shop_id);
			if ($shop_row)
			{
				/* Получаем путь к магазину */
				$Structure = & singleton('Structure');
				$shop_path = "/".$Structure->GetStructurePath($shop_row['structure_id'], 0);
				$shop_path .= "cart/print/{$order_row['shop_order_guid']}/";
				$xmlData .= "<print_link>".$shop_path."</print_link>";
			}

			$xmlData .= $shop->GetXmlForOrder($order_id, false, true);
			$xmlData .= $shop->GetXmlForItemsOrder($order_id);
			$xmlData .= '</document_list>'."\n";

			$xsl = new xsl();
			echo $xsl->build($xmlData, 'ОплатаПриПолучении');

			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 $site_users_id идентификатор пользователя сайта
	 * @param int $shop_id идентификатор магазина
	 * @param float $order_row_sum сумма заказа
	 * @param int $shop_currency_id идентификатор валюты
	 * @param int $order_id идентификатор заказа
	 */
	function AccountTransaction($site_users_id, $shop_id, $order_row_sum, $shop_currency_id, $order_id)
	{
		$DataBase = & singleton('DataBase');

		$shop = & singleton('shop');

		// Определяем сумму на балансе клиента
		$DataBase->query('LOCK TABLES shop_site_users_account_table WRITE,
				shop_order_table WRITE,
				shop_shops_table WRITE');

		$site_users_account_sum = $shop->GetSiteUserAccountSum($site_users_id, $shop_id);

		// Если сумма заказа больше 0 и на счете достаточно средств для осуществления транзакции
		if ($order_row_sum > 0 && $site_users_account_sum >= $order_row_sum)
		{
			// Сумма отрицательная, т.к. идет списание со счета
			$sum = $order_row_sum * -1;

			// Списываем со счета сумму
			$transaction_id = $shop->InsertSiteUserAccountTransaction(array('shop_shops_id' => $shop_id,
			'site_users_id' => $site_users_id,
			'shop_site_users_account_active' => 1,
			'shop_site_users_account_sum' => $sum,
			'shop_currency_id' => $shop_currency_id,
			'shop_site_users_account_sum_in_base_currency' => $sum,
			'shop_order_id' => $order_id,
			'shop_site_users_account_description' => "Оплата заказа N {$order_id}"));

			// Разблокируем таблицу
			$DataBase->query('UNLOCK TABLES');

			$currency_row = $shop->GetCurrency($shop_currency_id);
			$currency_name = to_str($currency_row['shop_currency_international_name']);

			$param = array();
			$param['system_information'] = "Товар оплачен с лицевого счета.\n".
			"Сумма: {$order_row_sum} {$currency_name}\n".
			"Номер транзакции: {$transaction_id}";

			// Обновляем информацию о заказе
			$shop->InsertOrder($param);

			// Изменяем статус оплаты, генерируем ссылки для эл.товаров, списываем товары
			$shop->SetOrderPaymentStatus($order_id);

			$order_row = $shop->GetOrder($order_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']));

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

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

			// Проводки по партнерской программе
			$affiliate = & singleton('affiliate');
			$affiliate->AcceptAffiliatePlanForSiteUsers($order_row['site_users_id'], $order_id);
			
			?>
			<p>Спасибо, Ваш заказ оформлен. Подробная информация отправлена на Ваш электронный адрес.</p>
			<?php 
		}
		else
		{
			// Разблокируем таблицу
			$DataBase->query('UNLOCK TABLES');

			if ($order_row_sum > 0)
			{
				?>
				<div id="error">На лицевом счете недостаточно средств для проведения операции.</div>
				<?php 
			}
			else
			{
				?>
				<div id="error">Сумма заказа равна 0, продолжение оформления заказа с использованием выбранной платежной системы невозможно.</div>
				<?php 
			}
		}
	}

	/**
	 * Метод, запускающий выполнение обработчика
	 */
	function Execute()
	{
		// оформляем заказ
		$this->ShowPurseRequest();
	}

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

		/* Информация о заказе */
		$order_row = $shop->GetOrder($order_id);

		if (!$order_row)
		{
			return false;
		}

		/* Информация о магазине */
		$shop_row = $shop->GetShop($order_row['shop_shops_id']);
		if (!$shop_row)
		{
			return false;
		}

		?>
		<h1>Оплата с лицевого счета пользователя</h1>
		<?php 

		$sum = $shop->GetOrderSum($order_id);

		// Оплатить и заказ при этом еще не оплачен
		if (isset($_POST['Pay']) && $order_row['shop_order_status_of_pay'] == 0)
		{
			/* Получаем id текущего пользователя сайта */
			$SiteUsers = & singleton('SiteUsers');
			$site_users_id = $SiteUsers->GetCurrentSiteUser();

			$this->AccountTransaction($site_users_id, $order_row['shop_shops_id'], $sum, $order_row['shop_currency_id'], $order_id);
		}
		else
		{
			$DateClass = new DateClass();

			// Заказ не оплачен
			if ($order_row['shop_order_status_of_pay'] == 0)
			{
				$currency_row = $shop->GetCurrency($order_row['shop_currency_id']);

				if ($currency_row)
				{
					$currency_name = $currency_row['shop_currency_name'];
				}
				else
				{
					$currency_name = '';
				}

				?>
				<p>Сумма к оплате с лицевого счета составляет <?php echo $sum?> <?php echo $currency_name?></p>
				<form action="./" method="post">
					<input type="submit" name="Pay" value="Оплатить <?php echo $sum?> <?php echo $currency_name?>" />
				</form>
				<?php 
			}
			else // Заказ оплачен
			{
				?>
				<p>Ваш заказ был оплачен <?php echo $DateClass->datetime_format($order_row['shop_order_date_of_pay'])?>.</p>
				<?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']));
			}
		}
	}
}
?>