• Модуль: crm
  • Путь к файлу: ~/bitrix/modules/crm/lib/requisite/entitylink.php
  • Класс: Bitrix\Crm\Requisite\EntityLink
  • Вызов: EntityLink::determineRequisiteLinkBeforeSave
static function determineRequisiteLinkBeforeSave($entityTypeId, $entityId, $operation, &$entityFields,
	$modifyFields = true, $requisiteId = null, $bankDetailId = null, $mcRequisiteId = null, $mcBankDetailId = null)
{
	$modifyFields = (bool)$modifyFields;
	$resultLink = [
		'CLIENT_ENTITY_TYPE_ID' => \CCrmOwnerType::Undefined,
		'CLIENT_ENTITY_ID' => 0,
		'REQUISITE_ID' => 0,
		'BANK_DETAIL_ID' => 0,
		'SELLER_ENTITY_TYPE_ID' => \CCrmOwnerType::Undefined,
		'SELLER_ENTITY_ID' => 0,
		'MC_REQUISITE_ID' => 0,
		'MC_BANK_DETAIL_ID' => 0
	];

	$availableEntityIds = static::getAvailableEntityTypeIds();
	if (!isset($availableEntityIds[$entityTypeId]))
	{
		return $resultLink;
	}

	$skipSeller = ($entityTypeId === \CCrmOwnerType::Deal/* || $entityTypeId === \CCrmOwnerType::Order*/);

	$entityId = (int)$entityId;

	$operation = (int)$operation;
	if ($operation !== self::ENTITY_OPERATION_ADD && $operation !== self::ENTITY_OPERATION_UPDATE)
	{
		return $resultLink;
	}

	$params = self::prepareClientSellerParamsByEntityFields($entityTypeId, $entityFields);
	$clientEntityTypeId = $params['CLIENT_ENTITY_TYPE_ID'] === null ? null : (int)$params['CLIENT_ENTITY_TYPE_ID'];
	$clientEntityId = $params['CLIENT_ENTITY_ID'] === null ? null : (int)$params['CLIENT_ENTITY_ID'];
	$requisiteId = $requisiteId === null ? null : (int)$requisiteId;
	$bankDetailId = $bankDetailId === null ? null : (int)$bankDetailId;
	$sellerEntityTypeId = $params['SELLER_ENTITY_TYPE_ID'] === null ? null : (int)$params['SELLER_ENTITY_TYPE_ID'];
	$sellerEntityId = $params['SELLER_ENTITY_ID'] === null ? null : (int)$params['SELLER_ENTITY_ID'];
	$mcRequisiteId = $mcRequisiteId === null ? null : (int)$mcRequisiteId;
	$mcBankDetailId = $mcBankDetailId === null ? null : (int)$mcBankDetailId;
	unset($params);

	$resetClientRequisite = false;
	$resetClientBankDetail = false;
	$resetSellerRequisite = false;
	$resetSellerBankDetail = false;

	$parentEntityMap = self::prepareParrentEntityMap($entityTypeId, $entityFields);

	$currentLink = $resultLink;
	$entityExists = ($operation === self::ENTITY_OPERATION_UPDATE && $entityId > 0);
	if ($entityExists)
	{
		try
		{
			$csInfo = self::getEntityClientSellerInfo($entityTypeId, $entityId, ['GET_PARENT_ENTITY_FILEDS' => true]);
		}
		catch (Main\SystemException $e)
		{
			switch ($e->getCode())
			{
				case self::ERR_ENTITY_NOT_FOUND:
					$entityExists = false;
					break;
			}
		}

		if (!$entityExists)
		{
			return $resultLink;
		}

		$currentParrentEntityMap = self::prepareParrentEntityMap($entityTypeId, $csInfo);
		foreach (array_keys($parentEntityMap) as $parentEntityTypeId)
		{
			$currentParrentEntityMap[$parentEntityTypeId] = $parentEntityMap[$parentEntityTypeId];
		}
		$parentEntityMap = $currentParrentEntityMap;
		unset($currentParrentEntityMap, $parentEntityTypeId);

		$currentLink['CLIENT_ENTITY_TYPE_ID'] = (int)$csInfo['CLIENT_ENTITY_TYPE_ID'];
		$currentLink['CLIENT_ENTITY_ID'] = (int)$csInfo['CLIENT_ENTITY_ID'];
		$currentLink['SELLER_ENTITY_TYPE_ID'] = $csInfo['MYCOMPANY_ID'] > 0 ?
			\CCrmOwnerType::Company : \CCrmOwnerType::Undefined;
		$currentLink['SELLER_ENTITY_ID'] = (int)$csInfo['MYCOMPANY_ID'];

		$isClientDefined = ($currentLink['CLIENT_ENTITY_TYPE_ID'] !== \CCrmOwnerType::Undefined
			&& $currentLink['CLIENT_ENTITY_ID'] > 0);
		$isSellerDefined = ($currentLink['SELLER_ENTITY_TYPE_ID'] === \CCrmOwnerType::Company
			&& $currentLink['SELLER_ENTITY_ID'] > 0);

		if ($isClientDefined || $isSellerDefined)
		{
			if ($row = self::getList(
				array(
					'filter' => array(
						'=ENTITY_TYPE_ID' => $entityTypeId,
						'=ENTITY_ID' => $entityId
					),
					'select' => array('REQUISITE_ID', 'BANK_DETAIL_ID', 'MC_REQUISITE_ID', 'MC_BANK_DETAIL_ID'),
					'limit' => 1
				)
			)->fetch())
			{
				if ($isClientDefined && isset($row['REQUISITE_ID']) && $row['REQUISITE_ID'] > 0)
				{
					$currentLink['REQUISITE_ID'] = (int)$row['REQUISITE_ID'];

					if (isset($row['BANK_DETAIL_ID']) && $row['BANK_DETAIL_ID'] > 0)
					{
						$currentLink['BANK_DETAIL_ID'] = (int)$row['BANK_DETAIL_ID'];
					}
				}
				if ($isSellerDefined && isset($row['MC_REQUISITE_ID']) && $row['MC_REQUISITE_ID'] > 0)
				{
					$currentLink['MC_REQUISITE_ID'] = (int)$row['MC_REQUISITE_ID'];

					if (isset($row['MC_BANK_DETAIL_ID']) && $row['MC_BANK_DETAIL_ID'] > 0)
					{
						$currentLink['MC_BANK_DETAIL_ID'] = (int)$row['MC_BANK_DETAIL_ID'];
					}
				}
			}
			unset($row);
		}
		unset($isClientDefined, $isSellerDefined);

		$resultLink = $currentLink;
	}

	$parentEntityList = [];
	foreach ($parentEntityMap as $parentEntityTypeId => $parentEntityId)
	{
		$parentEntityList[] = [
			'ENTITY_TYPE_ID' => $parentEntityTypeId,
			'ENTITY_ID' => $parentEntityId
		];
	}
	unset($parentEntityMap, $parentEntityTypeId, $parentEntityId);

	if (($clientEntityTypeId === \CCrmOwnerType::Company || $clientEntityTypeId === \CCrmOwnerType::Contact)
		&& $clientEntityId !== null && $clientEntityId >= 0)
	{
		$resultLink['CLIENT_ENTITY_TYPE_ID'] = $clientEntityTypeId;
		$resultLink['CLIENT_ENTITY_ID'] = $clientEntityId;

		if ($clientEntityTypeId !== $currentLink['CLIENT_ENTITY_TYPE_ID']
			|| $clientEntityId !== $currentLink['CLIENT_ENTITY_ID'])
		{
			$resultLink['REQUISITE_ID'] = 0;
			$resultLink['BANK_DETAIL_ID'] = 0;
		}
	}

	if ($resultLink['CLIENT_ENTITY_TYPE_ID'] === \CCrmOwnerType::Company && $resultLink['CLIENT_ENTITY_ID'] > 0)
	{
		if (self::isMyCompany($resultLink['CLIENT_ENTITY_ID']))
		{
			$resultLink['CLIENT_ENTITY_TYPE_ID'] = \CCrmOwnerType::Undefined;
			$resultLink['CLIENT_ENTITY_ID'] = 0;
			$resultLink['REQUISITE_ID'] = 0;
			$resultLink['BANK_DETAIL_ID'] = 0;
			$resetClientRequisite = true;
			$resetClientBankDetail = true;
		}
	}

	if ($skipSeller)
	{
		$resultLink['SELLER_ENTITY_TYPE_ID'] = \CCrmOwnerType::Undefined;
		$resultLink['SELLER_ENTITY_ID'] = 0;
		$resultLink['MC_REQUISITE_ID'] = 0;
		$resultLink['MC_BANK_DETAIL_ID'] = 0;
	}
	else
	{
		if ($sellerEntityTypeId === \CCrmOwnerType::Company && $sellerEntityId !== null && $sellerEntityId >= 0)
		{
			$resultLink['SELLER_ENTITY_TYPE_ID'] = $sellerEntityTypeId;
			$resultLink['SELLER_ENTITY_ID'] = $sellerEntityId;

			if ($sellerEntityTypeId !== $currentLink['SELLER_ENTITY_TYPE_ID']
				|| $sellerEntityId !== $currentLink['SELLER_ENTITY_ID'])
			{
				$resultLink['MC_REQUISITE_ID'] = 0;
				$resultLink['MC_BANK_DETAIL_ID'] = 0;
			}
		}
	}

	if ($resultLink['SELLER_ENTITY_TYPE_ID'] === \CCrmOwnerType::Company && $resultLink['SELLER_ENTITY_ID'] > 0)
	{
		if (!self::isMyCompany($resultLink['SELLER_ENTITY_ID']))
		{
			$resultLink['SELLER_ENTITY_TYPE_ID'] = \CCrmOwnerType::Undefined;
			$resultLink['SELLER_ENTITY_ID'] = 0;
			$resultLink['MC_REQUISITE_ID'] = 0;
			$resultLink['MC_BANK_DETAIL_ID'] = 0;
			$resetSellerRequisite = true;
			$resetSellerBankDetail = true;
		}
	}

	$defaultMyCompanyId = null;

	$needBankDetailId = true;
	if ($resetClientRequisite || $requisiteId === null)
	{
		if ($resultLink['REQUISITE_ID'] <= 0)
		{
			$link = self::getDefaultEntityRequisiteLink(
				$parentEntityList,
				$resultLink['CLIENT_ENTITY_TYPE_ID'],
				$resultLink['CLIENT_ENTITY_ID']
			);
			$resultLink['REQUISITE_ID'] = $link['REQUISITE_ID'];
			if ($resetClientBankDetail || $bankDetailId === null)
			{
				$resultLink['BANK_DETAIL_ID'] = $link['BANK_DETAIL_ID'];
				$needBankDetailId = false;
			}
		}
	}
	else
	{
		$resultLink['REQUISITE_ID'] = $requisiteId;
	}
	if ($resetClientBankDetail || $bankDetailId === null)
	{
		if ($needBankDetailId && $resultLink['REQUISITE_ID'] > 0 && $resultLink['BANK_DETAIL_ID'] <= 0)
		{
			$link = self::getDefaultEntityRequisiteLink(
				$parentEntityList,
				$resultLink['CLIENT_ENTITY_TYPE_ID'],
				$resultLink['CLIENT_ENTITY_ID'],
				$resultLink['REQUISITE_ID']
			);
			$resultLink['REQUISITE_ID'] = $link['REQUISITE_ID'];
			$resultLink['BANK_DETAIL_ID'] = $link['BANK_DETAIL_ID'];
		}
	}
	else
	{
		$resultLink['BANK_DETAIL_ID'] = $bankDetailId;
	}
	if (!$skipSeller)
	{

		if (($resultLink['SELLER_ENTITY_TYPE_ID'] !== \CCrmOwnerType::Company
				|| $resultLink['SELLER_ENTITY_ID'] <= 0)
			&& $sellerEntityId !== 0)
		{
			if ($defaultMyCompanyId === null)
			{
				$defaultMyCompanyId = self::getDefaultMyCompanyId();
			}
			if ($defaultMyCompanyId > 0)
			{
				$resultLink['SELLER_ENTITY_TYPE_ID'] = \CCrmOwnerType::Company;
				$resultLink['SELLER_ENTITY_ID'] = $defaultMyCompanyId;
				$resultLink['MC_REQUISITE_ID'] = 0;
				$resultLink['MC_BANK_DETAIL_ID'] = 0;
				$resetSellerRequisite = true;
				$resetSellerBankDetail = true;
			}
			else
			{
				$resultLink['SELLER_ENTITY_TYPE_ID'] = \CCrmOwnerType::Undefined;
				$resultLink['SELLER_ENTITY_ID'] = 0;
				$resultLink['MC_REQUISITE_ID'] = 0;
				$resultLink['MC_BANK_DETAIL_ID'] = 0;
			}
		}

		$needBankDetailId = true;
		if ($resetSellerRequisite || $mcRequisiteId === null)
		{
			if ($resultLink['MC_REQUISITE_ID'] <= 0)
			{
				$link = self::getDefaultEntityRequisiteLink(
					$parentEntityList,
					$resultLink['SELLER_ENTITY_TYPE_ID'],
					$resultLink['SELLER_ENTITY_ID'],
					0,
					true
				);
				$resultLink['MC_REQUISITE_ID'] = $link['REQUISITE_ID'];
				if ($resetSellerBankDetail || $mcBankDetailId === null)
				{
					$resultLink['MC_BANK_DETAIL_ID'] = $link['BANK_DETAIL_ID'];
					$needBankDetailId = false;
				}
			}
		}
		else
		{
			$resultLink['MC_REQUISITE_ID'] = $mcRequisiteId;
		}
		if ($resetSellerBankDetail || $mcBankDetailId === null)
		{
			if ($needBankDetailId && $resultLink['MC_REQUISITE_ID'] > 0 && $resultLink['MC_BANK_DETAIL_ID'] <= 0)
			{
				$link = self::getDefaultEntityRequisiteLink(
					$parentEntityList,
					$resultLink['SELLER_ENTITY_TYPE_ID'],
					$resultLink['SELLER_ENTITY_ID'],
					$resultLink['MC_REQUISITE_ID'],
					true
				);
				$resultLink['MC_REQUISITE_ID'] = $link['REQUISITE_ID'];
				$resultLink['MC_BANK_DETAIL_ID'] = $link['BANK_DETAIL_ID'];
			}
		}
		else
		{
			$resultLink['MC_BANK_DETAIL_ID'] = $mcBankDetailId;
		}
	}

	$continueCheck = true;
	while ($continueCheck)
	{
		$continueCheck = false;
		try
		{
			self::checkConsistence(
				$entityTypeId, $entityId,
				$resultLink['REQUISITE_ID'], $resultLink['BANK_DETAIL_ID'],
				$resultLink['MC_REQUISITE_ID'], $resultLink['MC_BANK_DETAIL_ID'],
				[
					'ENTITY_CHECK' => $entityExists,
					'IS_MY_COMPANY_CHECK' => false,
					'CLIENT_SELLER_INFO' => [
						'CLIENT_ENTITY_TYPE_ID' => $resultLink['CLIENT_ENTITY_TYPE_ID'],
						'CLIENT_ENTITY_ID' => $resultLink['CLIENT_ENTITY_ID'],
						'MYCOMPANY_ID' => $resultLink['SELLER_ENTITY_ID']
					]
				]
			);
		}
		catch (Main\SystemException $e)
		{
			$continueCheck = true;
			switch ($e->getCode())
			{
				case self::ERR_ENTITY_NOT_FOUND:
				case self::ERR_INVALID_ENTITY_TYPE:
				case self::ERR_INVALID_ENTITY_ID:
					$resultLink['CLIENT_ENTITY_TYPE_ID'] = \CCrmOwnerType::Undefined;
					$resultLink['CLIENT_ENTITY_ID'] = 0;
					$resultLink['REQUISITE_ID'] = 0;
					$resultLink['BANK_DETAIL_ID'] = 0;
					$resultLink['SELLER_ENTITY_TYPE_ID'] = \CCrmOwnerType::Undefined;
					$resultLink['SELLER_ENTITY_ID'] = 0;
					$resultLink['MC_REQUISITE_ID'] = 0;
					$resultLink['MC_BANK_DETAIL_ID'] = 0;
					$continueCheck = false;
					break;
				case self::ERR_REQUISITE_TIED_TO_ENTITY_WITHOUT_CLIENT:
					$resultLink['CLIENT_ENTITY_TYPE_ID'] = \CCrmOwnerType::Undefined;
					$resultLink['CLIENT_ENTITY_ID'] = 0;
					$resultLink['REQUISITE_ID'] = 0;
					$resultLink['BANK_DETAIL_ID'] = 0;
					break;
				case self::ERR_INVALID_REQUSIITE_ID:
				case self::ERR_REQUISITE_NOT_FOUND:
				case self::ERR_REQUISITE_NOT_ASSIGNED:
					$link = self::getDefaultEntityRequisiteLink(
						$parentEntityList,
						$resultLink['CLIENT_ENTITY_TYPE_ID'],
						$resultLink['CLIENT_ENTITY_ID']
					);
					$resultLink['REQUISITE_ID'] = $link['REQUISITE_ID'];
					$resultLink['BANK_DETAIL_ID'] = $link['BANK_DETAIL_ID'];
					unset($link);
					break;
				case self::ERR_INVALID_BANK_DETAIL_ID:
				case self::ERR_BANK_DETAIL_NOT_ASSIGNED_WO_REQUISITE:
				case self::ERR_BANK_DETAIL_NOT_FOUND:
				case self::ERR_BANK_DETAIL_NOT_ASSIGNED:
					if ($requisiteId === 0)
					{
						$resultLink['BANK_DETAIL_ID'] = 0;
					}
					else
					{
						$link = self::getDefaultEntityRequisiteLink(
							$parentEntityList,
							$resultLink['CLIENT_ENTITY_TYPE_ID'],
							$resultLink['CLIENT_ENTITY_ID'],
							$resultLink['REQUISITE_ID']
						);
						$resultLink['REQUISITE_ID'] = $link['REQUISITE_ID'];
						$resultLink['BANK_DETAIL_ID'] = $link['BANK_DETAIL_ID'];
					}
					break;
				case self::ERR_MC_REQUISITE_TIED_TO_ENTITY_WITHOUT_MYCOMPANY:
					if ($defaultMyCompanyId === null)
					{
						$defaultMyCompanyId = self::getDefaultMyCompanyId();
					}
					if ($defaultMyCompanyId > 0)
					{
						$resultLink['SELLER_ENTITY_TYPE_ID'] = \CCrmOwnerType::Company;
						$resultLink['SELLER_ENTITY_ID'] = $defaultMyCompanyId;

						if ($resultLink['SELLER_ENTITY_TYPE_ID'] !== $currentLink['SELLER_ENTITY_TYPE_ID']
							|| $resultLink['SELLER_ENTITY_ID'] !== $currentLink['SELLER_ENTITY_ID'])
						{
							$resultLink['MC_REQUISITE_ID'] = 0;
							$resultLink['MC_BANK_DETAIL_ID'] = 0;
						}
					}
					else
					{
						$resultLink['SELLER_ENTITY_TYPE_ID'] = \CCrmOwnerType::Undefined;
						$resultLink['SELLER_ENTITY_ID'] = 0;
						$resultLink['MC_REQUISITE_ID'] = 0;
						$resultLink['MC_BANK_DETAIL_ID'] = 0;
					}
					unset($defaultMyCompanyId);
					break;
				case self::ERR_INVALID_MC_REQUSIITE_ID:
				case self::ERR_MC_REQUISITE_NOT_FOUND:
				case self::ERR_MC_REQUISITE_NOT_ASSIGNED:
					$link = self::getDefaultEntityRequisiteLink(
						$parentEntityList,
						$resultLink['SELLER_ENTITY_TYPE_ID'],
						$resultLink['SELLER_ENTITY_ID'],
						0,
						true
					);
					$resultLink['MC_REQUISITE_ID'] = $link['REQUISITE_ID'];
					$resultLink['MC_BANK_DETAIL_ID'] = $link['BANK_DETAIL_ID'];
					unset($link);
					break;
				case self::ERR_INVALID_MC_BANK_DETAIL_ID:
				case self::ERR_MC_BANK_DETAIL_NOT_ASSIGNED_WO_MC_REQUISITE:
				case self::ERR_MC_BANK_DETAIL_NOT_FOUND:
				case self::ERR_MC_BANK_DETAIL_NOT_ASSIGNED:
					if ($mcRequisiteId === 0)
					{
						$resultLink['MC_BANK_DETAIL_ID'] = 0;
					}
					else
					{
						$link = self::getDefaultEntityRequisiteLink(
							$parentEntityList,
							$resultLink['SELLER_ENTITY_TYPE_ID'],
							$resultLink['SELLER_ENTITY_ID'],
							$resultLink['MC_REQUISITE_ID'],
							true
						);
						$resultLink['MC_REQUISITE_ID'] = $link['REQUISITE_ID'];
						$resultLink['MC_BANK_DETAIL_ID'] = $link['BANK_DETAIL_ID'];
						unset($link);
					}
					break;
				default:
					throw $e;
			}
		}
	}

	if ($modifyFields && is_array($entityFields))
	{
		switch ($entityTypeId)
		{
			case \CCrmOwnerType::Quote:
				$entityFields['MYCOMPANY_ID'] = $resultLink['SELLER_ENTITY_ID'];
				break;
			case \CCrmOwnerType::Invoice:
				$entityFields['UF_MYCOMPANY_ID'] = $resultLink['SELLER_ENTITY_ID'];
				break;
		}
	}

	return $resultLink;
}