403Webshell
Server IP : 80.87.202.40  /  Your IP : 216.73.216.169
Web Server : Apache
System : Linux rospirotorg.ru 5.14.0-539.el9.x86_64 #1 SMP PREEMPT_DYNAMIC Thu Dec 5 22:26:13 UTC 2024 x86_64
User : bitrix ( 600)
PHP Version : 8.2.27
Disable Function : NONE
MySQL : OFF |  cURL : ON |  WGET : ON |  Perl : ON |  Python : OFF |  Sudo : ON |  Pkexec : ON
Directory :  /home/bitrix/ext_www/rospirotorg.ru/bitrix/modules/sale/lib/paysystem/

Upload File :
current_dir [ Writeable] document_root [ Writeable]

 

Command :


[ Back ]     

Current File : /home/bitrix/ext_www/rospirotorg.ru/bitrix/modules/sale/lib/paysystem/manager.php
<?php

namespace Bitrix\Sale\PaySystem;

use Bitrix\Main\Application;
use Bitrix\Main\ArgumentException;
use Bitrix\Main\ArgumentNullException;
use Bitrix\Main\ArgumentOutOfRangeException;
use Bitrix\Main\Config\Option;
use Bitrix\Main\Event;
use Bitrix\Main\EventResult;
use Bitrix\Main\IO\Directory;
use Bitrix\Main\IO\File;
use Bitrix\Main\IO\Path;
use Bitrix\Main\Localization\Loc;
use Bitrix\Main\Request;
use Bitrix\Sale\Basket;
use Bitrix\Sale\BusinessValue;
use Bitrix\Sale\Internals\PaySystemActionTable;
use Bitrix\Sale\Internals\PaySystemRestHandlersTable;
use Bitrix\Sale\Internals\ServiceRestrictionTable;
use Bitrix\Sale\Internals\BusinessValueTable;
use Bitrix\Sale\Order;
use Bitrix\Sale\Payment;
use Bitrix\Sale\Registry;
use Bitrix\Sale\Services\Base\Restriction;
use Bitrix\Sale\Services\PaySystem\Restrictions;

Loc::loadMessages(__FILE__);

/**
 * Class PaySystemManager
 * @package Bitrix\Sale\Payment
 */
final class Manager
{
	const HANDLER_AVAILABLE_TRUE = true;
	const HANDLER_AVAILABLE_FALSE = false;

	const EVENT_ON_GET_HANDLER_DESC = 'OnSaleGetHandlerDescription';
	const EVENT_ON_PAYSYSTEM_UPDATE = 'OnSalePaySystemUpdate';

	const CACHE_ID = "BITRIX_SALE_INNER_PS_ID";
	const TTL = 31536000;
	/**
	 * @var array
	 */
	private static $handlerDirectories = array(
		'CUSTOM' => '',
		'LOCAL' => '/local/php_interface/include/sale_payment/',
		'SYSTEM' => '/bitrix/modules/sale/handlers/paysystem/',

		/**
		 * @deprecated
		 * The directory /bitrix/modules/sale/payment/ is not supported since version 22.200.0
		 * Key SYSTEM_OLD is left for compatibility
		 */
		'SYSTEM_OLD' => '/bitrix/modules/sale/payment/'
	);

	/**
	 * @return mixed
	 * @throws \Bitrix\Main\ArgumentNullException
	 * @throws \Bitrix\Main\ArgumentOutOfRangeException
	 */
	public static function getHandlerDirectories()
	{
		$handlerDirectories = self::$handlerDirectories;
		$handlerDirectories['CUSTOM'] = Option::get("sale", "path2user_ps_files", BX_PERSONAL_ROOT."/php_interface/include/sale_payment/");

		if (IsModuleInstalled('intranet'))
		{
			unset($handlerDirectories['SYSTEM_OLD']);
		}

		return $handlerDirectories;
	}

	/**
	 * @param array $params
	 * @return \Bitrix\Main\DB\Result
	 * @throws \Bitrix\Main\ArgumentException
	 */
	public static function getList(array $params = array())
	{
		return PaySystemActionTable::getList($params);
	}

	/**
	 * @param $id
	 * @return array|false
	 */
	public static function getById($id)
	{
		if ((int)$id <= 0)
			return false;

		$params = array(
			'select' => array('*'),
			'filter' => array('ID' => $id)
		);

		$dbRes = self::getList($params);
		return $dbRes->fetch();
	}

	/**
	 * @param $code
	 * @return array|bool
	 */
	public static function getByCode($code)
	{
		$params = array(
			'select' => array('*'),
			'filter' => array('CODE' => $code)
		);

		$dbRes = self::getList($params);
		return $dbRes->fetch();
	}

