• Модуль: crm
  • Путь к файлу: ~/bitrix/modules/crm/lib/conversion/leadconversionmapper.php
  • Класс: Bitrix\Crm\Conversion\LeadConversionMapper
  • Вызов: LeadConversionMapper::map
public function map(EntityConversionMap $map, array $options = null)
{
	$srcFields = $this->getSourceFields();
	if(empty($srcFields))
	{
		return array();
	}

	if(!is_array($options))
	{
		$options = array();
	}

	$multiFieldKeys = array('PHONE' => true, 'EMAIL' => true, 'WEB' => true, 'IM' => true, 'LINK' => true);

	$dstFields = array();
	$dstEntityTypeID = $map->getDestinationEntityTypeID();
	foreach($map->getItems() as $item)
	{
		$dstFieldID = $item->getDestinationField();

		//Skip empty binding
		if($dstFieldID === '-')
		{
			continue;
		}

		$srcFieldID = $item->getSourceField();
		if((!isset($srcFields[$srcFieldID]) || $srcFields[$srcFieldID] === '')
			&& !isset($multiFieldKeys[$srcFieldID]) && $srcFieldID !== 'PRODUCT_ROWS')
		{
			$altSrcFieldID = '';
			foreach($item->getAlternativeSourceFields() as $fieldID)
			{
				if(isset($srcFields[$fieldID]))
				{
					$altSrcFieldID = $fieldID;
					break;
				}
			}

			if($altSrcFieldID !== '')
			{
				$srcFieldID = $altSrcFieldID;
			}
		}

		if($dstFieldID === '')
		{
			$dstFieldID = $srcFieldID;
		}

		if(mb_strpos($srcFieldID, 'UF_') === 0 && mb_strpos($dstFieldID, 'UF_') === 0)
		{
			self::mapUserField(\CCrmOwnerType::Lead, $srcFieldID, $srcFields, $dstEntityTypeID, $dstFieldID, $dstFields, $options);
		}
		elseif(isset($multiFieldKeys[$srcFieldID]))
		{
			$multifields = $this->getSourceMultiFields();
			if(isset($multifields[$dstFieldID]))
			{
				if(!isset($dstFields['FM']))
				{
					$dstFields['FM'] = array();
				}
				$dstFields['FM'][$dstFieldID] = $multifields[$dstFieldID];
			}
		}
		elseif($srcFieldID === 'PRODUCT_ROWS')
		{
			if($dstEntityTypeID === \CCrmOwnerType::Deal)
			{
				$productRows = \CCrmLead::LoadProductRows($this->srcEntityID);
				if(count($productRows) > 0)
				{
					$entityProductRows = array();
					$entityDbResult = \CCrmDeal::GetListEx(
						array(),
						array('=LEAD_ID' => $this->srcEntityID, 'CHECK_PERMISSIONS' => 'N'),
						false,
						false,
						array('ID')
					);
					while($entityFields = $entityDbResult->Fetch())
					{
						$entityProductRows[] = \CCrmDeal::LoadProductRows((int)$entityFields['ID']);
					}
					$dstFields[$dstFieldID] = \CCrmProductRow::GetDiff(array($productRows), $entityProductRows);
				}
			}
		}
		elseif(isset($srcFields[$srcFieldID]))
		{
			$dstFields[$dstFieldID] = $srcFields[$srcFieldID];
		}
	}

	$initData = isset($options['INIT_DATA']) && is_array($options['INIT_DATA'])
		? $options['INIT_DATA'] : array();

	//region Setup fields by default
	if($dstEntityTypeID === \CCrmOwnerType::Contact)
	{
		$name = isset($dstFields['NAME']) ? $dstFields['NAME'] : '';
		$secondName = isset($dstFields['SECOND_NAME']) ? $dstFields['SECOND_NAME'] : '';
		$lastName = isset($dstFields['LAST_NAME']) ? $dstFields['LAST_NAME'] : '';

		if($name === '' && $secondName === '' && $lastName === '' && isset($initData['defaultName']))
		{
			$dstFields['NAME'] = $initData['defaultName'];
		}
	}
	//endregion

	if(!empty($dstFields))
	{
		$dstFields['LEAD_ID'] = $this->srcEntityID;

		if($dstEntityTypeID === \CCrmOwnerType::Deal)
		{
			if(isset($dstFields['PRODUCT_ROWS'])
				&& is_array($dstFields['PRODUCT_ROWS'])
				&& !empty($dstFields['PRODUCT_ROWS']))
			{
				$totalInfo = \CCrmProductRow::CalculateTotalInfo('D', 0, false, $dstFields, $dstFields['PRODUCT_ROWS']);
				$dstFields['OPPORTUNITY'] = isset($totalInfo['OPPORTUNITY']) ? $totalInfo['OPPORTUNITY'] : 1.0;
				$dstFields['TAX_VALUE'] = isset($totalInfo['TAX_VALUE']) ? $totalInfo['TAX_VALUE'] : 0.0;
			}

			$dealTypeList = \CCrmStatus::GetStatusList('DEAL_TYPE');
			if(!empty($dealTypeList))
			{
				$dstFields['TYPE_ID'] = current(array_keys($dealTypeList));
			}

			if(isset($initData['categoryId']) && $initData['categoryId'] > 0)
			{
				$dstFields['CATEGORY_ID'] = (int)$initData['categoryId'];
			}
		}

		if(!(isset($options['DISABLE_USER_FIELD_INIT']) && $options['DISABLE_USER_FIELD_INIT'] === true))
		{
			self::initializeUserFields($dstEntityTypeID, $dstFields);
		}
	}

	return $dstFields;
}