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/ilovecveti.ru/bitrix/modules/catalog/lib/Access/Component/

Upload File :
current_dir [ Writeable] document_root [ Writeable]

 

Command :


[ Back ]     

Current File : /home/bitrix/ext_www/ilovecveti.ru/bitrix/modules/catalog/lib/Access/Component/PermissionConfig.php
<?php

namespace Bitrix\Catalog\Access\Component;

use Bitrix\Catalog\Access\Component\PermissionConfig\RoleMembersInfo;
use Bitrix\Catalog\Access\Permission\PermissionDictionary;
use Bitrix\Catalog\Access\Permission\PermissionTable;
use Bitrix\Catalog\Access\Permission\PermissionArticles;
use Bitrix\Catalog\Store\EnableWizard\Manager;
use Bitrix\Catalog\Store\EnableWizard\ModeList;
use Bitrix\Catalog\StoreDocumentTable;
use Bitrix\Main\Loader;
use Bitrix\Main\Localization\Loc;
use Bitrix\Catalog\Access\Role\RoleUtil;
use Bitrix\Catalog\Access\Role\RoleDictionary;
use Bitrix\Catalog\Config\State;
use Bitrix\Main\ModuleManager;
use Bitrix\Main\SystemException;

Loc::loadMessages(__FILE__);

class PermissionConfig
{
	public const SECTION_CATALOG = 'SECTION_CATALOG';
	public const SECTION_CATALOG_SETTINGS = 'SECTION_CATALOG_SETTINGS';
	public const SECTION_INVENTORY_MANAGMENT = 'SECTION_INVENTORY_MANAGMENT';
	public const SECTION_SETTINGS = 'SECTION_SETTINGS';
	public const SECTION_RESERVATION = 'SECTION_RESERVATION';
	public const SECTION_STORE_DOCUMENT_ARRIVAL = 'SECTION_STORE_DOCUMENT_ARRIVAL';
	public const SECTION_STORE_DOCUMENT_STORE_ADJUSTMENT = 'SECTION_STORE_DOCUMENT_STORE_ADJUSTMENT';
	public const SECTION_STORE_DOCUMENT_MOVING = 'SECTION_STORE_DOCUMENT_MOVING';
	public const SECTION_STORE_DOCUMENT_DEDUCT = 'SECTION_STORE_DOCUMENT_DEDUCT';
	public const SECTION_STORE_DOCUMENT_SALES_ORDER = 'SECTION_STORE_DOCUMENT_SALES_ORDER';

	/**
	 * Access rights.
	 *
	 * @return array in format for `BX.UI.AccessRights.Section` js class.
	 */
	public function getAccessRights(): array
	{
		if (State::isUsedInventoryManagement())
		{
			if (Manager::getCurrentMode() === ModeList::B24)
			{
				return $this->getAccessRightsWithInventoryManagement();
			}
			elseif (Manager::getCurrentMode() === ModeList::ONEC && State::isExternalCatalog())
			{
				return $this->getAccessRightsWithExternalCatalog();
			}
		}

		if (State::isExternalCatalog())
		{
			throw new SystemException('Standalone catalog is not supported');
		}

		return $this->getAccessRightsGeneral();
	}

	/**
	 * All access rights (with inventory management).
	 *
	 * @return array
	 */
	private function getAccessRightsWithInventoryManagement(): array
	{
		$res = [];

		$sections = $this->getSections(true);
		$storeDocumentsMap = $this->getStoreDocumentSectionCodesMap();
		foreach ($sections as $sectionName => $permissions)
		{
			$isStoreSectionName = isset($storeDocumentsMap[$sectionName]);
			$rights = [];
			foreach ($permissions as $permissionId)
			{
				if ($isStoreSectionName)
				{
					[$permissionId, $documentId] = explode('_', $permissionId);
					$rights[] = PermissionDictionary::getStoreDocumentPermission($permissionId, $documentId);
				}
				else
				{
					$rights[] = PermissionDictionary::getPermission($permissionId);
				}
			}

			$res[] = [
				'sectionCode' => $sectionName,
				'sectionTitle' => Loc::getMessage('CATALOG_CONFIG_PERMISSIONS_' . $sectionName) ?? $sectionName,
				'sectionHint' => Loc::getMessage('HINT_CATALOG_CONFIG_PERMISSIONS_' . $sectionName),
				'rights' => $rights
			];
		}

		$res = $this->appendArticleLinks($res);

		return $res;
	}