	/**
	 * @param $primary
	 * @param array $data
	 * @return \Bitrix\Main\ORM\Data\UpdateResult
	 * @throws \Exception
	 */
	public static function update($primary, array $data): \Bitrix\Main\ORM\Data\UpdateResult
	{
		$oldFields = PaySystemActionTable::getByPrimary($primary)->fetch();
		if ($oldFields)
		{
			$newFields = array_merge($oldFields, $data);
			$data['PS_CLIENT_TYPE'] = (new Service($newFields))->getClientTypeFromHandler();
		}

		$updateResult = PaySystemActionTable::update($primary, $data);
		if ($oldFields && $updateResult->isSuccess())
		{
			$oldFields = array_intersect_key($oldFields, $data);
			$eventParams = [
				'PAY_SYSTEM_ID' => $primary,
				'OLD_FIELDS' => $oldFields,
				'NEW_FIELDS' => $data,
			];
			$event = new Event('sale', self::EVENT_ON_PAYSYSTEM_UPDATE, $eventParams);
			$event->send();
		}

		return $updateResult;
	}

	/**
	 * @param array $data
	 * @return \Bitrix\Main\ORM\Data\AddResult
	 * @throws \Exception
	 */
	public static function add(array $data): \Bitrix\Main\ORM\Data\AddResult
	{
		$data['PS_CLIENT_TYPE'] = (new Service($data))->getClientTypeFromHandler();

		return PaySystemActionTable::add($data);
	}

	/**
	 * @return string
	 */
	public static function generateXmlId()
	{
		return uniqid('bx_');
	}

	/**
	 * @param Request $request
	 * @return array|false
	 * @throws ArgumentException
	 * @throws \Bitrix\Main\ArgumentNullException
	 * @throws \Bitrix\Main\ArgumentOutOfRangeException
	 * @throws \Bitrix\Main\ArgumentTypeException
	 * @throws \Bitrix\Main\ObjectException
	 */
	public static function searchByRequest(Request $request)
	{
		$documentRoot = Application::getDocumentRoot();

		$items = self::getList([
			'select' => ['*'],
			'filter' => [
				'ACTIVE' => 'Y',
			],
		]);

		while ($item = $items->fetch())
		{
			$name = $item['ACTION_FILE'];

			foreach (self::getHandlerDirectories() as $type => $path)
			{
				$className = '';
				if (File::isFileExists($documentRoot.$path.$name.'/handler.php'))
				{
					[$className] = self::includeHandler($item['ACTION_FILE']);
				}

				if (class_exists($className) && is_callable(array($className, 'isMyResponse')))
				{
					if ($className::isMyResponse($request, $item['ID']))
					{
						return $item;
					}
				}
			}
		}

		return false;
	}

	/**
	 * @param string $className
	 * @return mixed|string
	 */
	public static function getFolderFromClassName($className)
	{
		$pos = mb_strrpos($className, '\\');
		if ($pos !== false)
			$className = mb_substr($className, $pos + 1);

		$folder = str_replace('Handler', '', $className);
		$folder = self::sanitize($folder);
		$folder = mb_strtolower($folder);

		return $folder;
	}

	/**
	 * @param string $name
	 * @return mixed
	 */
	public static function sanitize($name)
	{
		return preg_replace("/[^a-z0-9._]/i", "", $name);
	}

	/**
	 * @param $paymentId
	 * @param string $registryType
	 * @return array
	 */
	public static function getIdsByPayment($paymentId, $registryType = Registry::REGISTRY_TYPE_ORDER): array
	{
		if (empty($paymentId))
		{
			return [0, 0];
		}

		$params = [
			'select' => ['ID', 'ORDER_ID'],
		];

		if (intval($paymentId).'|' == $paymentId.'|')
		{
			$params['filter']['=ID'] = $paymentId;
		}
		else
		{
			$params['filter']['=ACCOUNT_NUMBER'] = $paymentId;
		}

		$registry = Registry::getInstance($registryType);

		/** @var Payment $paymentClassName */
		$paymentClassName = $registry->getPaymentClassName();
		$result = $paymentClassName::getList($params);
		$data = $result->fetch() ?: [];

		return [(int)$data['ORDER_ID'], (int)$data['ID']];
	}

	/**
	 * @return array
	 * @throws \Bitrix\Main\ArgumentException
	 */
	public static function getConsumersList()
	{
		$result = array();

		$items = self::getList();

		while ($item = $items->fetch())
		{
			$data = self::getHandlerDescription($item['ACTION_FILE'], $item['PS_MODE']);
			$data['NAME'] = $item['NAME'];
			$data['GROUP'] = 'PAYSYSTEM';
			$data['PROVIDERS'] = [
				'VALUE', 'COMPANY', 'ORDER', 'USER', 'PROPERTY',
				'PAYMENT', 'BANK_DETAIL', 'MC_BANK_DETAIL',
				'REQUISITE', 'MC_REQUISITE', 'CRM_COMPANY',
				'CRM_MYCOMPANY', 'CRM_CONTACT'
			];

			$result['PAYSYSTEM_'.$item['ID']] = $data;
		}

		return $result;
	}

