Your IP : 18.227.102.88


Current Path : /home/bitrix/ext_www/klimatlend.ua/bitrix/modules/sale/lib/paysystem/
Upload File :
Current File : /home/bitrix/ext_www/klimatlend.ua/bitrix/modules/sale/lib/paysystem/restservice.php

<?php

namespace Bitrix\Sale\PaySystem;

use Bitrix\Main\Context;
use Bitrix\Main\HttpRequest;
use Bitrix\Main\Loader;
use Bitrix\Main\Localization\Loc;
use Bitrix\Rest\AccessException;
use Bitrix\Rest\RestException;
use Bitrix\Sale\BusinessValue;
use Bitrix\Sale\Internals;
use Bitrix\Sale\Order;
use Bitrix\Sale\Payment;
use Bitrix\Sale\Services\PaySystem\Restrictions;

Loader::includeModule('rest');

Loc::loadMessages(__FILE__);

/**
 * Class RestService
 * @package Bitrix\Sale\PaySystem
 */
class RestService extends \IRestService
{
	const SCOPE = 'pay_system';

	const ERROR_VALIDATION_FAILURE = 'ERROR_VALIDATION_FAILURE';
	const ERROR_HANDLER_ALREADY_EXIST = 'ERROR_HANDLER_ALREADY_EXIST';
	const ERROR_HANDLER_NOT_FOUND = 'ERROR_HANDLER_NOT_FOUND';
	const ERROR_PAY_SYSTEM_ADD = 'ERROR_PAY_SYSTEM_ADD';
	const ERROR_PAY_SYSTEM_NOT_FOUND = 'ERROR_PAY_SYSTEM_NOT_FOUND';
	const ERROR_PAY_SYSTEM_DELETE = 'ERROR_PAY_SYSTEM_DELETE';
	const ERROR_INVOICE_NOT_FOUND = 'ERROR_INVOICE_NOT_FOUND';
	const ERROR_INTERNAL_INVOICE_NOT_FOUND = 'ERROR_INTERNAL_INVOICE_NOT_FOUND';
	const ERROR_PROCESS_REQUEST_RESULT = 'ERROR_PROCESS_REQUEST_RESULT';

	/**
	 * @return array
	 */
	public static function onRestServiceBuildDescription()
	{
		return array(
			static::SCOPE => array(
				'sale.paysystem.handler.add' => array(__CLASS__, 'addHandler'),
				'sale.paysystem.handler.update' => array(__CLASS__, 'updateHandler'),
				'sale.paysystem.handler.delete' => array(__CLASS__, 'deleteHandler'),
				'sale.paysystem.handler.list' => array(__CLASS__, 'getHandlerList'),

				'sale.paysystem.add' => array(__CLASS__, 'addPaySystem'),
				'sale.paysystem.update' => array(__CLASS__, 'updatePaySystem'),
				'sale.paysystem.delete' => array(__CLASS__, 'deletePaySystem'),
				'sale.paysystem.list' => array(__CLASS__, 'getPaySystemList'),
				'sale.paysystem.settings.invoice.get' => array(__CLASS__, 'getSettingsByInvoice'),
				'sale.paysystem.pay.invoice' => array(__CLASS__, 'payInvoice'),
			)
		);
	}

	/**
	 * @param array $params
	 * @return int
	 * @throws RestException
	 */
	public static function addPaySystem(array $params)
	{
		static::checkPaySystemPermission();

		$params = static::prepareParams($params);

		$handlerList = Manager::getHandlerList();
		if (!isset($handlerList['USER'][$params['BX_REST_HANDLER']]) && !isset($handlerList['SYSTEM'][$params['BX_REST_HANDLER']]))
		{
			throw new RestException('Handler not found!', self::ERROR_HANDLER_NOT_FOUND);
		}

		$fields = array(
			'NAME' => $params['NAME'],
			'ACTIVE' => $params['ACTIVE'] ?: 'N',
			'PERSON_TYPE_ID' => $params['PERSON_TYPE_ID'],
			'ACTION_FILE' => $params['BX_REST_HANDLER'],
			'HAVE_PREPAY' => 'N',
			'HAVE_RESULT' => 'N',
			'HAVE_ACTION' => 'N',
			'HAVE_PAYMENT' => 'N',
			'HAVE_RESULT_RECEIVE' => 'Y'
		);

		$result = Manager::add($fields);
		if ($result->isSuccess())
		{
			$id = $result->getId();
			Manager::update($id, array('PAY_SYSTEM_ID' => $id));

			foreach ($params['SETTINGS'] as $key => $value)
			{
				BusinessValue::setMapping(
					$key,
					Service::PAY_SYSTEM_PREFIX.$id,
					$params['PERSON_TYPE_ID'],
					array(
						'PROVIDER_KEY' => $value['TYPE'],
						'PROVIDER_VALUE' => $value['VALUE']
					)
				);
			}

			if ($fields['PERSON_TYPE_ID'] > 0)
			{
				static::savePersonTypeId($id, $params['PERSON_TYPE_ID']);
			}

			return $id;
		}

		$error = implode("\n", $result->getErrorMessages());
		throw new RestException($error, self::ERROR_PAY_SYSTEM_ADD);
	}

