• Модуль: crm
  • Путь к файлу: ~/bitrix/modules/crm/classes/general/crm_contact.php
  • Класс: \CAllCrmContact
  • Вызов: CAllCrmContact::Delete
public function Delete($ID, $arOptions = array())
{
	global $DB, $APPLICATION;

	$ID = intval($ID);
	if(!is_array($arOptions))
	{
		$arOptions = array();
	}

	if ($this->isUseOperation())
	{
		return $this->getCompatibilityAdapter()->performDelete($ID, $arOptions);
	}

	if(isset($arOptions['CURRENT_USER']))
	{
		$iUserId = intval($arOptions['CURRENT_USER']);
	}
	else
	{
		$iUserId = CCrmSecurityHelper::GetCurrentUserID();
	}

	$dbResult = \CCrmContact::GetListEx(
		array(),
		array('=ID' => $ID, 'CHECK_PERMISSIONS' => 'N')
	);
	$arFields = is_object($dbResult) ? $dbResult->Fetch() : null;
	if(!is_array($arFields))
	{
		return false;
	}

	$assignedByID = isset($arFields['ASSIGNED_BY_ID']) ? (int)$arFields['ASSIGNED_BY_ID'] : 0;
	$categoryId = (int)($arFields['CATEGORY_ID'] ?? 0);

	$permissionEntityType = (new PermissionEntityTypeHelper(CCrmOwnerType::Contact))
		->getPermissionEntityTypeForCategory($categoryId)
	;

	$sWherePerm = '';
	if ($this->bCheckPermission)
	{
		$arEntityAttr = $this->cPerms->GetEntityAttr($permissionEntityType, $ID);
		$sEntityPerm = $this->cPerms->GetPermType($permissionEntityType, 'DELETE', $arEntityAttr[$ID]);
		if ($sEntityPerm == BX_CRM_PERM_NONE)
			return false;
		else if ($sEntityPerm == BX_CRM_PERM_SELF)
			$sWherePerm = " AND ASSIGNED_BY_ID = {$iUserId}";
		else if ($sEntityPerm == BX_CRM_PERM_OPEN)
			$sWherePerm = " AND (OPENED = 'Y' OR ASSIGNED_BY_ID = {$iUserId})";
	}

	$APPLICATION->ResetException();
	$events = GetModuleEvents('crm', 'OnBeforeCrmContactDelete');
	while ($arEvent = $events->Fetch())
		if (ExecuteModuleEventEx($arEvent, array($ID))===false)
		{
			$err = GetMessage("MAIN_BEFORE_DEL_ERR").' '.$arEvent['TO_NAME'];
			if ($ex = $APPLICATION->GetException())
				$err .= ': '.$ex->GetString();
			$APPLICATION->throwException($err);
			return false;
		}

	$enableDeferredMode = isset($arOptions['ENABLE_DEFERRED_MODE'])
		? (bool)$arOptions['ENABLE_DEFERRED_MODE']
		: \Bitrix\Crm\Settings\ContactSettings::getCurrent()->isDeferredCleaningEnabled();

	//By default we need to clean up related bizproc entities
	$processBizproc = isset($arOptions['PROCESS_BIZPROC']) ? (bool)$arOptions['PROCESS_BIZPROC'] : true;
	if($processBizproc)
	{
		$bizproc = new CCrmBizProc('CONTACT');
		$bizproc->ProcessDeletion($ID);
	}

	$enableRecycleBin = \Bitrix\Crm\Recycling\ContactController::isEnabled()
		&& \Bitrix\Crm\Settings\ContactSettings::getCurrent()->isRecycleBinEnabled();
	if($enableRecycleBin)
	{
		\Bitrix\Crm\Recycling\ContactController::getInstance()->moveToBin($ID, array('FIELDS' => $arFields));
	}

	$obRes = $DB->Query("DELETE FROM b_crm_contact WHERE ID = {$ID}{$sWherePerm}", false, 'FILE: '.__FILE__.'
LINE: '.__LINE__); if (is_object($obRes) && $obRes->AffectedRowsCount() > 0) { if(defined('BX_COMP_MANAGED_CACHE')) { $GLOBALS['CACHE_MANAGER']->CleanDir('b_crm_contact'); } if(!$enableRecycleBin) { self::ReleaseExternalResources($arFields); } Container::getInstance()->getFactory(CCrmOwnerType::Contact)->clearItemCategoryCache((int)$ID); CCrmSearch::DeleteSearch('CONTACT', $ID); Bitrix\Crm\Search\SearchContentBuilderFactory::create( CCrmOwnerType::Contact )->removeShortIndex($ID); Crm\Security\Manager::getEntityController(CCrmOwnerType::Contact) ->unregister($permissionEntityType, $ID) ; $GLOBALS['USER_FIELD_MANAGER']->Delete(self::$sUFEntityID, $ID); CCrmDeal::ProcessContactDeletion($ID); CCrmLead::ProcessContactDeletion($ID); \Bitrix\Crm\Binding\ContactCompanyTable::unbindAllCompanies($ID); \Bitrix\Crm\Binding\QuoteContactTable::unbindAllQuotes($ID); if (Main\Loader::includeModule('sale')) { (new \Bitrix\Crm\Order\ContactCompanyBinding(\CCrmOwnerType::Contact))->unbind($ID); } (new Contractor\StoreDocumentContactCompanyBinding(\CCrmOwnerType::Contact))->unbind($ID); (new Contractor\AgentContractContactCompanyBinding(\CCrmOwnerType::Contact))->unbind($ID); if(!$enableDeferredMode) { $CCrmEvent = new CCrmEvent(); $CCrmEvent->DeleteByElement('CONTACT', $ID); } else { Bitrix\Crm\Cleaning\CleaningManager::register(CCrmOwnerType::Contact, $ID); } $enableDupIndexInvalidation = isset($arOptions['ENABLE_DUP_INDEX_INVALIDATION']) ? (bool)$arOptions['ENABLE_DUP_INDEX_INVALIDATION'] : true; if($enableDupIndexInvalidation) { DuplicateManager::markDuplicateIndexAsJunk(CCrmOwnerType::Contact, $ID); } $duplicateCriterionRegistrar = DuplicateManager::getCriterionRegistrar(\CCrmOwnerType::Contact); $data = (new Crm\Integrity\CriterionRegistrar\Data()) ->setEntityTypeId(\CCrmOwnerType::Contact) ->setEntityId($ID) ; $duplicateCriterionRegistrar->unregister($data); DuplicateIndexMismatch::unregisterEntity(CCrmOwnerType::Contact, $ID); //Statistics & History --> $leadID = isset($arFields['LEAD_ID']) ? (int)$arFields['LEAD_ID'] : 0; if($leadID) { \Bitrix\Crm\Statistics\LeadConversionStatisticsEntry::processBindingsChange($leadID); } \Bitrix\Crm\Statistics\ContactGrowthStatisticEntry::unregister($ID); //<-- Statistics & History \Bitrix\Crm\Counter\Monitor::getInstance()->onEntityDelete(CCrmOwnerType::Contact, $arFields); CCrmActivity::DeleteByOwner(CCrmOwnerType::Contact, $ID); if(!$enableRecycleBin) { $CCrmFieldMulti = new CCrmFieldMulti(); $CCrmFieldMulti->DeleteByElement('CONTACT', $ID); EntityAddress::unregister(CCrmOwnerType::Contact, $ID, EntityAddressType::Primary); \Bitrix\Crm\Timeline\TimelineEntry::deleteByOwner(CCrmOwnerType::Contact, $ID); self::getCommentsAdapter()->performDelete((int)$ID, $arOptions); $requisite = new \Bitrix\Crm\EntityRequisite(); $requisite->deleteByEntity(CCrmOwnerType::Contact, $ID); unset($requisite); CCrmSonetSubscription::UnRegisterSubscriptionByEntity(CCrmOwnerType::Contact, $ID); CCrmLiveFeed::DeleteLogEvents( array( 'ENTITY_TYPE_ID' => CCrmOwnerType::Contact, 'ENTITY_ID' => $ID ) ); UtmTable::deleteEntityUtm(CCrmOwnerType::Contact, $ID); Tracking\Entity::deleteTrace(CCrmOwnerType::Contact, $ID); } \Bitrix\Crm\Timeline\ContactController::getInstance()->onDelete( $ID, array('FIELDS' => $arFields) ); if(\Bitrix\Crm\Settings\HistorySettings::getCurrent()->isContactDeletionEventEnabled()) { CCrmEvent::RegisterDeleteEvent(CCrmOwnerType::Contact, $ID, 0, array('FIELDS' => $arFields)); } if(defined("BX_COMP_MANAGED_CACHE")) { $GLOBALS["CACHE_MANAGER"]->ClearByTag("crm_entity_name_".CCrmOwnerType::Contact."_".$ID); } $afterEvents = GetModuleEvents('crm', 'OnAfterCrmContactDelete'); while ($arEvent = $afterEvents->Fetch()) { ExecuteModuleEventEx($arEvent, array($ID)); } $identifier = new Crm\ItemIdentifier(\CCrmOwnerType::Contact, (int)$ID); CCrmLiveFeed::DeleteUserCrmConnection(\Bitrix\Crm\UserField\Types\ElementType::getValueByIdentifier($identifier)); } $item = $this->createPullItem($arFields); Crm\Integration\PullManager::getInstance()->sendItemDeletedEvent( $item, [ 'TYPE' => self::$TYPE_NAME, 'SKIP_CURRENT_USER' => false, 'EVENT_ID' => ($arOptions['eventId'] ?? null), 'CATEGORY_ID' => ($arFields['CATEGORY_ID'] ?? 0), ] ); return true; }