• Модуль: sale
  • Путь к файлу: ~/bitrix/modules/sale/lib/businessvalue_old.php
  • Класс: BitrixSaleBusinessValueOld
  • Вызов: BusinessValueOld::install
static function install($parentName, $translationSource, array $data)
{
	$error = false;

	// load person types

	$persons = array(/* ID => NAME (LID) */);

	$result = PersonTypeTable::getList(array('select'  => array('ID')));

	while ($row = $result->fetch())
		$persons[$row['ID']] = true;

	// load person domains

	$personsDomains = array();
	$result = BusinessValuePersonDomainTable::getList(array('select' => array('PERSON_TYPE_ID', 'DOMAIN')));
	while ($row = $result->fetch())
		$personsDomains[$row['PERSON_TYPE_ID']] = $row['DOMAIN'];

	// install person domains

	if (is_array($data['PERSON_DOMAIN']))
	{
		foreach ($data['PERSON_DOMAIN'] as $personId => $domain)
		{
			if (! $persons[$personId])
				throw new SystemException("invalid person type `$personId`", 0, __FILE__, __LINE__);

			switch ($domain)
			{
				case self::COMMON_DOMAIN:
				case self::INDIVIDUAL_DOMAIN:
				case self::ENTITY_DOMAIN: break;
				default: throw new SystemException("invalid domain: $domain", 0, __FILE__, __LINE__);
			}

			if (! $personsDomains[$personId])
			{
				if (BusinessValuePersonDomainTable::add(array('PERSON_TYPE_ID' => $personId, 'DOMAIN' => $domain))->isSuccess())
				{
					$personsDomains[$personId] = $domain;
				}
				else
				{
					$error = true;
				}
			}
		}
	}

	$personsDomainsWithCommon = array(self::COMMON_PERSON_ID => self::COMMON_DOMAIN) + $personsDomains;

	// load groups

	$groups = array();
	$result = BusinessValueGroupTable::getList(array('select' => array('NAME', 'ID')));
	while ($row = $result->fetch())
		$groups[$row['NAME']] = $row['ID'];

	// install new groups

	if (is_array($data['GROUPS']))
	{
		foreach ($data['GROUPS'] as $groupName => $group)
		{
			if (! $groups[$groupName])
			{
				if (! is_string($groupName))
					throw new SystemException("invalid group name", 0, __FILE__, __LINE__);

				if (! is_array($group))
					throw new SystemException("invalid group", 0, __FILE__, __LINE__);

				$result = BusinessValueGroupTable::add(array(
					'NAME' => $groupName,
					'SORT' => $group['SORT']
				));

				if ($result->isSuccess())
					$groups[$groupName] = $result->getId();
				else
					$error = true;
			}
		}
	}

	// install codes

	if (is_array($data['CODES']))
	{
		// get parent id, install parent if not exists

		if ($row = BusinessValueParentTable::getList(array('select' => array('ID'), 'filter' => array('=NAME' => $parentName)))->fetch())
		{
			$parentId = $row['ID'];
		}
		else
		{
			$result = BusinessValueParentTable::add(array('NAME' => $parentName, 'LANG_SRC' => $translationSource));

			if ($result->isSuccess())
				$parentId = $result->getId();
			else
				return false;
		}

		// load codes

		$codes = array();
		$result = BusinessValueCodeTable::getList(array('select' => array('ID', 'NAME')));
		while ($row = $result->fetch())
			$codes[$row['NAME']] = $row['ID'];

		// load value maps

		$valueMaps = array();
		$result = BusinessValueTable::getList(array('select' => array('CODE_ID', 'PERSON_TYPE_ID')));
		while ($row = $result->fetch())
			$valueMaps[$row['CODE_ID']][$row['PERSON_TYPE_ID']] = true;

		// load parent codes

		$parentCodes = array();
		$result = BusinessValueCodeParentTable::getList(array('select' => array('CODE_ID'), 'filter' => array('=PARENT_ID' => $parentId)));
		while ($row = $result->fetch())
			$parentCodes[$row['CODE_ID']] = true;

		// install: groups, codes, parent codes

		foreach ($data['CODES'] as $codeName => $code)
		{
			if (! is_string($codeName))
				throw new SystemException("invalid code name", 0, __FILE__, __LINE__);

			if (! is_array($code))
				throw new SystemException("invalid code", 0, __FILE__, __LINE__);

			// get group id, install group if not exists

			$groupId = null;

			if (($groupName = $code['GROUP']) && ! ($groupId = $groups[$groupName]))
			{
				$result = BusinessValueGroupTable::add(array('NAME' => $groupName));

				if ($result->isSuccess())
					$groups[$groupName] = $groupId = $result->getId();
				else
					$error = true;
			}

			// get code domain

			switch ($domain = $code['DOMAIN'])
			{
				case self::COMMON_DOMAIN:
				case self::INDIVIDUAL_DOMAIN:
				case self::ENTITY_DOMAIN: break;
				default: throw new SystemException("invalid domain: $domain", 0, __FILE__, __LINE__);
			}

			// get code id, install code if not exists

			if (! $codeId = $codes[$codeName])
			{
				$result = BusinessValueCodeTable::add(array(
					'NAME'     => $codeName,
					'DOMAIN'   => $domain,
					'GROUP_ID' => $groupId,
					'SORT'     => $code['SORT'],
				));

				if ($result->isSuccess())
				{
					$codeId = $result->getId();
					$codes[$codeName] = $codeId;
				}
				else
				{
					$error = true;
					continue;
				}
			}

			// install value maps if not exist

			if (is_array($code['MAP']))
			{
				foreach ($code['MAP'] as $personId => $map)
				{
					if (! is_array($map) || count($map) != 2)
						throw new SystemException("invalid map: ".print_r($map, true), 0, __FILE__, __LINE__);

					if ($domain === self::COMMON_DOMAIN)
					{
						if (! $personsDomainsWithCommon[$personId])
							throw new SystemException("invalid person type id `$personId`", 0, __FILE__, __LINE__);
					}
					else
					{
						if ($domain !== $personsDomains[$personId])
							throw new SystemException("invalid person type id `$personId`", 0, __FILE__, __LINE__);
					}

					if (! isset($valueMaps[$codeId][$personId]))
					{
						if (BusinessValueTable::add(array(
							'PERSON_TYPE_ID' => $personId,
							'CODE_ID'        => $codeId,
							'ENTITY'         => $map[0],
							'ITEM'           => $map[1]
						))->isSuccess())
							$valueMaps[$codeId][$personId] = true;
						else
							$error = true;
					}
				}
			}

			// install code parent if not exists

			if (! $parentCodes[$codeId])
			{
				if (BusinessValueCodeParentTable::add(array('CODE_ID' => $codeId, 'PARENT_ID' => $parentId))->isSuccess())
					$parentCodes[$codeId] = true;
				else
					$error = true;
			}
		}
	}

	return ! $error;
}