	/**
	 * @param $serviceId
	 * @param $personTypeId
	 */
	private static function savePersonTypeId($serviceId, $personTypeId)
	{
		$params = array(
			'filter' => array(
				"SERVICE_ID" => $serviceId,
				"SERVICE_TYPE" => Restrictions\Manager::SERVICE_TYPE_PAYMENT,
				"=CLASS_NAME" => '\Bitrix\Sale\Services\PaySystem\Restrictions\PersonType'
			)
		);

		$dbRes = Internals\ServiceRestrictionTable::getList($params);
		if ($data = $dbRes->fetch())
			$restrictionId = $data['ID'];
		else
			$restrictionId = 0;

		$fields = array(
			"SERVICE_ID" => $serviceId,
			"SERVICE_TYPE" => Restrictions\Manager::SERVICE_TYPE_PAYMENT,
			"SORT" => 100,
			"PARAMS" => array('PERSON_TYPE_ID' => array($personTypeId))
		);

		Restrictions\PersonType::save($fields, $restrictionId);
	}

	/**
	 * @param array $params
	 * @return bool
	 * @throws RestException
	 */
	public static function updatePaySystem(array $params)
	{
		static::checkPaySystemPermission();

		$params = static::prepareParams($params);

		$fields = array();
		if (isset($params['FIELDS']['NAME']))
			$fields['NAME'] = $params['FIELDS']['NAME'];

		if (isset($params['FIELDS']['ACTIVE']))
			$fields['ACTIVE'] = $params['FIELDS']['ACTIVE'];

		if (isset($params['FIELDS']['PERSON_TYPE_ID']))
			$fields['PERSON_TYPE_ID'] = $params['FIELDS']['PERSON_TYPE_ID'];

		if (isset($params['FIELDS']['BX_REST_HANDLER']))
		{
			$fields['ACTION_FILE'] = $params['FIELDS']['BX_REST_HANDLER'];

			$handlerList = Manager::getHandlerList();
			if (!isset($handlerList['USER'][$fields['ACTION_FILE']]) && !isset($handlerList['SYSTEM'][$fields['ACTION_FILE']]))
			{
				throw new RestException('Handler not found!', self::ERROR_HANDLER_NOT_FOUND);
			}
		}

		$dbRes = Manager::getList(array(
			'filter' => array(
				'ID' => $params['ID']
			)
		));
		if (!$dbRes->fetch())
		{
			throw new RestException('Pay system not found!', self::ERROR_PAY_SYSTEM_NOT_FOUND);
		}

		$result = Manager::update($params['ID'], $fields);

		if ($fields['PERSON_TYPE_ID'] > 0)
		{
			static::savePersonTypeId($params['ID'], $fields['PERSON_TYPE_ID']);
		}

		return $result->isSuccess();
	}

	/**
	 * @param array $params
	 * @return bool
	 * @throws RestException
	 */
	public static function deletePaySystem(array $params)
	{
		static::checkPaySystemPermission();

		$params = static::prepareParams($params);

		$data = Manager::getById($params['ID']);
		if (!$data)
		{
			throw new RestException('Pay system not found!', self::ERROR_PAY_SYSTEM_NOT_FOUND);
		}

		$result = Manager::delete($data['ID']);
		return $result->isSuccess();
	}