	/**
	 * @param $paySystemId
	 * @return string
	 */
	public static function getPsType($paySystemId)
	{
		$params = array(
			'select' => array('IS_CASH'),
			'filter' => array('ID' => $paySystemId)
		);

		$dbRes = self::getList($params);
		$data = $dbRes->fetch();

		return $data['IS_CASH'];
	}

	/**
	 * @param Order $order
	 * @param float|null $sum
	 * @param int $mode
	 * @return array
	 * @throws ArgumentException
	 * @throws \Bitrix\Main\ArgumentOutOfRangeException
	 * @throws \Bitrix\Main\NotImplementedException
	 * @throws \Bitrix\Main\NotSupportedException
	 * @throws \Bitrix\Main\SystemException
	 */
	public static function getListWithRestrictionsByOrder(Order $order, float $sum = null, int $mode = Restrictions\Manager::MODE_CLIENT): array
	{
		/** @var Order $orderClone */
		$orderClone = $order->createClone();

		$orderPrice = $orderClone->getPrice();
		$paymentSum = $orderPrice;
		if ($sum && $sum >= 0 && $sum <= $orderPrice)
		{
			$paymentSum = $sum;
		}

		$paymentCollection = $orderClone->getPaymentCollection();
		$payment = $paymentCollection->createItem();
		$payment->setFields([
			'SUM' => $paymentSum,
		]);

		return self::getListWithRestrictions($payment, $mode);
	}

	/**
	 * @param Payment $payment
	 * @param int $mode
	 * @return array
	 * @throws \Bitrix\Main\ArgumentException
	 * @throws \Bitrix\Main\SystemException
	 */
	public static function getListWithRestrictions(Payment $payment, $mode = Restrictions\Manager::MODE_CLIENT)
	{
		$result = array();

		$filter = [
			'=ACTIVE' => 'Y',
			'=ENTITY_REGISTRY_TYPE' => $payment::getRegistryType(),
		];

		$bindingPaySystemIds = [];
		if ($mode == Restrictions\Manager::MODE_CLIENT)
		{
			$bindingPaySystemIds = PaymentAvailablesPaySystems::getAvailablePaySystemIdsByPaymentId($payment->getId());
			if ($bindingPaySystemIds)
			{
				$filter['=ID'] = $bindingPaySystemIds;
			}
		}

		$dbRes = self::getList([
			'filter' => $filter,
			'order' => [
				'SORT' => 'ASC',
				'NAME' => 'ASC',
			],
		]);

		while ($paySystem = $dbRes->fetch())
		{
			if ($bindingPaySystemIds)
			{
				$result[$paySystem['ID']] = $paySystem;
			}
			elseif ($mode == Restrictions\Manager::MODE_MANAGER)
			{
				$checkServiceResult = Restrictions\Manager::checkService($paySystem['ID'], $payment, $mode);
				if ($checkServiceResult != Restrictions\Manager::SEVERITY_STRICT)
				{
					if ($checkServiceResult == Restrictions\Manager::SEVERITY_SOFT)
					{
						$paySystem['RESTRICTED'] = $checkServiceResult;
					}
					$result[$paySystem['ID']] = $paySystem;
				}
			}
			elseif ($mode == Restrictions\Manager::MODE_CLIENT)
			{
				if (Restrictions\Manager::checkService($paySystem['ID'], $payment, $mode) === Restrictions\Manager::SEVERITY_NONE)
				{
					$result[$paySystem['ID']] = $paySystem;
				}
			}
		}

		return $result;
	}