	/**
	 * All access rights for the case of external catalog.
	 *
	 * @return array
	 */
	private function getAccessRightsWithExternalCatalog(): array
	{
		$res = [];

		$sections = $this->getSectionsForExternalCatalog();
		$realizationSection = [
			self::SECTION_STORE_DOCUMENT_SALES_ORDER => StoreDocumentTable::TYPE_SALES_ORDERS,
		];
		foreach ($sections as $sectionName => $permissions)
		{
			$isStoreSectionName = isset($realizationSection[$sectionName]);
			$rights = [];
			foreach ($permissions as $permissionId)
			{
				if ($isStoreSectionName)
				{
					[$permissionId, $documentId] = explode('_', $permissionId);
					$rights[] = PermissionDictionary::getStoreDocumentPermission($permissionId, $documentId);
				}
				else
				{
					$rights[] = PermissionDictionary::getPermission($permissionId);
				}
			}

			$res[] = [
				'sectionCode' => $sectionName,
				'sectionTitle' => Loc::getMessage('CATALOG_CONFIG_PERMISSIONS_' . $sectionName) ?? $sectionName,
				'sectionHint' => Loc::getMessage('HINT_CATALOG_CONFIG_PERMISSIONS_' . $sectionName),
				'rights' => $rights
			];
		}

		$res = $this->appendArticleLinks($res);

		return $res;
	}

	/**
	 * Append article links to permissions hints.
	 *
	 * @param array $res
	 *
	 * @return array
	 */
	private function appendArticleLinks(array $res): array
	{
		$articles = new PermissionArticles();

		foreach ($res as $i => $info)
		{
			if (isset($info['sectionHint']))
			{
				$articleLink = $articles->getSectionArticleLink($info['sectionCode']);
				if ($articleLink)
				{
					$res[$i]['sectionHint'] .= " {$articleLink}";
				}
			}

			foreach ($info['rights'] as $z => $right)
			{
				$permissionId = $right['id'];

				if (isset($right['hint']))
				{
					$articleLink = $articles->getPermissionArticleLink($permissionId);
					if ($articleLink)
					{
						$res[$i]['rights'][$z]['hint'] .= " {$articleLink}";
					}
				}
			}
		}

		return $res;
	}

	/**
	 * Only general access rights (without inventory management rights).
	 *
	 * @return array
	 */
	private function getAccessRightsGeneral(): array
	{
		$res = [];

		$sections = $this->getSections(false);
		foreach ($sections as $sectionName => $permissions)
		{
			$rights = [];
			foreach ($permissions as $permissionId)
			{
				$rights[] = PermissionDictionary::getPermission($permissionId);
			}

			$res[] = [
				'sectionTitle' => Loc::getMessage('CATALOG_CONFIG_PERMISSIONS_' . $sectionName) ?? $sectionName,
				'rights' => $rights
			];
		}

		return $res;
	}

	/**
	 * Get saved user roles.
	 *
	 * @return array in format for `BX.UI.AccessRights.Grid.userGroups` js property.
	 */
	public function getUserGroups(): array
	{
		$list = RoleUtil::getRoles();

		$members = $this->getRoleMembersMap();
		$accessRights = $this->getRoleAccessRightsMap();

		$roles = [];
		foreach ($list as $row)
		{
			$roleId = (int) $row['ID'];

			$roles[] = [
				'id' => $roleId,
				'title'  => RoleDictionary::getRoleName($row['NAME']),
				'accessRights' => $accessRights[$roleId] ?? [],
				'members' => $members[$roleId] ?? [],
			];
		}

		return $roles;
	}

	/**
	 * Get sections for view on rights settings page.
	 *
	 * @param bool $withInventoryManagmentSections
	 *
	 * @return array
	 */
	private function getSections(bool $withInventoryManagmentSections): array
	{
		$sections = [
			self::SECTION_CATALOG => $this->getCommonCatalogSection(),
		];

		if ($withInventoryManagmentSections)
		{
			$sections[self::SECTION_INVENTORY_MANAGMENT] = [
				PermissionDictionary::CATALOG_INVENTORY_MANAGEMENT_ACCESS,
				PermissionDictionary::CATALOG_STORE_MODIFY,
				PermissionDictionary::CATALOG_STORE_VIEW,
			];

			if (Loader::includeModule('report'))
			{
				$sections[self::SECTION_INVENTORY_MANAGMENT][] = PermissionDictionary::CATALOG_STORE_ANALYTIC_VIEW;
			}
			$sections[self::SECTION_INVENTORY_MANAGMENT][] = PermissionDictionary::CATALOG_SETTINGS_STORE_DOCUMENT_CARD_EDIT;

			foreach ($this->getStoreDocumentSectionCodesMap() as $code => $typeId)
			{
				$sections[$code] = $this->getStoreDocumentsSectionPermissions($typeId);
			}

			$reservationSection = $this->getReservationSection();
			if ($reservationSection)
			{
				$sections[self::SECTION_RESERVATION] = $reservationSection;
			}
		}

		$sections[self::SECTION_CATALOG_SETTINGS] = $this->getCatalogSettingsSection();
		$sections[self::SECTION_SETTINGS] = [
			PermissionDictionary::CATALOG_SETTINGS_ACCESS,
			PermissionDictionary::CATALOG_SETTINGS_EDIT_RIGHTS,
			PermissionDictionary::CATALOG_SETTINGS_SELL_NEGATIVE_COMMODITIES,
		];

		if ($withInventoryManagmentSections)
		{
			$sections[self::SECTION_RESERVATION][] = PermissionDictionary::CATALOG_RESERVE_SETTINGS;
		}

		return $sections;
	}

