- Модуль: 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();
}
}