CCrmDocumentLead::UpdateDocument

  1. Bitrix24 API (v. 23.675.0)
  2. crm
  3. CCrmDocumentLead
  4. UpdateDocument
  • Модуль: crm
  • Путь к файлу: ~/bitrix/modules/crm/classes/general/crm_document_lead.php
  • Класс: \CCrmDocumentLead
  • Вызов: CCrmDocumentLead::UpdateDocument
static function UpdateDocument($documentId, $arFields, $modifiedById = null)
{
	global $DB;

	if(empty($arFields))
	{
		return;
	}

	$arDocumentID = self::GetDocumentInfo($documentId);
	if (empty($arDocumentID))
		throw new CBPArgumentNullException('documentId');

	if(!CCrmLead::Exists($arDocumentID['ID']))
	{
		throw new Exception(GetMessage('CRM_DOCUMENT_ELEMENT_IS_NOT_FOUND'));
	}

	$complexDocumentId = [$arDocumentID['DOCUMENT_TYPE'][0], $arDocumentID['DOCUMENT_TYPE'][1], $documentId];
	$arDocumentFields = self::GetDocumentFields($arDocumentID['TYPE']);

	$arKeys = array_keys($arFields);
	foreach ($arKeys as $key)
	{
		if (!array_key_exists($key, $arDocumentFields))
		{
			//Fix for issue #40374
			unset($arFields[$key]);
			continue;
		}

		$fieldType = $arDocumentFields[$key]["Type"];
		if (in_array($fieldType, array("phone", "email", "im", "web"), true))
		{
			CCrmDocument::PrepareEntityMultiFields($arFields, mb_strtoupper($fieldType));
			continue;
		}

		$arFields[$key] = (is_array($arFields[$key]) && !CBPHelper::IsAssociativeArray($arFields[$key])) ? $arFields[$key] : array($arFields[$key]);
		if ($fieldType == "user")
		{
			$arFields[$key] = \CBPHelper::extractUsers($arFields[$key], $complexDocumentId);
		}
		elseif ($fieldType == "select" && mb_substr($key, 0, 3) == "UF_")
		{
			self::InternalizeEnumerationField('CRM_LEAD', $arFields, $key);
		}
		elseif ($fieldType == "file")
		{
			$arFileOptions = array('ENABLE_ID' => true);
			foreach ($arFields[$key] as &$value)
			{
				//Issue #40380. Secure URLs and file IDs are allowed.
				$file = false;
				if (\CCrmFileProxy::TryResolveFile($value, $file, $arFileOptions))
				{
					global $USER_FIELD_MANAGER;
					if ($USER_FIELD_MANAGER instanceof \CUserTypeManager)
					{
						$prevValue = $USER_FIELD_MANAGER->GetUserFieldValue(
							\CCrmOwnerType::ResolveUserFieldEntityID(\CCrmOwnerType::Lead),
							$key,
							$arDocumentID['ID']
						);
						if ($prevValue)
						{
							$file['old_id'] = $prevValue;
						}
					}
				}
				$value = $file;
			}
			unset($value, $prevValue);
		}
		elseif ($fieldType == "S:HTML")
		{
			foreach ($arFields[$key] as &$value)
			{
				$value = array("VALUE" => $value);
			}
			unset($value);
		}

		if (!$arDocumentFields[$key]["Multiple"] && is_array($arFields[$key]))
		{
			if (count($arFields[$key]) > 0)
			{
				$a = array_values($arFields[$key]);
				$arFields[$key] = $a[0];
			}
			else
			{
				$arFields[$key] = null;
			}
		}
	}

	if(isset($arFields['COMMENTS']) && $arFields['COMMENTS'] !== '')
	{
		$arFields['COMMENTS'] = static::sanitizeCommentsValue($arFields['COMMENTS']);
	}

	//check STATUS_ID changes for automation
	$arPresentFields = [];
	if (isset($arFields['STATUS_ID']))
	{
		$dbDocumentList = CCrmLead::GetListEx(
			array(),
			array('ID' => $arDocumentID['ID'], 'CHECK_PERMISSIONS' => 'N'),
			false,
			false,
			array('ID', 'STATUS_ID')
		);
		$arPresentFields = $dbDocumentList->Fetch();
	}

	$useTransaction = static::shouldUseTransaction();

	if ($useTransaction)
	{
		$DB->StartTransaction();
	}

	if ($modifiedById > 0)
	{
		$arFields['MODIFY_BY_ID'] = $modifiedById;
	}

	$updatedFields = $arFields;

	$CCrmEntity = new CCrmLead(false);
	$res = $CCrmEntity->Update(
		$arDocumentID['ID'],
		$arFields,
		true,
		true,
		[
			'DISABLE_USER_FIELD_CHECK' => true,
			'REGISTER_SONET_EVENT' => true,
			'CURRENT_USER' => $modifiedById ?? static::getSystemUserId()
		]
	);

	if (!$res)
	{
		if ($useTransaction)
		{
			$DB->Rollback();
		}
		throw new Exception($CCrmEntity->LAST_ERROR);
	}

	if (COption::GetOptionString("crm", "start_bp_within_bp", "N") == "Y")
	{
		$CCrmBizProc = new CCrmBizProc('LEAD');
		if (false === $CCrmBizProc->CheckFields($arDocumentID['ID'], true))
		{
			if ($useTransaction)
			{
				$DB->Rollback();
			}
			throw new Exception($CCrmBizProc->LAST_ERROR);
		}

		if ($res && !$CCrmBizProc->StartWorkflow($arDocumentID['ID']))
		{
			if ($useTransaction)
			{
				$DB->Rollback();
			}
			throw new Exception($CCrmBizProc->LAST_ERROR);
		}
	}

	if (isset($arFields['TRACKING_SOURCE_ID']))
	{
		Crm\Tracking\UI\Details::saveEntityData(
			\CCrmOwnerType::Lead,
			$arDocumentID['ID'],
			$arFields
		);
	}

	//region automation
	$starter = new Crm\Automation\Starter(\CCrmOwnerType::Lead, $arDocumentID['ID']);
	$starter->setContextToBizproc()->runOnUpdate($updatedFields, $arPresentFields);
	//endregion

	if ($res && $useTransaction)
	{
		$DB->Commit();
	}
}

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