CCrmDocumentDeal::UpdateDocument

  1. Bitrix24 API (v. 23.675.0)
  2. crm
  3. CCrmDocumentDeal
  4. UpdateDocument
  • Модуль: crm
  • Путь к файлу: ~/bitrix/modules/crm/classes/general/crm_document_deal.php
  • Класс: \CCrmDocumentDeal
  • Вызов: CCrmDocumentDeal::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');
	}

	$dbDocumentList = CCrmDeal::GetListEx(
		[],
		[
			'ID' => $arDocumentID['ID'],
			'CHECK_PERMISSIONS' => 'N',
		],
		false,
		false,
		['ID', 'CATEGORY_ID', 'STAGE_ID']
	);

	$arPresentFields = $dbDocumentList->Fetch();
	if (!is_array($arPresentFields))
	{
		throw new Exception(GetMessage('CRM_DOCUMENT_ELEMENT_IS_NOT_FOUND'));
	}

	$arFields = self::performTypeCast($arDocumentID, $arFields, true);

	//region Category & Stage
	$categoryID = isset($arPresentFields['CATEGORY_ID']) ? (int)$arPresentFields['CATEGORY_ID'] : 0;
	if(isset($arFields['CATEGORY_ID']) && $arFields['CATEGORY_ID'] != $categoryID)
	{
		throw new Exception(GetMessage('CRM_DOCUMENT_DEAL_CATEGORY_CHANGE_ERROR'));
	}

	$arFields = self::performTypeCast4CategoryAndStage($arFields, $categoryID);

	//endregion

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

	$useTransaction = static::shouldUseTransaction();

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

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

	if (isset($arFields['OPPORTUNITY']))
	{
		$arFields['IS_MANUAL_OPPORTUNITY'] = $arFields['OPPORTUNITY'] > 0 ? 'Y' : 'N';
	}

	$CCrmEntity = new CCrmDeal(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 (isset($arFields['TRACKING_SOURCE_ID']))
	{
		Crm\Tracking\UI\Details::saveEntityData(
			\CCrmOwnerType::Deal,
			$arDocumentID['ID'],
			$arFields
		);
	}

	if (COption::GetOptionString('crm', 'start_bp_within_bp', 'N') == 'Y')
	{
		$CCrmBizProc = new CCrmBizProc('DEAL');
		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);
		}
	}

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

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

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