	/**
	 * @return array
	 * @throws \Bitrix\Main\ArgumentNullException
	 * @throws \Bitrix\Main\ArgumentOutOfRangeException
	 * @throws \Bitrix\Main\IO\FileNotFoundException
	 */
	public static function getHandlerList()
	{
		$documentRoot = Application::getDocumentRoot();
		$result = array(
			'SYSTEM' => array(),
			'USER' => array()
		);

		foreach (self::getHandlerDirectories() as $type => $dir)
		{
			if (!Directory::isDirectoryExists($documentRoot.$dir))
			{
				continue;
			}

			$directory = new Directory($documentRoot.$dir);
			foreach ($directory->getChildren() as $handler)
			{
				if (!$handler->isDirectory())
				{
					continue;
				}

				$isDescriptionExist = false;
				/** @var Directory $handler */
				foreach ($handler->getChildren() as $item)
				{
					if ($item->isFile())
					{
						$data = array();
						$psTitle = '';
						$isAvailable = null;

						if (mb_strpos($item->getName(), '.description') !== false)
						{
							$handlerName = $handler->getName();

							include $item->getPath();

							if (array_key_exists('NAME', $data))
							{
								$psTitle = $data['NAME'].' ('.$handlerName.')';
								if (isset($data['IS_AVAILABLE']))
								{
									$isAvailable = $data['IS_AVAILABLE'];
								}
							}
							else
							{
								if ($psTitle == '')
								{
									$psTitle = $handlerName;
								}
								else
								{
									$psTitle .= ' ('.$handlerName.')';
								}

								$handlerName = str_replace(Path::normalize($documentRoot), '', $handler->getPath());
							}
							$group = (mb_strpos($type, 'SYSTEM') !== false) ? 'SYSTEM' : 'USER';

							if (!isset($result[$group][$handlerName]))
							{
								if ($isAvailable !== null
									&& $isAvailable === static::HANDLER_AVAILABLE_FALSE
								)
								{
									continue(2);
								}

								$result[$group][$handlerName] = $psTitle;
							}
							$isDescriptionExist = true;
							continue;
						}
					}
				}

				if (!$isDescriptionExist)
				{
					$group = (mb_strpos($type, 'SYSTEM') !== false) ? 'SYSTEM' : 'USER';
					$handlerName = str_replace($documentRoot, '', $handler->getPath());
					$result[$group][$handlerName] = $handler->getName();
				}
			}
		}

		$result['USER'] = array_merge(static::getRestHandlers(), $result['USER']);

		return $result;
	}

	/**
	 * @param $path
	 * @return string
	 */
	public static function getClassNameFromPath($path)
	{
		$pos = mb_strrpos($path, '/');

		if ($pos == mb_strlen($path))
		{
			$path = mb_substr($path, 0, $pos - 1);
			$pos = mb_strrpos($path, '/');
		}

		if ($pos !== false)
			$path = mb_substr($path, $pos + 1);

		return "Sale\\Handlers\\PaySystem\\".$path.'Handler';
	}

	/**
	 * @param $handler
	 * @param null $psMode
	 * @return array
	 * @throws \Bitrix\Main\ArgumentNullException
	 * @throws \Bitrix\Main\ArgumentOutOfRangeException
	 */
	public static function getHandlerDescription($handler, $psMode = null)
	{
		$service = new Service(array('ACTION_FILE' => $handler, 'PS_MODE' => $psMode));
		$data = $service->getHandlerDescription();

		$eventParams = array('handler' => $handler);
		$event = new Event('sale', self::EVENT_ON_GET_HANDLER_DESC, $eventParams);
		$event->send();
		foreach ($event->getResults() as $eventResult)
		{
			if ($eventResult->getType() !== EventResult::ERROR)
			{
				$codes = $eventResult->getParameters();
				if ($codes && is_array($codes))
				{
					if (!isset($data['CODES']) || !is_array($data['CODES']))
					{
						$data['CODES'] = [];
					}

					$data['CODES'] = array_merge($data['CODES'], $codes);
				}
			}
		}

		if (isset($data['CODES']) && is_array($data['CODES']))
		{
			uasort(
				$data['CODES'],
				function ($a, $b)
				{
					$sortA = $a['SORT'] ?? 0;
					$sortB = $b['SORT'] ?? 0;

					return ($sortA < $sortB) ? -1 : 1;
				}
			);
		}

		return $data;
	}

	/**
	 * @param $folder
	 * @return string|null
	 * @throws \Bitrix\Main\ArgumentNullException
	 * @throws \Bitrix\Main\ArgumentOutOfRangeException
	 */
	public static function getPathToHandlerFolder($folder): ?string
	{
		if (!$folder)
		{
			return null;
		}

		$documentRoot = Application::getDocumentRoot();
		$dirs = self::getHandlerDirectories();

		if (mb_strpos($folder, DIRECTORY_SEPARATOR) !== false)
		{
			$folderWithoutHandlerName = array_slice(explode(DIRECTORY_SEPARATOR, $folder), 1, -1);
			$folderWithoutHandlerName = implode(DIRECTORY_SEPARATOR, $folderWithoutHandlerName);

			$handlersDirectory = new Directory($folderWithoutHandlerName);
			$handlersDirectoryPhysicalPath = DIRECTORY_SEPARATOR.$handlersDirectory->getPhysicalPath().DIRECTORY_SEPARATOR;

			foreach ($dirs as $dir)
			{
				if ($documentRoot.$dir !== $documentRoot.$handlersDirectoryPhysicalPath)
				{
					continue;
				}

				return Directory::isDirectoryExists($documentRoot.$folder) ? $folder : null;
			}
		}
		else
		{
			foreach ($dirs as $dir)
			{
				$path = $dir.$folder;
				if (!Directory::isDirectoryExists($documentRoot.$path))
				{
					continue;
				}

				return $path;
			}
		}

		return null;
	}

