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/components/bitrix/catalog.agent.contract.detail/

Upload File :
current_dir [ Writeable] document_root [ Writeable]

 

Command :


[ Back ]     

Current File : /home/bitrix/ext_www/cvetdv.ru/bitrix/components/bitrix/catalog.agent.contract.detail/class.php
<?php

if (!defined('B_PROLOG_INCLUDED') || B_PROLOG_INCLUDED !== true)
{
	die();
}

use Bitrix\Main;
use Bitrix\Catalog;

Main\Loader::includeModule('catalog');

class CatalogAgentContractDetail
	extends \CBitrixComponent
	implements Main\Engine\Contract\Controllerable, Main\Errorable
{
	use Main\ErrorableImplementation;

	private const PATH_TO_USER_PROFILE_DEFAULT = '/company/personal/user/#USER_ID#/';

	/** @var Catalog\v2\Contractor\Provider\IProvider|null */
	private ?Catalog\v2\Contractor\Provider\IProvider $contractorsProvider;

	public function __construct($component = null)
	{
		parent::__construct($component);

		$this->contractorsProvider = Catalog\v2\Contractor\Provider\Manager::getActiveProvider(
			Catalog\v2\Contractor\Provider\Manager::PROVIDER_AGENT_CONTRACT
		);
	}

	public function configureActions()
	{
		return [];
	}

	public function onPrepareComponentParams($arParams)
	{
		$this->errorCollection = new Main\ErrorCollection();

		$arParams['ID'] = (int)($arParams['ID'] ?? 0);
		$arParams['IBLOCK_ID'] = (int)($arParams['IBLOCK_ID'] ?? 0);

		return parent::onPrepareComponentParams($arParams);
	}

	private function checkRequiredParams(): bool
	{
		if ($this->arParams['IBLOCK_ID'] <= 0)
		{
			$this->arResult['ERROR_MESSAGES'][] = Main\Localization\Loc::getMessage('CATALOG_AGENT_CONTRACT_DETAIL_IBLOCK_NOT_FOUND');
			return false;
		}

		return true;
	}

	protected function listKeysSignedParameters()
	{
		return [
			'ID',
			'IBLOCK_ID',
			'PATH_TO',
		];
	}

	private function initResult(): void
	{
		$this->arResult = [
			'ID' => 0,
			'TITLE' => '',
			'IBLOCK_ID' => 0,
			'ENTITY_ID' => 0,
			'ENTITY_FIELDS' => [],
			'ENTITY_CONFIG' => [],
			'ENTITY_DATA' => [],
			'ENTITY_CONTROLLERS' => [],
			'INITIAL_MODE' => 'view',
			'ERROR_MESSAGES' => [],
		];
	}

	private function prepareResult(): void
	{
		$this->arResult['ID'] = $this->arParams['ID'];
		$this->arResult['IBLOCK_ID'] = $this->arParams['IBLOCK_ID'];

		$fields = $this->getFields();

		$documentData = [];
		if ($this->arResult['ID'] > 0)
		{
			$documentData = $this->loadDocument($this->arResult['ID']);
			$this->arResult['TITLE'] = $documentData['TITLE'];
		}

		$this->prepareFormData($fields, $documentData);

		$this->arResult['INCLUDE_CRM_ENTITY_EDITOR'] = Catalog\v2\Contractor\Provider\Manager::isActiveProviderByModule(
			Catalog\v2\Contractor\Provider\Manager::PROVIDER_STORE_DOCUMENT, 'crm'
		);
	}

	private function prepareFormData(array $fields, array $documentData = []): void
	{
		$this->arResult['ENTITY_ID'] = $this->arParams['ID'];
		$this->arResult['ENTITY_FIELDS'] = $this->getEntityFields($fields, $documentData);
		$this->arResult['ENTITY_CONFIG'] = $this->getEntityConfig();
		$this->arResult['ENTITY_DATA'] = $this->getEntityData($documentData);
		$this->arResult['ENTITY_CONTROLLERS'] = $this->getEntityControllers();

		$this->arResult['INITIAL_MODE'] = $this->arParams['ID'] > 0 ? 'view' : 'edit';
	}

	private function getFields(): array
	{
		return [
			'ID' => Main\Localization\Loc::getMessage('CATALOG_AGENT_CONTRACT_DETAIL_FIELD_ID'),
			'TITLE' => Main\Localization\Loc::getMessage('CATALOG_AGENT_CONTRACT_DETAIL_FIELD_TITLE'),
			'PRODUCT_LIST' => Main\Localization\Loc::getMessage('CATALOG_AGENT_CONTRACT_DETAIL_FIELD_PRODUCT_LIST'),
			'SECTION_LIST' => Main\Localization\Loc::getMessage('CATALOG_AGENT_CONTRACT_DETAIL_FIELD_SECTION_LIST'),
			'DATE_MODIFY' => Main\Localization\Loc::getMessage('CATALOG_AGENT_CONTRACT_DETAIL_FIELD_DATE_MODIFY'),
			'DATE_CREATE' => Main\Localization\Loc::getMessage('CATALOG_AGENT_CONTRACT_DETAIL_FIELD_DATE_CREATE'),
			'MODIFIED_BY' => Main\Localization\Loc::getMessage('CATALOG_AGENT_CONTRACT_DETAIL_FIELD_MODIFIED_BY'),
			'CREATED_BY' => Main\Localization\Loc::getMessage('CATALOG_AGENT_CONTRACT_DETAIL_FIELD_CREATED_BY'),
			'FILES' => Main\Localization\Loc::getMessage('CATALOG_AGENT_CONTRACT_DETAIL_FIELD_FILES'),
		];
	}

	private function getEntityFields(array $fields, array $documentData): array
	{
		$result = [];

		$result[] = [
			'id' => 'ID',
			'title' => $fields['ID'],
			'name' => 'ID',
			'type' => 'number',
			'isDragEnabled' => false,
			'editable' => false,
		];

		$result[] = [
			'id' => 'TITLE',
			'title' => $fields['TITLE'],
			'name' => 'TITLE',
			'type' => 'text',
			'isDragEnabled' => false,
			'editable' => true,
			'isHeading' => true,
			'visibilityPolicy' => 'edit',
			'placeholders' => [
				'creation' => $this->getTitle(),
			],
		];

		$result[] = [
			'id' => 'FILES',
			'title' => $fields['FILES'],
			'name' => 'FILES',
			'type' => 'file',
			'isDragEnabled' => false,
			'editable' => true,
			'showAlways' => true,
			'data' => [
				'multiple' => true,
				'maxFileSize' => \CUtil::Unformat(ini_get('upload_max_filesize')),
			]
		];

		$result[] = $this->getContractorEntityField();

		$result[] = [
			'id' => 'PRODUCT_LIST',
			'title' => $fields['PRODUCT_LIST'],
			'name' => 'PRODUCT_LIST',
			'type' => 'productSet',
			'data' => [
				'entityList' => 'ENTITY_PRODUCT_LIST',
				'iblockId' => 'IBLOCK_ID',
			],
			'isDragEnabled' => false,
			'editable' => true,
			'optionFlags' => 1,
		];

		$result[] = [
			'id' => 'SECTION_LIST',
			'title' => $fields['SECTION_LIST'],
			'name' => 'SECTION_LIST',
			'type' => 'sectionSet',
			'data' => [
				'entityList' => 'ENTITY_SECTION_LIST',
				'iblockId' => 'IBLOCK_ID',
			],
			'isDragEnabled' => false,
			'editable' => true,
			'optionFlags' => 1,
		];

		if ($this->arParams['ID'] > 0)
		{
			$result[] = [
				'id' => 'DATE_MODIFY',
				'title' => $fields['DATE_MODIFY'],
				'name' => 'DATE_MODIFY',
				'type' => 'text',
				'isDragEnabled' => false,
				'editable' => false,
			];

			$result[] = [
				'id' => 'DATE_CREATE',
				'title' => $fields['DATE_CREATE'],
				'name' => 'DATE_CREATE',
				'type' => 'text',
				'isDragEnabled' => false,
				'editable' => false,
			];

			if (!empty($documentData['MODIFIED_BY']))
			{
				$result[] = [
					'name' => 'MODIFIED_BY',
					'title' => $fields['MODIFIED_BY'],
					'type' => 'user',
					'isDragEnabled' => false,
					'editable' => false,
					'data' => [
						'enableEditInView' => false,
						'formated' => 'MODIFIED_BY_FORMATTED_NAME',
						'position' => 'MODIFIED_BY_WORK_POSITION',
						'photoUrl' => 'MODIFIED_BY_PHOTO_URL',
						'showUrl' => 'PATH_TO_MODIFIED_BY_USER',
						'pathToProfile' => $this->getUserPersonalUrlTemplate(),
					],
				];
			}

			if (!empty($documentData['CREATED_BY']))
			{
				$result[] = [
					'name' => 'CREATED_BY',
					'title' => $fields['CREATED_BY'],
					'type' => 'user',
					'isDragEnabled' => false,
					'editable' => false,
					'data' => [
						'enableEditInView' => false,
						'formated' => 'CREATED_BY_FORMATTED_NAME',
						'position' => 'CREATED_BY_WORK_POSITION',
						'photoUrl' => 'CREATED_BY_PHOTO_URL',
						'showUrl' => 'PATH_TO_CREATED_BY_USER',
						'pathToProfile' => $this->getUserPersonalUrlTemplate(),
					],
				];
			}

		}

		return $result;
	}

	private function getEntityConfig(): array
	{
		$config = [
			[
				'title' => Main\Localization\Loc::getMessage('CATALOG_AGENT_CONTRACT_DETAIL_SECTION_COMMON'),
				'name' => 'common',
				'type' => 'section',
				'elements' => [
					['name' => 'TITLE'],
					['name' => 'FILES'],
					['name' => 'CONTRACTOR_ID'],
				],
				'data' => [
					'isChangeable' => false,
					'isRemovable' => false,
				],
			],
			[
				'title' => Main\Localization\Loc::getMessage('CATALOG_AGENT_CONTRACT_DETAIL_SECTION_PRODUCTS'),
				'name' => 'products',
				'type' => 'section',
				'elements' => [
					['name' => 'PRODUCT_LIST'],
					['name' => 'SECTION_LIST'],
				],
				'data' => [
					'isChangeable' => false,
					'isRemovable' => false,
				],
			],
		];

		if ($this->arParams['ID'] > 0)
		{
			$config[] = [
				'title' => Main\Localization\Loc::getMessage('CATALOG_AGENT_CONTRACT_DETAIL_SECTION_ADDITIONALLY'),
				'name' => 'additionally',
				'type' => 'section',
				'elements' => [
					['name' => 'DATE_CREATE'],
					['name' => 'CREATED_BY'],
					['name' => 'DATE_MODIFY'],
					['name' => 'MODIFIED_BY'],
				],
				'data' => [
					'isChangeable' => false,
					'isRemovable' => false,
					'enableToggling' => false,
				],
			];
		}

		return $config;
	}

	private function getEntityData(array $documentData = []): array
	{
		$entityData = [
			'ID' => $this->arResult['ID'] ?? null,
			'TITLE' => '',
			'IBLOCK_ID' => $this->arResult['IBLOCK_ID'] ?? null,
			'CONTRACTOR_ID' => null,
			'DATE_MODIFY' => null,
			'DATE_CREATE' => null,
			'MODIFIED_BY' => null,
			'CREATED_BY' => null,
		];

		if ($documentData)
		{
			$entityData['TITLE'] = htmlspecialcharsbx($documentData['TITLE']);
			$entityData['CONTRACTOR_ID'] = $documentData['CONTRACTOR_ID'];

			if ($documentData['DATE_MODIFY'] instanceof Main\Type\DateTime)
			{
				$entityData['DATE_MODIFY'] = $documentData['DATE_MODIFY']->toString();
			}

			if ($documentData['DATE_CREATE'] instanceof Main\Type\DateTime)
			{
				$entityData['DATE_CREATE'] = $documentData['DATE_CREATE']->toString();
			}

			if ($documentData['MODIFIED_BY'])
			{
				$entityData['MODIFIED_BY'] = $documentData['MODIFIED_BY'];
			}

			if ($documentData['CREATED_BY'])
			{
				$entityData['CREATED_BY'] = $documentData['CREATED_BY'];
			}

			if ($documentData['MODIFIED_BY'])
			{
				$entityData = array_merge($entityData, $this->getUserDataToEntity($documentData['MODIFIED_BY'], 'MODIFIED_BY'));
			}

			if ($documentData['CREATED_BY'])
			{
				$entityData = array_merge($entityData, $this->getUserDataToEntity($documentData['CREATED_BY'], 'CREATED_BY'));
			}

			$entityData['FILES'] = $documentData['FILES'];
		}

		return array_merge(
			$entityData,
			$this->getContractorEntityData($documentData),
			$this->getProductsEntityData($documentData),
		);
	}

	private function getEntityControllers(): array
	{
		return [
			[
				'name' => 'AGENT_CONTRACT',
				'type' => 'agent_contract',
				'config' => [],
			],
		];
	}

	private function loadDocument(int $id): array
	{
		$agentContractResult = Catalog\v2\AgentContract\Manager::get($id);
		return $agentContractResult->getData();
	}

	private function getProductsEntityData(array $documentData): array
	{
		$productList = [];
		$sectionList = [];
		$entityEditorProductList = [];
		$entityEditorSectionList = [];

		if (isset($documentData['PRODUCTS']))
		{
			foreach ($documentData['PRODUCTS'] as $documentProduct)
			{
				$product = [
					'ID' => $documentProduct['ID'],
					'PRODUCT_ID' => $documentProduct['PRODUCT_ID'],
					'PRODUCT_TYPE' => $documentProduct['PRODUCT_TYPE'],
					'IMAGE' => $documentProduct['IMAGE'],
				];

				$entityEditorProduct =  [
					'PRODUCT_ID' => $documentProduct['PRODUCT_ID'],
					'PRODUCT_TYPE' => $documentProduct['PRODUCT_TYPE'],
					'PRODUCT_NAME' => $documentProduct['PRODUCT_NAME'],
					'IMAGE' => $documentProduct['IMAGE'],
				];

				if ($documentProduct['PRODUCT_TYPE'] === Catalog\AgentProductTable::PRODUCT_TYPE_PRODUCT)
				{
					$productList[] = $product;
					$entityEditorProductList[] = $entityEditorProduct;
				}
				elseif ($documentProduct['PRODUCT_TYPE'] === Catalog\AgentProductTable::PRODUCT_TYPE_SECTION)
				{
					$sectionList[] = $product;
					$entityEditorSectionList[] = $entityEditorProduct;
				}
			}
		}

		return [
			'PRODUCT_LIST' => $productList,
			'ENTITY_PRODUCT_LIST' => $entityEditorProductList,
			'SECTION_LIST' => $sectionList,
			'ENTITY_SECTION_LIST' => $entityEditorSectionList,
		];
	}

	private function getContractorEntityField(): array
	{
		return [
			'id' => 'CONTRACTOR_ID',
			'name' => 'CONTRACTOR_ID',
			'title' => Main\Localization\Loc::getMessage('CATALOG_AGENT_CONTRACT_DETAIL_FIELD_CONTRACTOR'),
			'type' =>
				$this->contractorsProvider
				? $this->contractorsProvider::getEditorFieldType()
				: 'contractor',
			'isDragEnabled' => false,
			'editable' => true,
			'required' => true,
			'data' =>
				$this->contractorsProvider
				? $this->contractorsProvider::getEditorFieldData()
				: [
					'contractorName' => 'CONTRACTOR_NAME',
				],
		];
	}

	private function getTitle(): string
	{
		return Main\Localization\Loc::getMessage('CATALOG_AGENT_CONTRACT_DETAIL_FIELD_TITLE_PLACEHOLDER');
	}

	/**
	 * @param array $document
	 * @return array
	 */
	private function getContractorEntityData(array $documentData): array
	{
		return $this->contractorsProvider
			? $this->getProviderContractorEntityData($documentData)
			: [
				'CONTRACTOR_NAME' => $this->getContractorName($documentData)
			]
		;
	}

	private function getProviderContractorEntityData(array $documentData): array
	{
		return $this->contractorsProvider::getEditorEntityData((int)($documentData['ID'] ?? 0));
	}

	private function getContractorName(array $documentData): string
	{
		$contractorName = '';

		if (isset($documentData['CONTRACTOR_ID']) && $documentData['CONTRACTOR_ID'] > 0)
		{
			$contractor = Catalog\ContractorTable::getRow([
				'select' => ['PERSON_NAME', 'COMPANY'],
				'filter' => ['=ID' => $documentData['CONTRACTOR_ID']],
			]);

			if ($contractor)
			{
				if (!empty($contractor['COMPANY']))
				{
					$contractorName = $contractor['COMPANY'];
				}
				elseif (!empty($contractor['PERSON_NAME']))
				{
					$contractorName = $contractor['PERSON_NAME'];
				}
			}
		}

		return $contractorName;
	}

	protected function getUserDataToEntity(int $userId, string $userReferenceName): array
	{
		$result = [];

		$user = Main\UserTable::getRow([
			'select' => [
				'ID', 'LOGIN', 'NAME', 'SECOND_NAME', 'LAST_NAME', 'TITLE', 'PERSONAL_PHOTO', 'WORK_POSITION', 'IS_REAL_USER',
			],
			'filter' => ['=ID' => $userId]
		]);

		if (is_array($user))
		{
			$result[$userReferenceName . '_LOGIN'] = $user['LOGIN'];
			$result[$userReferenceName . '_NAME'] = $user['NAME'] ?? '';
			$result[$userReferenceName . '_SECOND_NAME'] = $user['SECOND_NAME'] ?? '';
			$result[$userReferenceName . '_LAST_NAME'] = $user['LAST_NAME'] ?? '';
			$result[$userReferenceName . '_PERSONAL_PHOTO'] = $user['PERSONAL_PHOTO'] ?? '';
			$result[$userReferenceName . '_FORMATTED_NAME'] =
				\CUser::FormatName(
					\CSite::GetNameFormat(),
					$user,
					true,
					false
				)
			;
		}

		$photoId = isset($result[$userReferenceName . '_PERSONAL_PHOTO'])
			? (int)$result[$userReferenceName . '_PERSONAL_PHOTO']
			: 0
		;

		if ($photoId > 0)
		{
			$fileInfo = \CFile::ResizeImageGet(
				$photoId,
				[
					'width' => 60,
					'height'=> 60,
				],
				BX_RESIZE_IMAGE_EXACT
			);
			if (is_array($fileInfo) && isset($fileInfo['src']))
			{
				$result[$userReferenceName . '_PHOTO_URL'] = $fileInfo['src'];
			}
		}

		$result['PATH_TO_' . $userReferenceName . '_USER'] =
			\CComponentEngine::MakePathFromTemplate(
				$this->getUserPersonalUrlTemplate(),
				[
					'USER_ID' => $userId,
					'ID' => $userId,
					'user_id' => $userId,
				]
			);

		return $result;
	}

	private function getUserPersonalUrlTemplate(): string
	{
		return Main\Config\Option::get('intranet', 'path_user', self::PATH_TO_USER_PROFILE_DEFAULT, $this->getSiteId());
	}

	private function checkModules(): bool
	{
		if (!Main\Loader::includeModule('catalog'))
		{
			$this->arResult['ERROR_MESSAGES'][] = Main\Localization\Loc::getMessage('CATALOG_AGENT_CONTRACT_DETAIL_MODULE_CATALOG_NOT_FOUND');
			return false;
		}

		return true;
	}

	private function checkPermission(): bool
	{
		if (!Catalog\v2\AgentContract\AccessController::check())
		{
			$this->arResult['ERROR_MESSAGES'][] = Main\Localization\Loc::getMessage('CATALOG_AGENT_CONTRACT_DETAIL_PERMISSION_DENIED');
			return false;
		}

		return true;
	}

	public function executeComponent()
	{
		if (
			$this->checkModules()
			&& $this->checkPermission()
			&& $this->checkRequiredParams()
		)
		{
			$this->initResult();
			$this->prepareResult();
		}

		$this->includeComponentTemplate();
	}

	public function saveAction(array $data = []): array
	{
		if (!Catalog\v2\AgentContract\AccessController::check())
		{
			$error = Main\Localization\Loc::getMessage('CATALOG_AGENT_CONTRACT_DETAIL_PERMISSION_DENIED');
			$this->errorCollection->setError(new Main\Error($error));
			$response['ERROR'] = $error;
			return $response;
		}

		if (empty($data))
		{
			$requestData = $this->request->get('data');
			$data = ($requestData && is_array($requestData)) ? $requestData : [];
		}

		$fields = [];

		if (!empty($data['TITLE']))
		{
			$fields['TITLE'] = $data['TITLE'];
		}

		if (!empty($data['FILES']))
		{
			$fields['FILES'] = \Bitrix\Main\UI\FileInputUtility::instance()->checkFiles(
				'files_uploader',
				$data['FILES']
			);
		}

		if (!empty($data['CONTRACTOR_ID']))
		{
			$fields['CONTRACTOR_ID'] = $data['CONTRACTOR_ID'];
		}

		$products = $data['PRODUCT_LIST'] ?: [];
		if ($products)
		{
			$products = \CUtil::JsObjectToPhp($products);
		}

		$sections = $data['SECTION_LIST'] ?: [];
		if ($sections)
		{
			$sections = \CUtil::JsObjectToPhp($sections);
		}

		$productFields = array_merge($products, $sections);
		$productFields = array_map(
			static function ($productField) {
				$productField['PRODUCT_TYPE'] = mb_strtoupper($productField['PRODUCT_TYPE']);
				return $productField;
			},
			$productFields
		);

		$id = (int)($this->arParams['ID'] ?? 0);
		$contractorProviderSaveResult = null;
		if ($this->contractorsProvider)
		{
			$clientData = $data['CLIENT_DATA'] ?: [];
			if ($clientData)
			{
				$contractorProviderAccessResult = $this->contractorsProvider::checkAccessRights(
					$id,
					$fields + ['CLIENT_DATA' => $clientData],
				);
				if (!$contractorProviderAccessResult->isSuccess())
				{
					$error = $contractorProviderAccessResult->getError();
					$this->errorCollection->setError($error);
					$response['ERROR'] = $error->getMessage();

					return $response;
				}

				$contractorProviderSaveResult = $this->contractorsProvider::onBeforeDocumentSave(
					$fields + ['CLIENT_DATA' => $clientData]
				);
			}
		}

		$response = [];

		if ($id > 0)
		{
			$fields['FILES_del'] = $data['FILES_del'] ?? [];
			$result = Catalog\v2\AgentContract\Manager::update($id, $fields, $productFields);
		}
		else
		{
			$result = Catalog\v2\AgentContract\Manager::add($fields, $productFields);
			if ($result->isSuccess())
			{
				$data = $result->getData();
				$id = $data['ID'];
				$response['REDIRECT_URL'] = $this->getDetailComponentPath($id);
			}
		}

		if ($result->isSuccess())
		{
			if ($this->contractorsProvider && $contractorProviderSaveResult)
			{
				$this->contractorsProvider::onAfterDocumentSaveSuccess(
					$id,
					$contractorProviderSaveResult
				);
			}

			$documentData = $this->loadDocument($id);
			$response += [
				'ENTITY_ID' => $id,
				'ENTITY_DATA' => $this->getEntityData($documentData),
			];
		}
		else
		{
			if ($this->contractorsProvider && $contractorProviderSaveResult)
			{
				$this->contractorsProvider::onAfterDocumentSaveFailure($id, $contractorProviderSaveResult);
			}

			$this->errorCollection->add($result->getErrors());
			$response['ERROR'] = implode('<br>', $result->getErrorMessages());
		}

		return $response;
	}

	private function getDetailComponentPath(int $id): string
	{
		$pathToPaymentDetailTemplate = $this->arParams['PATH_TO']['DETAIL'] ?? '';
		if ($pathToPaymentDetailTemplate === '')
		{
			return $pathToPaymentDetailTemplate;
		}

		return str_replace('#AGENT_CONTRACT_ID#', $id, $pathToPaymentDetailTemplate);
	}
}

Youez - 2016 - github.com/yon3zu
LinuXploit