	/**
	 * @param array $params
	 * @return bool|int
	 * @throws RestException
	 */
	public static function addHandler(array $params)
	{
		static::checkPaySystemPermission();

		$params = static::prepareParams($params);

		$dbRes = Internals\PaySystemRestHandlersTable::getList(array(
			'filter' => array(
				'=CODE' => $params['CODE']
			)
		));
		if ($data = $dbRes->fetch())
		{
			throw new RestException('Handler already exists!', self::ERROR_HANDLER_ALREADY_EXIST);
		}

		$result = Internals\PaySystemRestHandlersTable::add($params);
		if ($result->isSuccess())
			return $result->getId();

		return false;
	}

	/**
	 * @param array $params
	 * @return bool
	 * @throws RestException
	 */
	public static function updateHandler(array $params)
	{
		static::checkPaySystemPermission();

		$params = static::prepareParams($params);

		$dbRes = Internals\PaySystemRestHandlersTable::getList(array(
			'filter' => array(
				'ID' => $params['ID']
			)
		));
		if (!$dbRes->fetch())
		{
			throw new RestException('Handler not found!', self::ERROR_HANDLER_NOT_FOUND);
		}

		$result = Internals\PaySystemRestHandlersTable::update($params['ID'], $params['FIELDS']);
		return $result->isSuccess();
	}

	/**
	 * @param array $params
	 * @return bool
	 * @throws RestException
	 */
	public static function deleteHandler(array $params)
	{
		static::checkPaySystemPermission();

		$params = static::prepareParams($params);

		$dbRes = Internals\PaySystemRestHandlersTable::getList(array(
			'filter' => array(
				'ID' => $params['ID']
			)
		));
		$data = $dbRes->fetch();
		if (!$data)
		{
			throw new RestException('Handler not found!', self::ERROR_HANDLER_NOT_FOUND);
		}

		$dbRes = Manager::getList(array('filter' => array('ACTION_FILE' => $data['CODE'])));
		if ($dbRes->fetch())
		{
			throw new RestException('Pay system with handler '.ToUpper($data['CODE']).' exists!', self::ERROR_PAY_SYSTEM_DELETE);
		}

		$result = Internals\PaySystemRestHandlersTable::delete($params['ID']);
		return $result->isSuccess();
	}

	/**
	 * @return array
	 */
	public static function getHandlerList()
	{
		static::checkPaySystemPermission();

		$result = array();
		$dbRes = Internals\PaySystemRestHandlersTable::getList();
		while ($item = $dbRes->fetch())
			$result[] = $item;

		return $result;
	}

	/**
	 * @return array
	 * @throws AccessException
	 * @throws \Bitrix\Main\ArgumentException
	 */
	public static function getPaySystemList()
	{
		static::checkPaySystemPermission();

		$result = array();
		$dbRes = Manager::getList();
		while ($item = $dbRes->fetch())
		{
			$result[] = $item;
		}

		return $result;
	}

	/**
	 * @param array $params
	 * @return array
	 * @throws RestException
	 */
	public static function getSettingsByInvoice(array $params)
	{
		static::checkOrderPermission();

		$params = static::prepareParams($params);
		static::validateParams($params);

		$handlerCode = $params['BX_REST_HANDLER'];
		$invoiceId = $params['INVOICE_ID'];

		if (empty($invoiceId))
		{
			throw new RestException('Invoice #'.$invoiceId.' not found!', self::ERROR_INVOICE_NOT_FOUND);
		}

		$dbRes = Manager::getList(array('filter' => array('ACTION_FILE' => $handlerCode)));
		$item = $dbRes->fetch();
		if (!$item)
		{
			throw new RestException('Pay system with handler '.$handlerCode.' not found!', self::ERROR_PAY_SYSTEM_NOT_FOUND);
		}

		$order = Order::load($invoiceId);
		if ($order)
		{
			$paymentCollection = $order->getPaymentCollection();
			if ($paymentCollection)
			{
				/** @var Payment $payment */
				foreach ($paymentCollection as $payment)
				{
					if (!$payment->isInner())
					{
						$service = new Service($item);
						return $service->getParamsBusValue($payment);
					}
				}
			}
		}

		throw new RestException('Payment of invoice #'.$invoiceId.' not found!', self::ERROR_INTERNAL_INVOICE_NOT_FOUND);
	}