	/**
	 * @return int
	 */
	public static function getInnerPaySystemId() : int
	{
		$id = 0;
		$cacheManager = Application::getInstance()->getManagedCache();

		if ($cacheManager->read(self::TTL, self::CACHE_ID))
		{
			$id = $cacheManager->get(self::CACHE_ID);
		}

		if ($id <= 0)
		{
			$data = PaySystemActionTable::getRow(
				[
					'select' => ['ID'],
					'filter' => ['=ACTION_FILE' => 'inner']
				]
			);
			if ($data === null)
			{
				$id = self::createInnerPaySystem();
			}
			else
			{
				$id = $data['ID'];
			}

			$cacheManager->set(self::CACHE_ID, $id);
		}

		return (int)$id;
	}

	/**
	 * @return int
	 * @throws \Exception
	 */
	private static function createInnerPaySystem()
	{
		$paySystemSettings = array(
			'NAME' => Loc::getMessage('SALE_PS_MANAGER_INNER_NAME'),
			'PSA_NAME' => Loc::getMessage('SALE_PS_MANAGER_INNER_NAME'),
			'ACTION_FILE' => 'inner',
			'ACTIVE' => 'Y',
			'ENTITY_REGISTRY_TYPE' => Registry::REGISTRY_TYPE_ORDER,
			'NEW_WINDOW' => 'N'
		);

		$imagePath = Application::getDocumentRoot().'/bitrix/images/sale/sale_payments/inner.png';
		if (File::isFileExists($imagePath))
		{
			$paySystemSettings['LOGOTIP'] = \CFile::MakeFileArray($imagePath);
			$paySystemSettings['LOGOTIP']['MODULE_ID'] = "sale";
			\CFile::SaveForDB($paySystemSettings, 'LOGOTIP', 'sale/paysystem/logotip');
		}

		$result = PaySystemActionTable::add($paySystemSettings);

		if ($result->isSuccess())
			return $result->getId();

		return 0;
	}

	/**
	 * @param $id
	 * @return bool
	 */
	public static function isExist($id)
	{
		return (bool)self::getById($id);
	}

	/**
	 * @param $id
	 * @return Service|null
	 */
	public static function getObjectById($id)
	{
		if ((int)$id <= 0)
			return null;

		$data = Manager::getById($id);

		if (is_array($data) && $data)
			return new Service($data);

		return null;
	}

	/**
	 * @param $folder
	 * @param int $paySystemId
	 * @return array|mixed
	 * @throws \Bitrix\Main\ArgumentNullException
	 * @throws \Bitrix\Main\ArgumentOutOfRangeException
	 */
	public static function getTariff($folder, $paySystemId = 0)
	{
		$documentRoot = Application::getDocumentRoot();
		$result = array();

		$path = self::getPathToHandlerFolder($folder);
		if ($path !== null)
		{
			if (File::isFileExists($documentRoot.$path.'/handler.php'))
			{
				$actionFile = self::getFolderFromClassName(self::getClassNameFromPath($path));
				[$className] = self::includeHandler($actionFile);
				if (class_exists($className) && is_subclass_of($className, IPayable::class))
				{
					$result = $className::getStructure($paySystemId);
				}
			}
		}
		else
		{
			$result = \CSalePaySystemsHelper::getPaySystemTarif($folder, $paySystemId);
		}

		return $result;
	}

