LeadConverter::executePhase

  1. Bitrix24 API (v. 23.675.0)
  2. crm
  3. LeadConverter
  4. executePhase
  • Модуль: crm
  • Путь к файлу: ~/bitrix/modules/crm/lib/conversion/leadconverter.php
  • Класс: Bitrix\Crm\Conversion\LeadConverter
  • Вызов: LeadConverter::executePhase
public function executePhase()
{
	if (parent::executePhase())
	{
		return true;
	}

	if($this->currentPhase === LeadConversionPhase::COMPANY_CREATION
		|| $this->currentPhase === LeadConversionPhase::CONTACT_CREATION
		|| $this->currentPhase === LeadConversionPhase::DEAL_CREATION)
	{
		if($this->currentPhase === LeadConversionPhase::COMPANY_CREATION)
		{
			$entityTypeID = \CCrmOwnerType::Company;
		}
		elseif($this->currentPhase === LeadConversionPhase::CONTACT_CREATION)
		{
			$entityTypeID = \CCrmOwnerType::Contact;
		}
		else//if($this->currentPhase === LeadConversionPhase::DEAL_CREATION)
		{
			$entityTypeID = \CCrmOwnerType::Deal;
		}

		$entityTypeName = \CCrmOwnerType::ResolveName($entityTypeID);
		$config = $this->config->getItem($entityTypeID);
		if(!$config || !$config->isActive())
		{
			return false;
		}

		if(!LeadConversionScheme::isTargetTypeSupported($entityTypeID, array('TYPE_ID' => $this->conversionTypeID)))
		{
			return false;
		}

		$entityID = self::getDestinationEntityID($entityTypeName, $this->contextData);

		//Only one company and one contact may be created
		if($entityTypeID === \CCrmOwnerType::Company || $entityTypeID === \CCrmOwnerType::Contact)
		{
			$boundEntityID = $this->getChildEntityID($entityTypeID);
			if($boundEntityID > 0)
			{
				//Entity is already bound
				self::setDestinationEntityID(
					$entityTypeName,
					$boundEntityID,
					$this->resultData,
					array(
						'isNew' => self::isNewDestinationEntity(
							$entityTypeName,
							$boundEntityID,
							$this->contextData
						)
					)
				);
				return true;
			}
		}

		/** @var LeadConversionMapper $mapper */
		$mapper = $this->getMapper();
		/** @var EntityConversionMap $map */
		$map = self::prepareMap($entityTypeID);

		if($entityID > 0)
		{
			$isNewEntity = self::isNewDestinationEntity($entityTypeName, $entityID, $this->contextData);

			if($entityTypeID === \CCrmOwnerType::Company)
			{
				$entity = new \CCrmCompany(false);

				if(isset($this->contextData['ENABLE_MERGE'])
					&& $this->contextData['ENABLE_MERGE'] === true)
				{
					if(!$isNewEntity && !self::checkUpdatePermission($entityTypeName, $entityID))
					{
						throw new EntityConversionException(
							\CCrmOwnerType::Lead,
							$entityTypeID,
							EntityConversionException::TARG_DST,
							EntityConversionException::UPDATE_DENIED
						);
					}

					$fields = self::getEntityFields(\CCrmOwnerType::Company, $entityID);
					if(!is_array($fields))
					{
						throw new EntityConversionException(
							\CCrmOwnerType::Lead,
							\CCrmOwnerType::Company,
							EntityConversionException::TARG_DST,
							EntityConversionException::NOT_FOUND
						);
					}

					$mappedFields = $mapper->map($map, array('DISABLE_USER_FIELD_INIT' => true));
					if(!empty($mappedFields))
					{
						$merger = new CompanyMerger($this->getUserID(), true);
						$merger->mergeFields(
							$mappedFields,
							$fields,
							false,
							array('ENABLE_UPLOAD' => true, 'ENABLE_UPLOAD_CHECK' => false)
						);
						$fields['LEAD_ID'] = $this->entityID;
						if($entity->Update($entityID, $fields, true, true, $this->getUpdateOptions()))
						{
							//region BizProcess
							$arErrors = array();
							\CCrmBizProcHelper::AutoStartWorkflows(
								\CCrmOwnerType::Company,
								$entityID,
								\CCrmBizProcEventType::Edit,
								$arErrors
							);
							//endregion
						}
					}
				}
				elseif(!\CCrmCompany::Exists($entityID))
				{
					throw new EntityConversionException(
						\CCrmOwnerType::Lead,
						\CCrmOwnerType::Company,
						EntityConversionException::TARG_DST,
						EntityConversionException::NOT_FOUND
					);
				}
			}
			elseif($entityTypeID === \CCrmOwnerType::Contact)
			{
				$entity = new \CCrmContact(false);

				if(isset($this->contextData['ENABLE_MERGE'])
					&& $this->contextData['ENABLE_MERGE'] === true)
				{
					if(!$isNewEntity && !self::checkUpdatePermission($entityTypeName, $entityID))
					{
						throw new EntityConversionException(
							\CCrmOwnerType::Lead,
							$entityTypeID,
							EntityConversionException::TARG_DST,
							EntityConversionException::UPDATE_DENIED
						);
					}

					$fields = self::getEntityFields(\CCrmOwnerType::Contact, $entityID);
					if(!is_array($fields))
					{
						throw new EntityConversionException(
							\CCrmOwnerType::Lead,
							\CCrmOwnerType::Contact,
							EntityConversionException::TARG_DST,
							EntityConversionException::NOT_FOUND
						);
					}

					$mappedFields = $mapper->map($map, array('DISABLE_USER_FIELD_INIT' => true));
					if(!empty($mappedFields))
					{
						$merger = new ContactMerger($this->getUserID(), true);
						$merger->mergeFields(
							$mappedFields,
							$fields,
							false,
							array('ENABLE_UPLOAD' => true, 'ENABLE_UPLOAD_CHECK' => false)
						);
						$fields['LEAD_ID'] = $this->entityID;
						if($entity->Update($entityID, $fields, true, true, $this->getUpdateOptions()))
						{
							//region BizProcess
							$arErrors = array();
							\CCrmBizProcHelper::AutoStartWorkflows(
								\CCrmOwnerType::Contact,
								$entityID,
								\CCrmBizProcEventType::Edit,
								$arErrors
							);
							//endregion
						}
					}
				}
				elseif(!\CCrmContact::Exists($entityID))
				{
					throw new EntityConversionException(
						\CCrmOwnerType::Lead,
						\CCrmOwnerType::Contact,
						EntityConversionException::TARG_DST,
						EntityConversionException::NOT_FOUND
					);
				}
			}
			else//if($entityTypeID === \CCrmOwnerType::Deal)
			{
				if(!\CCrmDeal::Exists($entityID))
				{
					throw new EntityConversionException(
						\CCrmOwnerType::Lead,
						\CCrmOwnerType::Deal,
						EntityConversionException::TARG_DST,
						EntityConversionException::NOT_FOUND
					);
				}

				$entity = new \CCrmDeal(false);
			}

			$fields = self::getEntityFields($entityTypeID, $entityID);
			if(!is_array($fields))
			{
				throw new EntityConversionException(
					\CCrmOwnerType::Lead,
					$entityTypeID,
					EntityConversionException::TARG_DST,
					EntityConversionException::NOT_FOUND
				);
			}

			if(!isset($fields['LEAD_ID']) || $fields['LEAD_ID'] <= 0)
			{
				$fields = array('LEAD_ID' => $this->entityID);
				$entity->Update($entityID, $fields, false, false, $this->getUpdateOptions());
			}

			self::setDestinationEntityID(
				$entityTypeName,
				$entityID,
				$this->resultData,
				array(
					'isNew' => self::isNewDestinationEntity(
						$entityTypeName,
						$entityID,
						$this->contextData
					)
				)
			);
			return true;
		}

		if(!self::checkCreatePermission($entityTypeName, $config))
		{
			throw new EntityConversionException(
				\CCrmOwnerType::Lead,
				$entityTypeID,
				EntityConversionException::TARG_DST,
				EntityConversionException::CREATE_DENIED
			);
		}

		if(UserFieldSynchronizer::needForSynchronization(\CCrmOwnerType::Lead, $entityTypeID))
		{
			throw new EntityConversionException(
				\CCrmOwnerType::Lead,
				$entityTypeID,
				EntityConversionException::TARG_DST,
				EntityConversionException::NOT_SYNCHRONIZED
			);
		}

		if(!ConversionSettings::getCurrent()->isAutocreationEnabled())
		{
			throw new EntityConversionException(
				\CCrmOwnerType::Lead,
				$entityTypeID,
				EntityConversionException::TARG_DST,
				EntityConversionException::AUTOCREATION_DISABLED
			);
		}

		if($this->isBizProcCheckEnabled()
			&& \CCrmBizProcHelper::HasParameterizedAutoWorkflows($entityTypeID, \CCrmBizProcEventType::Create))
		{
			throw new EntityConversionException(
				\CCrmOwnerType::Lead,
				$entityTypeID,
				EntityConversionException::TARG_DST,
				EntityConversionException::HAS_WORKFLOWS
			);
		}

		$fields = $mapper->map($map, array('INIT_DATA' => $config->getInitData()));
		if(empty($fields))
		{
			throw new EntityConversionException(
				\CCrmOwnerType::Lead,
				$entityTypeID,
				EntityConversionException::TARG_DST,
				EntityConversionException::EMPTY_FIELDS
			);
		}

		if (isset($this->contextData['RESPONSIBLE_ID']))
		{
			$fields['ASSIGNED_BY_ID'] = $this->contextData['RESPONSIBLE_ID'];
		}

		if($entityTypeID === \CCrmOwnerType::Company)
		{
			$entity = new \CCrmCompany(false);
			$entityID = $entity->Add($fields, true, $this->getAddOptions());
			if($entityID <= 0)
			{
				throw new EntityConversionException(
					\CCrmOwnerType::Lead,
					\CCrmOwnerType::Company,
					EntityConversionException::TARG_DST,
					EntityConversionException::CREATE_FAILED,
					$entity->LAST_ERROR
				);
			}

			//region BizProcess
			$arErrors = array();
			\CCrmBizProcHelper::AutoStartWorkflows(
				\CCrmOwnerType::Company,
				$entityID,
				\CCrmBizProcEventType::Create,
				$arErrors
			);
			//endregion

			self::setDestinationEntityID(
				\CCrmOwnerType::CompanyName,
				$entityID,
				$this->resultData,
				array('isNew' => true)
			);
		}
		elseif($entityTypeID === \CCrmOwnerType::Contact)
		{
			$companyID = self::getDestinationEntityID(\CCrmOwnerType::CompanyName, $this->resultData);
			if($companyID > 0)
			{
				$fields['COMPANY_ID'] = $companyID;
			}

			$entity = new \CCrmContact(false);
			if(!$entity->CheckFields($fields, false, $this->getAddOptions()))
			{
				throw new EntityConversionException(
					\CCrmOwnerType::Lead,
					$entityTypeID,
					EntityConversionException::TARG_DST,
					EntityConversionException::INVALID_FIELDS,
					$entity->LAST_ERROR
				);
			}

			$entityID = $entity->Add($fields, true, $this->getAddOptions());
			if($entityID <= 0)
			{
				throw new EntityConversionException(
					\CCrmOwnerType::Lead,
					\CCrmOwnerType::Contact,
					EntityConversionException::TARG_DST,
					EntityConversionException::CREATE_FAILED,
					$entity->LAST_ERROR
				);
			}

			//region BizProcess
			$arErrors = array();
			\CCrmBizProcHelper::AutoStartWorkflows(
				\CCrmOwnerType::Contact,
				$entityID,
				\CCrmBizProcEventType::Create,
				$arErrors
			);
			//endregion

			self::setDestinationEntityID(
				\CCrmOwnerType::ContactName,
				$entityID,
				$this->resultData,
				array('isNew' => true)
			);
		}
		else//if($entityTypeID === \CCrmOwnerType::Deal)
		{
			if ($this->isReturnCustomer)
			{
				$contactIDs = Crm\Binding\LeadContactTable::getLeadContactIDs($this->entityID);
				if(!empty($contactIDs))
				{
					$fields['CONTACT_IDS'] = $contactIDs;
				}

				$companyID = $this->mapper->getSourceFieldValue('COMPANY_ID');
				if($companyID > 0)
				{
					$fields['COMPANY_ID'] = $companyID;
				}
			}
			else
			{
				$contactID = self::getDestinationEntityID(\CCrmOwnerType::ContactName, $this->resultData);
				if($contactID > 0)
				{
					$fields['CONTACT_ID'] = $contactID;
				}

				$companyID = self::getDestinationEntityID(\CCrmOwnerType::CompanyName, $this->resultData);
				if($companyID > 0)
				{
					$fields['COMPANY_ID'] = $companyID;
				}
			}

			$entity = new \CCrmDeal(false);
			$entityID = $entity->Add($fields, true, $this->getAddOptions());
			if($entityID <= 0)
			{
				throw new EntityConversionException(
					\CCrmOwnerType::Lead,
					\CCrmOwnerType::Deal,
					EntityConversionException::TARG_DST,
					EntityConversionException::CREATE_FAILED,
					$entity->LAST_ERROR
				);
			}

			if(isset($fields['PRODUCT_ROWS'])
				&& is_array($fields['PRODUCT_ROWS'])
				&& !empty($fields['PRODUCT_ROWS']))
			{
				\CCrmDeal::SaveProductRows($entityID, $fields['PRODUCT_ROWS'], false, false, false);
			}

			// requisite link
			$requisiteEntityList = array();
			$mcRequisiteEntityList = array();
			$requisite = new EntityRequisite();
			if (isset($fields['COMPANY_ID']) && $fields['COMPANY_ID'] > 0)
				$requisiteEntityList[] = array('ENTITY_TYPE_ID' => \CCrmOwnerType::Company, 'ENTITY_ID' => $fields['COMPANY_ID']);
			if (isset($fields['CONTACT_ID']) && $fields['CONTACT_ID'] > 0)
				$requisiteEntityList[] = array('ENTITY_TYPE_ID' => \CCrmOwnerType::Contact, 'ENTITY_ID' => $fields['CONTACT_ID']);
			if (isset($fields['MYCOMPANY_ID']) && $fields['MYCOMPANY_ID'] > 0)
				$mcRequisiteEntityList[] = array('ENTITY_TYPE_ID' => \CCrmOwnerType::Company, 'ENTITY_ID' => $fields['MYCOMPANY_ID']);
			$requisiteIdLinked = 0;
			$bankDetailIdLinked = 0;
			$mcRequisiteIdLinked = 0;
			$mcBankDetailIdLinked = 0;
			$requisiteInfoLinked = $requisite->getDefaultRequisiteInfoLinked($requisiteEntityList);
			if (is_array($requisiteInfoLinked))
			{
				if (isset($requisiteInfoLinked['REQUISITE_ID']))
					$requisiteIdLinked = (int)$requisiteInfoLinked['REQUISITE_ID'];
				if (isset($requisiteInfoLinked['BANK_DETAIL_ID']))
					$bankDetailIdLinked = (int)$requisiteInfoLinked['BANK_DETAIL_ID'];
			}
			$mcRequisiteInfoLinked = $requisite->getDefaultMyCompanyRequisiteInfoLinked($mcRequisiteEntityList);
			if (is_array($mcRequisiteInfoLinked))
			{
				if (isset($mcRequisiteInfoLinked['MC_REQUISITE_ID']))
					$mcRequisiteIdLinked = (int)$mcRequisiteInfoLinked['MC_REQUISITE_ID'];
				if (isset($mcRequisiteInfoLinked['MC_BANK_DETAIL_ID']))
					$mcBankDetailIdLinked = (int)$mcRequisiteInfoLinked['MC_BANK_DETAIL_ID'];
			}
			unset($requisite, $requisiteEntityList, $mcRequisiteEntityList, $requisiteInfoLinked, $mcRequisiteInfoLinked);
			if ($requisiteIdLinked > 0 || $mcRequisiteIdLinked > 0)
			{
				EntityLink::register(
					\CCrmOwnerType::Deal, $entityID,
					$requisiteIdLinked, $bankDetailIdLinked,
					$mcRequisiteIdLinked, $mcBankDetailIdLinked
				);
			}
			unset($requisiteIdLinked, $bankDetailIdLinked, $mcRequisiteIdLinked, $mcBankDetailIdLinked);

			//region BizProcess
			$arErrors = array();
			\CCrmBizProcHelper::AutoStartWorkflows(
				\CCrmOwnerType::Deal,
				$entityID,
				\CCrmBizProcEventType::Create,
				$arErrors
			);
			//endregion

			//Region automation
			$starter = new Crm\Automation\Starter(\CCrmOwnerType::Deal, $entityID);
			$starter->runOnAdd();
			//end region

			self::setDestinationEntityID(
				\CCrmOwnerType::DealName,
				$entityID,
				$this->resultData,
				array('isNew' => true)
			);
		}
		return true;
	}
	elseif($this->currentPhase === LeadConversionPhase::FINALIZATION)
	{
		$result = \CCrmLead::GetListEx(
			array(),
			array('=ID' => $this->entityID, 'CHECK_PERMISSIONS' => 'N'),
			false,
			false,
			array('STATUS_ID')
		);

		$presentFields = is_object($result) ? $result->Fetch() : null;
		if(is_array($presentFields))
		{
			$fields = array();
			$entityUpdateOptions = [
				'REGISTER_SONET_EVENT' => true,
				// required fields were checked on a CORRECT action before, if needed.
				// now any error in update will break the scenario
				'DISABLE_USER_FIELD_CHECK' => true,
			];

			$statusID = isset($presentFields['STATUS_ID']) ? $presentFields['STATUS_ID'] : '';
			if($statusID !== 'CONVERTED')
			{
				$fields['STATUS_ID'] = 'CONVERTED';
				$entityUpdateOptions['ENABLE_ACTIVITY_COMPLETION'] = $this->isActivityCompletionEnabled();
			}

			$contactID = self::getDestinationEntityID(\CCrmOwnerType::ContactName, $this->resultData);
			if($contactID > 0)
			{
				$fields['CONTACT_ID'] = $contactID;
				// relation was registered on contact add. avoid duplication
				$entityUpdateOptions['EXCLUDE_FROM_RELATION_REGISTRATION'][] =
					new Crm\ItemIdentifier(\CCrmOwnerType::Contact, $contactID);
			}

			$companyID = self::getDestinationEntityID(\CCrmOwnerType::CompanyName, $this->resultData);
			if($companyID > 0)
			{
				$fields['COMPANY_ID'] = $companyID;
				// relation was registered on company add. avoid duplication
				$entityUpdateOptions['EXCLUDE_FROM_RELATION_REGISTRATION'][] =
					new Crm\ItemIdentifier(\CCrmOwnerType::Company, $companyID);
			}

			if(!empty($fields))
			{
				$entity = new \CCrmLead(false);
				if($entity->Update($this->entityID, $fields, true, true, $entityUpdateOptions))
				{
					//region Requisites
					if($companyID > 0 || $contactID > 0)
					{
						$dbResult = \CCrmLead::GetListEx(
							array(),
							array('=ID' => $this->entityID, 'CHECK_PERMISSIONS' => 'N'),
							false,
							false,
							array('ADDRESS', 'ADDRESS_2', 'ADDRESS_CITY')
						);

						$addressFields = is_object($dbResult) ? $dbResult->Fetch() : null;
						if(is_array($addressFields))
						{
							$requisite = new EntityRequisite();
							try
							{
								//region Process Company requisite
								if($companyID > 0)
								{
									$companyPresetID = EntityRequisite::getDefaultPresetId(\CCrmOwnerType::Company);
									if($companyPresetID > 0)
									{
										$requisiteCount = $requisite->getCountByFilter(
											array(
												'ENTITY_TYPE_ID' => \CCrmOwnerType::Company,
												'ENTITY_ID' => $companyID
											)
										);

										if($requisiteCount === 0)
										{
											$converter = new AddressRequisiteConverter(
												\CCrmOwnerType::Company,
												$companyPresetID,
												false
											);
											$converter->processEntity($companyID);
										}
									}
								}
								//endregion
								//region Process Contact requisite
								if($contactID > 0)
								{
									$contactPresetID = EntityRequisite::getDefaultPresetId(\CCrmOwnerType::Contact);
									if($contactPresetID > 0)
									{
										$requisiteCount = $requisite->getCountByFilter(
											array(
												'ENTITY_TYPE_ID' => \CCrmOwnerType::Contact,
												'ENTITY_ID' => $contactID
											)
										);

										if($requisiteCount === 0)
										{
											$converter = new AddressRequisiteConverter(
												\CCrmOwnerType::Contact,
												$contactPresetID,
												false
											);
											$converter->processEntity($contactID);
										}
									}
								}
								//endregion
							}
							catch(RequisiteConvertException $ex)
							{
							}
						}
					}
					//endregion

					if (!$this->shouldSkipBizProcAutoStart())
					{
						//region BizProcess
						$arErrors = array();
						\CCrmBizProcHelper::AutoStartWorkflows(
							\CCrmOwnerType::Lead,
							$this->entityID,
							\CCrmBizProcEventType::Edit,
							$arErrors
						);
						//endregion
					}

					//region Automation
					$starter = new Crm\Automation\Starter(\CCrmOwnerType::Lead, $this->entityID);
					$starter->runOnUpdate($fields, $presentFields);
					//end region
				}
			}

			//region Call finalization phase common action from parent
			$this->onFinalizationPhase();
			//endregion
		}

		return true;
	}

	return false;
}

Добавить комментарий