	/**
	 * @param array $params
	 * @return bool
	 * @throws RestException
	 */
	public static function payInvoice(array $params)
	{
		static::checkOrderPermission();

		$params = static::prepareParams($params);

		if (!isset($params['INVOICE_ID']))
		{
			throw new RestException('Invoice #'.$params['INVOICE_ID'].' not found!', self::ERROR_INVOICE_NOT_FOUND);
		}

		$dbRes = Payment::getList(array(
			'select' => array('ID'),
			'filter' => array(
				'ORDER_ID' => $params['INVOICE_ID'],
				'!PAY_SYSTEM_ID' => Manager::getInnerPaySystemId(),
			)
		));

		$payment = $dbRes->fetch();
		if (!$payment)
		{
			throw new RestException('Incorrect invoice #'.$params['INVOICE_ID'], self::ERROR_INTERNAL_INVOICE_NOT_FOUND);
		}

		$params['PAYMENT_ID'] = $payment['ID'];
		return static::payPayment($params);
	}

	/**
	 * @param array $params
	 * @return bool
	 * @throws RestException
	 */
	private static function payPayment(array $params)
	{
		$context = Context::getCurrent();
		$server = $context->getServer();
		$request = new HttpRequest($server, array(), $params, array(), array());

		$dbRes = Internals\PaySystemRestHandlersTable::getList(array(
			'filter' => array(
				'=CODE' => $params['BX_REST_HANDLER']
			)
		));
		if (!$dbRes->fetch())
		{
			throw new RestException('Incorrect rest handler code', static::ERROR_HANDLER_NOT_FOUND);
		}

		$dbRes = Manager::getList(array(
			'filter' => array(
				'=ACTION_FILE' => $params['BX_REST_HANDLER']
			)
		));
		$item = $dbRes->fetch();
		if ($item !== false)
		{
			$service = new Service($item);
			$result = $service->processRequest($request);
			if (!$result->isSuccess())
			{
				$error = join("\n", $result->getErrorMessages());
				throw new RestException($error, static::ERROR_PROCESS_REQUEST_RESULT);
			}

			return true;
		}

		throw new RestException('Pay system not found', static::ERROR_PROCESS_REQUEST_RESULT);
	}

	/**
	 * @param array $data
	 * @return array
	 */
	private static function prepareParams(array $data)
	{
		return array_change_key_case($data, CASE_UPPER);
	}

	/**
	 * @param array $params
	 * @throws RestException
	 */
	private static function validateParams(array $params)
	{
		if (empty($params['BX_REST_HANDLER']))
		{
			throw new RestException('Empty field BX_REST_HANDLER!', self::ERROR_VALIDATION_FAILURE);
		}

		if (empty($params['INVOICE_ID']))
		{
			throw new RestException('Empty field INVOICE_ID!', self::ERROR_VALIDATION_FAILURE);
		}
	}

	/**
	 * @throws AccessException
	 * @throws \Bitrix\Main\LoaderException
	 */
	protected static function checkOrderPermission()
	{
		global $APPLICATION;

		if (IsModuleInstalled('intranet') && Loader::includeModule('crm'))
		{
			$CCrmInvoice = new \CCrmInvoice();
			if ($CCrmInvoice->cPerms->HavePerm('INVOICE', BX_CRM_PERM_NONE, 'WRITE')
				&& $CCrmInvoice->cPerms->HavePerm('INVOICE', BX_CRM_PERM_NONE, 'ADD')
			)
			{
				throw new AccessException();
			}
		}
		else
		{
			$saleModulePermissions = $APPLICATION->GetGroupRight("sale");

			if($saleModulePermissions == "D")
			{
				throw new AccessException();
			}
		}
	}

	/**
	 * @throws AccessException
	 */
	protected static function checkPaySystemPermission()
	{
		global $APPLICATION, $USER;

		if (IsModuleInstalled('intranet') && Loader::includeModule('crm'))
		{
			$CrmPerms = new \CCrmPerms($USER->GetID());
			if (!$CrmPerms->HavePerm('CONFIG', BX_CRM_PERM_CONFIG, 'WRITE'))
			{
				throw new AccessException();
			}
		}
		else
		{
			$saleModulePermissions = $APPLICATION->GetGroupRight("sale");
			if ($saleModulePermissions < "W")
			{
				throw new AccessException();
			}
		}
	}
}