	private function getSectionsForExternalCatalog(): array
	{
		$sections = [
			self::SECTION_CATALOG => $this->getCommonCatalogSectionForExternalCatalog(),
		];

		$sections[self::SECTION_INVENTORY_MANAGMENT] = [
			PermissionDictionary::CATALOG_STORE_VIEW,
		];

		$sections[self::SECTION_INVENTORY_MANAGMENT][] = PermissionDictionary::CATALOG_SETTINGS_STORE_DOCUMENT_CARD_EDIT;

		$sections[self::SECTION_STORE_DOCUMENT_SALES_ORDER] = $this->getStoreDocumentsSectionPermissions(StoreDocumentTable::TYPE_SALES_ORDERS);

		$reservationSection = $this->getReservationSection();
		if ($reservationSection)
		{
			$sections[self::SECTION_RESERVATION] = $reservationSection;
		}

		$sections[self::SECTION_CATALOG_SETTINGS] = $this->getCatalogSettingsSectionForExternalCatalog();
		$sections[self::SECTION_SETTINGS] = [
			PermissionDictionary::CATALOG_SETTINGS_ACCESS,
			PermissionDictionary::CATALOG_SETTINGS_EDIT_RIGHTS,
			PermissionDictionary::CATALOG_SETTINGS_SELL_NEGATIVE_COMMODITIES,
		];

		$sections[self::SECTION_RESERVATION][] = PermissionDictionary::CATALOG_RESERVE_SETTINGS;

		return $sections;
	}

	private function getReservationSection(): array
	{
		$result = [];

		if (Loader::includeModule('crm'))
		{
			$result[] = PermissionDictionary::CATALOG_RESERVE_DEAL;
		}

		// TODO: now - not used, maybe in future.
		//$result[] = PermissionDictionary::CATALOG_STORE_RESERVE;

		return $result;
	}

	private function getCommonCatalogSection(): array
	{
		$result = [
			PermissionDictionary::CATALOG_PRODUCT_READ,
			PermissionDictionary::CATALOG_PRODUCT_PURCHASING_PRICE_VIEW,
			PermissionDictionary::CATALOG_PRODUCT_ADD,
			PermissionDictionary::CATALOG_PRODUCT_EDIT,
			PermissionDictionary::CATALOG_PRODUCT_DELETE,
			PermissionDictionary::CATALOG_PRODUCT_EDIT_CATALOG_PRICE,
			PermissionDictionary::CATALOG_PRODUCT_EDIT_ENTITY_PRICE,
			PermissionDictionary::CATALOG_PRODUCT_SET_DISCOUNT,
		];

		if (Loader::includeModule('bitrix24'))
		{
			$result[] = PermissionDictionary::CATALOG_PRODUCT_PUBLIC_VISIBILITY;
		}

		$result[] = PermissionDictionary::CATALOG_IMPORT_EXECUTION;
		$result[] = PermissionDictionary::CATALOG_EXPORT_EXECUTION;

		return $result;
	}

	private function getCommonCatalogSectionForExternalCatalog(): array
	{
		return [
			PermissionDictionary::CATALOG_PRODUCT_PURCHASING_PRICE_VIEW,
			PermissionDictionary::CATALOG_PRODUCT_EDIT_ENTITY_PRICE,
			PermissionDictionary::CATALOG_PRODUCT_SET_DISCOUNT,
		];
	}

	private function getCatalogSettingsSection(): array
	{
		$result = [
			PermissionDictionary::CATALOG_SETTINGS_PRODUCT_CARD_EDIT,
			PermissionDictionary::CATALOG_SETTINGS_PRODUCT_CARD_SET_PROFILE_FOR_USERS,
			PermissionDictionary::CATALOG_VAT_MODIFY,
			PermissionDictionary::CATALOG_MEASURE_MODIFY,
			PermissionDictionary::CATALOG_PRICE_GROUP_MODIFY,
			PermissionDictionary::CATALOG_PRODUCT_PRICE_EXTRA_EDIT,
		];

		$onlyBox = !ModuleManager::isModuleInstalled('bitrix24');
		if ($onlyBox)
		{
			array_push($result, ...[
				PermissionDictionary::CATALOG_IMPORT_EDIT,
				PermissionDictionary::CATALOG_EXPORT_EDIT,
			]);
		}

		return $result;
	}