	/**
	 * @return array
	 */
	public static function getBusValueGroups()
	{
		return [
			'CONNECT_SETTINGS_ALFABANK' => ['NAME' => Loc::getMessage('SALE_PS_MANAGER_GROUP_CONNECT_SETTINGS_ALFABANK'), 'SORT' => 100],
			'CONNECT_SETTINGS_AUTHORIZE' => ['NAME' => Loc::getMessage('SALE_PS_MANAGER_GROUP_CONNECT_SETTINGS_AUTHORIZE'), 'SORT' => 100],
			'CONNECT_SETTINGS_YANDEX' => ['NAME' => Loc::getMessage('SALE_PS_MANAGER_GROUP_CONNECT_SETTINGS_YANDEX'), 'SORT' => 100],
			'CONNECT_SETTINGS_YANDEX_INVOICE' => ['NAME' => Loc::getMessage('SALE_PS_MANAGER_GROUP_CONNECT_SETTINGS_YANDEX_INVOICE'), 'SORT' => 100],
			'CONNECT_SETTINGS_WEBMONEY' => ['NAME' => Loc::getMessage('SALE_PS_MANAGER_GROUP_CONNECT_SETTINGS_WEBMONEY'), 'SORT' => 100],
			'CONNECT_SETTINGS_ASSIST' => ['NAME' => Loc::getMessage('SALE_PS_MANAGER_GROUP_CONNECT_SETTINGS_ASSIST'), 'SORT' => 100],
			'CONNECT_SETTINGS_ROBOXCHANGE' => ['NAME' => Loc::getMessage('SALE_PS_MANAGER_GROUP_CONNECT_SETTINGS_ROBOXCHANGE'), 'SORT' => 100],
			'CONNECT_SETTINGS_QIWI' => ['NAME' => Loc::getMessage('SALE_PS_MANAGER_GROUP_CONNECT_SETTINGS_QIWI'), 'SORT' => 100],
			'CONNECT_SETTINGS_PAYPAL' => ['NAME' => Loc::getMessage('SALE_PS_MANAGER_GROUP_CONNECT_SETTINGS_PAYPAL'), 'SORT' => 100],
			'CONNECT_SETTINGS_PAYMASTER' => ['NAME' => Loc::getMessage('SALE_PS_MANAGER_GROUP_CONNECT_SETTINGS_PAYMASTER'), 'SORT' => 100],
			'CONNECT_SETTINGS_LIQPAY' => ['NAME' => Loc::getMessage('SALE_PS_MANAGER_GROUP_CONNECT_SETTINGS_LIQPAY'), 'SORT' => 100],
			'CONNECT_SETTINGS_BILL' => ['NAME' => Loc::getMessage('SALE_PS_MANAGER_GROUP_CONNECT_SETTINGS_BILL'), 'SORT' => 100],
			'CONNECT_SETTINGS_BILLDE' => ['NAME' => Loc::getMessage('SALE_PS_MANAGER_GROUP_CONNECT_SETTINGS_BILLDE'), 'SORT' => 100],
			'CONNECT_SETTINGS_BILLEN' => ['NAME' => Loc::getMessage('SALE_PS_MANAGER_GROUP_CONNECT_SETTINGS_BILLEN'), 'SORT' => 100],
			'CONNECT_SETTINGS_BILLUA' => ['NAME' => Loc::getMessage('SALE_PS_MANAGER_GROUP_CONNECT_SETTINGS_BILLUA'), 'SORT' => 100],
			'CONNECT_SETTINGS_BILLLA' => ['NAME' => Loc::getMessage('SALE_PS_MANAGER_GROUP_CONNECT_SETTINGS_BILLLA'), 'SORT' => 100],
			'CONNECT_SETTINGS_SBERBANK' => ['NAME' => Loc::getMessage('SALE_PS_MANAGER_GROUP_CONNECT_SETTINGS_SBERBANK'), 'SORT' => 100],
			'GENERAL_SETTINGS' => ['NAME' => Loc::getMessage('SALE_PS_MANAGER_GROUP_GENERAL_SETTINGS'), 'SORT' => 100],
			'COLUMN_SETTINGS' => ['NAME' => Loc::getMessage('SALE_PS_MANAGER_GROUP_COLUMN'), 'SORT' => 100],
			'VISUAL_SETTINGS' => ['NAME' => Loc::getMessage('SALE_PS_MANAGER_GROUP_VISUAL'), 'SORT' => 100],
			'PAYMENT' => ['NAME' => Loc::getMessage('SALE_PS_MANAGER_GROUP_PAYMENT'), 'SORT' => 200],
			'PAYSYSTEM' => ['NAME' => Loc::getMessage('SALE_PS_MANAGER_GROUP_PAYSYSTEM'), 'SORT' => 500],
			'PS_OTHER' => ['NAME' => Loc::getMessage('SALE_PS_MANAGER_GROUP_PS_OTHER'), 'SORT' => 10000],
			'CONNECT_SETTINGS_UAPAY' => ['NAME' => Loc::getMessage('SALE_PS_MANAGER_GROUP_CONNECT_SETTINGS_UAPAY'), 'SORT' => 100],
			'CONNECT_SETTINGS_ADYEN' => ['NAME' => Loc::getMessage('SALE_PS_MANAGER_GROUP_CONNECT_SETTINGS_ADYEN'), 'SORT' => 100],
			'CONNECT_SETTINGS_APPLE_PAY' => ['NAME' => Loc::getMessage('SALE_PS_MANAGER_GROUP_CONNECT_SETTINGS_APPLE_PAY'), 'SORT' => 200],
			'CONNECT_SETTINGS_SKB' => ['NAME' => Loc::getMessage('SALE_PS_MANAGER_GROUP_CONNECT_SETTINGS_SINARA'), 'SORT' => 100],
			'CONNECT_SETTINGS_BEPAID' => ['NAME' => Loc::getMessage('SALE_PS_MANAGER_GROUP_CONNECT_SETTINGS_BEPAID'), 'SORT' => 100],
			'CONNECT_SETTINGS_WOOPPAY' => ['NAME' => Loc::getMessage('SALE_PS_MANAGER_GROUP_CONNECT_SETTINGS_WOOPPAY'), 'SORT' => 100],
			'CONNECT_SETTINGS_PLATON' => ['NAME' => Loc::getMessage('SALE_PS_MANAGER_GROUP_CONNECT_SETTINGS_PLATON'), 'SORT' => 100],
			'CONNECT_SETTINGS_TBB' => [
				'NAME' => Loc::getMessage('SALE_PS_MANAGER_GROUP_CONNECT_SETTINGS_TBB'),
				'SORT' => 100,
			],
		];
	}