	private function getCatalogSettingsSectionForExternalCatalog(): array
	{
		return [
			PermissionDictionary::CATALOG_SETTINGS_PRODUCT_CARD_EDIT,
			PermissionDictionary::CATALOG_SETTINGS_PRODUCT_CARD_SET_PROFILE_FOR_USERS,
		];
	}

	private function getStoreDocumentSectionCodesMap(): array
	{
		return [
			self::SECTION_STORE_DOCUMENT_ARRIVAL => StoreDocumentTable::TYPE_ARRIVAL,
			self::SECTION_STORE_DOCUMENT_STORE_ADJUSTMENT => StoreDocumentTable::TYPE_STORE_ADJUSTMENT,
			self::SECTION_STORE_DOCUMENT_MOVING => StoreDocumentTable::TYPE_MOVING,
			self::SECTION_STORE_DOCUMENT_DEDUCT => StoreDocumentTable::TYPE_DEDUCT,
			self::SECTION_STORE_DOCUMENT_SALES_ORDER => StoreDocumentTable::TYPE_SALES_ORDERS,
		];
	}

	/**
	 * Permissions for document section.
	 *
	 * @param string $typeId
	 *
	 * @return array
	 */
	private function getStoreDocumentsSectionPermissions(string $typeId): array
	{
		if (Manager::isOnecMode())
		{
			$permissions = [
				PermissionDictionary::CATALOG_STORE_DOCUMENT_VIEW,
				PermissionDictionary::CATALOG_STORE_DOCUMENT_MODIFY,
				PermissionDictionary::CATALOG_STORE_DOCUMENT_CONDUCT,
				PermissionDictionary::CATALOG_STORE_DOCUMENT_DELETE,
			];
		}
		else
		{
			$permissions = [
				PermissionDictionary::CATALOG_STORE_DOCUMENT_VIEW,
				PermissionDictionary::CATALOG_STORE_DOCUMENT_MODIFY,
				PermissionDictionary::CATALOG_STORE_DOCUMENT_CONDUCT,
				PermissionDictionary::CATALOG_STORE_DOCUMENT_CANCEL,
				PermissionDictionary::CATALOG_STORE_DOCUMENT_DELETE,
			];
		}

		$typesWithNag = [
			StoreDocumentTable::TYPE_DEDUCT,
			StoreDocumentTable::TYPE_MOVING,
			//StoreDocumentTable::TYPE_SALES_ORDERS,
		];
		if (in_array($typeId, $typesWithNag, true) && !State::isProductBatchMethodSelected())
		{
			$permissions[] = PermissionDictionary::CATALOG_STORE_DOCUMENT_ALLOW_NEGATION_PRODUCT_QUANTITY;
		}

		$result = [];
		foreach ($permissions as $permission)
		{
			$result[] = "{$permission}_{$typeId}";
		}

		return $result;
	}

	/**
	 * All roles members.
	 *
	 * @return array
	 */
	private function getRoleMembersMap(): array
	{
		return (new RoleMembersInfo)->getMemberInfos();
	}

	/**
	 * All roles access rights.
	 *
	 * @return array in format `[roleId => [ [id => ..., value => ...], [id => ..., value => ...], ... ]]`
	 */
	private function getRoleAccessRightsMap(): array
	{
		$result = [];

		$rows = PermissionTable::getList([
			'select' => [
				'ROLE_ID',
				'PERMISSION_ID',
				'VALUE',
			],
		]);
		foreach ($rows as $row)
		{
			$roleId = $row['ROLE_ID'];

			$result[$roleId][] = [
				'id' => $row['PERMISSION_ID'],
				'value' => $row['VALUE']
			];
		}

		return $result;
	}

	/**
	 * Get permissions only for inventory management.
	 *
	 * @return array
	 */
	public function getInventoryManagementPermissions(): array
	{
		$result = [];

		$sections = $this->getSections(false);
		$sectionsWithInventoryManagment = $this->getSections(true);

		foreach ($sectionsWithInventoryManagment as $code => $permissions)
		{
			$generalPermissions = $sections[$code] ?? null;
			if (!isset($generalPermissions))
			{
				array_push($result, ... $permissions);
				continue;
			}


			foreach ($permissions as $permissionId)
			{
				if (!in_array($permissionId, $generalPermissions, true))
				{
					$result[] = $permissionId;
				}
			}
		}

		return $result;
	}
}

Youez - 2016 - github.com/yon3zu
LinuXploit