	/**
	 * @param $primary
	 * @return \Bitrix\Main\Entity\DeleteResult|\Bitrix\Main\ORM\Data\DeleteResult
	 * @throws ArgumentException
	 * @throws \Bitrix\Main\ObjectPropertyException
	 * @throws \Bitrix\Main\SystemException
	 */
	public static function delete($primary)
	{
		if (empty($primary))
		{
			throw new ArgumentException('Parameter $primary can\'t be empty');
		}

		$paySystemInfo = PaySystemActionTable::getRowById($primary);
		if ($paySystemInfo['LOGOTIP'])
		{
			\CFile::Delete($paySystemInfo['LOGOTIP']);
		}

		self::deleteRestrictions($primary);

		$service = Manager::getObjectById($primary);
		if ($service)
		{
			self::deleteBusinessValues($service);
		}

		$deleteResult = PaySystemActionTable::delete($primary);
		if ($deleteResult->isSuccess())
		{
			if ($service && $service->isSupportPrintCheck())
			{
				$onDeletePaySystemResult = Cashbox\EventHandler::onDeletePaySystem($service);
				if (!$onDeletePaySystemResult->isSuccess())
				{
					$deleteResult->addErrors($onDeletePaySystemResult->getErrors());
				}
			}
		}

		return $deleteResult;
	}

	/**
	 * Deletes restrictions
	 *
	 * @param int $paySystemId
	 * @return void
	 */
	private static function deleteRestrictions(int $paySystemId): void
	{
		$restrictionList =  Restrictions\Manager::getRestrictionsList($paySystemId);
		if ($restrictionList)
		{
			Restrictions\Manager::getClassesList();

			foreach ($restrictionList as $restriction)
			{
				/** @var Restriction $className */
				$className = $restriction['CLASS_NAME'];
				if (is_subclass_of($className, Restriction::class))
				{
					$className::delete($restriction['ID'], $paySystemId);
				}
			}
		}
	}

	/**
	 * Deletes business value with prefix
	 * Also if there is only 1 paysystem (before delete), deletes all business value including COMMON
	 *
	 * @param Service $service
	 * @return void
	 */
	private static function deleteBusinessValues(Service $service): void
	{
		BusinessValue::delete(Service::PAY_SYSTEM_PREFIX . $service->getField('ID'));

		$paySystemCount = PaySystemActionTable::getList([
			'select' => ['ID'],
			'filter' => [
				'ACTION_FILE' => $service->getField('ACTION_FILE'),
			],
			'count_total' => true,
		])->getCount();
		if ($paySystemCount === 1)
		{
			$handlerDescription = $service->getHandlerDescription();
			$handlerDescriptionCodes = array_keys($handlerDescription['CODES'] ?? []);
			foreach ($handlerDescriptionCodes as $code)
			{
				BusinessValueTable::deleteByCodeKey($code);
			}
		}
	}

	/**
	 * @param $paySystemId
	 * @return array
	 * @throws \Bitrix\Main\ArgumentException
	 */
	public static function getPersonTypeIdList($paySystemId)
	{
		$data = array();

		$dbRestriction = ServiceRestrictionTable::getList(array(
			'filter' => array(
				'SERVICE_ID' => $paySystemId,
				'SERVICE_TYPE' => Restrictions\Manager::SERVICE_TYPE_PAYMENT,
				'=CLASS_NAME' => '\\'.Restrictions\PersonType::class
			)
		));

		while ($restriction = $dbRestriction->fetch())
			$data = array_merge($data, $restriction['PARAMS']['PERSON_TYPE_ID']);

		return $data;
	}

	/**
	 * @param array $data
	 * @return Payment|null
	 * @throws ArgumentException
	 * @throws \Bitrix\Main\ArgumentNullException
	 * @throws \Bitrix\Main\ArgumentOutOfRangeException
	 * @throws \Bitrix\Main\NotImplementedException
	 * @throws \Bitrix\Main\NotSupportedException
	 * @throws \Bitrix\Main\ObjectException
	 * @throws \Bitrix\Main\ObjectNotFoundException
	 * @throws \Bitrix\Main\SystemException
	 */
	public static function getPaymentObjectByData(array $data)
	{
		$context = Application::getInstance()->getContext();

		$registry = Registry::getInstance(Registry::REGISTRY_TYPE_ORDER);

		/** @var Order $orderClass */
		$orderClass = $registry->getOrderClassName();

		/** @var Order $order */
		$order = $orderClass::create($context->getSite());
		$order->setPersonTypeId($data['PERSON_TYPE_ID']);

		/** @var Basket $basketClass */
		$basketClass = $registry->getBasketClassName();

		$basket = $basketClass::create($context->getSite());
		$order->setBasket($basket);

		$collection = $order->getPaymentCollection();
		if ($collection)
		{
			return $collection->createItem();
		}

		return null;
	}

	/**
	 * @return array
	 */
	public static function getDataRefundablePage()
	{
		$paySystemList = array();
		$dbRes = static::getList();
		while ($data = $dbRes->fetch())
		{
			$service = new Service($data);
			if ($service->isRefundable())
				$paySystemList[$data['ACTION_FILE']][] = $data;
		}

		$result = array();
		foreach ($paySystemList as $handler => $data)
		{
			/* @var ServiceHandler $classHandler */
			$classHandler = static::getClassNameFromPath($handler);

			if (is_subclass_of($classHandler, '\Bitrix\Sale\PaySystem\ServiceHandler'))
			{
				$settings = $classHandler::findMyDataRefundablePage($data);
				if ($settings)
					$result = array_merge($settings, $result);
			}
		}

		return $result;
	}

	/**
	 * @return array
	 */
	private static function getRestHandlers()
	{
		$result = array();

		$dbRes = PaySystemRestHandlersTable::getList();
		while ($item = $dbRes->fetch())
		{
			$result[$item['CODE']] = $item['NAME'].' ('.$item['CODE'].')';
		}

		return $result;
	}

	/**
	 * @param $handler
	 * @return bool
	 */
	public static function isRestHandler($handler)
	{
		static $result = [];

		if (isset($result[$handler]))
		{
			return $result[$handler];
		}

		$handlerData = PaySystemRestHandlersTable::getList([
			'filter' => ['=CODE' => $handler],
			'limit' => 1,
		])->fetch();
		$result[$handler] = (bool)$handlerData;

		return $result[$handler] ?? false;
	}

	/**
	 * @param $actionFile
	 * @return array
	 * @throws \Bitrix\Main\ArgumentNullException
	 * @throws \Bitrix\Main\ArgumentOutOfRangeException
	 * @throws \Bitrix\Main\SystemException
	 */
	public static function includeHandler($actionFile): array
	{
		$className = '';
		$handlerType = '';

		if ($name = self::getFolderFromClassName($actionFile))
		{
			$documentRoot = Application::getDocumentRoot();
			foreach (self::getHandlerDirectories() as $type => $path)
			{
				if (File::isFileExists($documentRoot.$path.$name.'/handler.php'))
				{
					$className = self::getClassNameFromPath($actionFile);
					if (!class_exists($className))
						require_once($documentRoot.$path.$name.'/handler.php');

					if (class_exists($className))
					{
						$handlerType = $type;
						break;
					}

					$className = '';
				}
			}
		}

		if ($className === '')
		{
			if (self::isRestHandler($actionFile))
			{
				$className = '\Bitrix\Sale\PaySystem\RestHandler';
				if (!class_exists($actionFile))
				{
					class_alias($className, $actionFile);
				}
			}
			else
			{
				$className = '\Bitrix\Sale\PaySystem\CompatibilityHandler';
			}
		}

		return [
			$className,
			$handlerType,
		];
	}

	public static function getHandlerName(string $handler, string $psMode = ''): string
	{
		$handlerDescription = Manager::getHandlerDescription($handler, $psMode);

		if (!$handlerDescription)
		{
			return '';
		}

		if (isset($handlerDescription['HANDLER_MODE_LIST'][$psMode]))
		{
			return $handlerDescription['HANDLER_MODE_LIST'][$psMode];
		}
		elseif (isset($handlerDescription['NAME']))
		{
			return $handlerDescription['NAME'];
		}

		return '';
	}
}

Youez - 2016 - github.com/yon3zu
LinuXploit