static function Delete($ID, $checkPerms = true, $regEvent = true, $options = array())
{
global $USER_FIELD_MANAGER;
$ID = intval($ID);
if(!is_array($options))
{
$options = array();
}
$movedToRecycleBin = isset($options['MOVED_TO_RECYCLE_BIN']) && $options['MOVED_TO_RECYCLE_BIN'];
$events = GetModuleEvents('crm', 'OnBeforeActivityDelete');
while ($event = $events->Fetch())
{
if (ExecuteModuleEventEx($event, array($ID)) === false)
{
return false;
}
}
$ary = (isset($options['ACTUAL_ITEM']) && is_array($options['ACTUAL_ITEM']))
? $options['ACTUAL_ITEM']
: self::GetByID($ID, $checkPerms);
if(!is_array($ary))
{
return false; //is not found
}
$incomingChannel = \Bitrix\Crm\Activity\IncomingChannel::getInstance();
$isIncomingChannel = $incomingChannel->isIncomingChannel($ID);
$ary['IS_INCOMING_CHANNEL'] = $isIncomingChannel ? 'Y' : 'N';
$pingOffset = PingOffset::getInstance();
$pingQueue = PingQueue::getInstance();
if(!$movedToRecycleBin && \Bitrix\Crm\Recycling\ActivityController::isEnabled())
{
$enableRecycleBin = (isset($options['ENABLE_RECYCLE_BIN']) && $options['ENABLE_RECYCLE_BIN'])
|| \Bitrix\Crm\Settings\ActivitySettings::getCurrent()->isRecycleBinEnabled();
if($enableRecycleBin)
{
$recycleBinResult = \Bitrix\Crm\Recycling\ActivityController::getInstance()->moveToBin(
$ID,
array('FIELDS' => $ary)
);
if($recycleBinResult->isSuccess())
{
$movedToRecycleBin = true;
$resultData = $recycleBinResult->getData();
if(is_array($resultData) && isset($resultData['isDeleted']) && $resultData['isDeleted'])
{
$incomingChannel->unregister($ID);
$pingOffset->unregister($ID);
$pingQueue->unregister($ID);
return true;
}
}
}
}
if($movedToRecycleBin)
{
$options['SKIP_FILES'] = true;
}
$arBindings = isset($options['ACTUAL_BINDINGS']) && is_array($options['ACTUAL_BINDINGS'])
? $options['ACTUAL_BINDINGS']
: self::GetBindings($ID);
if (is_array($arBindings))
{
$monitor = Crm\Service\Timeline\Monitor::getInstance();
foreach ($arBindings as $singleBinding)
{
$monitor->onActivityRemoveIfSuitable(new Crm\ItemIdentifier((int)$singleBinding['OWNER_TYPE_ID'], (int)$singleBinding['OWNER_ID']), $ID);
}
}
if(!self::InnerDelete($ID, $options))
{
return false;
}
$USER_FIELD_MANAGER->Delete(static::UF_ENTITY_TYPE, $ID);
$incomingChannel->unregister($ID);
$pingOffset->unregister($ID);
$pingQueue->unregister($ID);
$responsibleID = isset($ary['RESPONSIBLE_ID']) ? (int)$ary['RESPONSIBLE_ID'] : 0;
if (is_array($arBindings))
{
$oldLightTimeDate = self::queryLightTimeDateByActId($ID);
(new FillActLightCounter())->onActDelete($ary);
\Bitrix\Crm\Activity\UncompletedActivity::synchronizeForUncompletedActivityChange(
\Bitrix\Crm\Activity\UncompletedActivityChange::create(
$ID,
$ary,
$arBindings,
[],
[],
$oldLightTimeDate,
null
)
);
}
// Synchronize user activity -->
$skipUserActivitySync = isset($options['SKIP_USER_ACTIVITY_SYNC']) ? $options['SKIP_USER_ACTIVITY_SYNC'] : false;
if(!$skipUserActivitySync && is_array($arBindings))
{
foreach($arBindings as $arBinding)
{
if($responsibleID > 0)
{
self::SynchronizeUserActivity($arBinding['OWNER_TYPE_ID'], $arBinding['OWNER_ID'], $responsibleID);
}
self::SynchronizeUserActivity($arBinding['OWNER_TYPE_ID'], $arBinding['OWNER_ID'], 0);
}
}
// <-- Synchronize user activity
if(is_array($arBindings))
{
if($regEvent)
{
foreach($arBindings as $arBinding)
{
self::RegisterRemoveEvent(
$arBinding['OWNER_TYPE_ID'],
$arBinding['OWNER_ID'],
$ary,
$checkPerms,
CCrmSecurityHelper::GetCurrentUserID()
);
}
unset($arBinding);
}
$skipStatistics = isset($options['SKIP_STATISTICS']) ? $options['SKIP_STATISTICS'] : false;
if(!$skipStatistics)
{
$completed = isset($ary['COMPLETED']) && $ary['COMPLETED'] === 'Y';
$deadline = isset($ary['DEADLINE']) ? $ary['DEADLINE'] : '';
if($completed && $deadline)
{
$deadline = \Bitrix\Main\Type\DateTime::createFromUserTime($deadline);
$deadline->setTime(0, 0, 0);
foreach($arBindings as $arBinding)
{
$curOwnerTypeID = isset($arBinding['OWNER_TYPE_ID']) ? intval($arBinding['OWNER_TYPE_ID']) : 0;
$curOwnerID = isset($arBinding['OWNER_ID']) ? intval($arBinding['OWNER_ID']) : 0;
if($curOwnerID > 0)
{
if($curOwnerTypeID === CCrmOwnerType::Deal)
{
Bitrix\Crm\Statistics\DealActivityStatisticEntry::register($curOwnerID, null, array('DATE' => $deadline));
}
elseif($curOwnerTypeID === CCrmOwnerType::Lead)
{
Bitrix\Crm\Statistics\LeadActivityStatisticEntry::register($curOwnerID, null, array('DATE' => $deadline));
//Bitrix\Crm\Statistics\LeadProcessStatisticsEntry::register($curOwnerID, null, array('IS_NEW' => false, 'DATE' => $deadline));
}
}
}
unset($arBinding);
}
$ary['BINDINGS'] = $arBindings;
\Bitrix\Crm\Activity\CommunicationStatistics::unregisterActivity($ary);
}
}
$skipAssocEntity = isset($options['SKIP_ASSOCIATED_ENTITY']) ? (bool)$options['SKIP_ASSOCIATED_ENTITY'] : false;
$associatedEntityId = isset($ary['ASSOCIATED_ENTITY_ID']) ? (int)$ary['ASSOCIATED_ENTITY_ID'] : 0;
$providerTypeId = isset($ary['PROVIDER_TYPE_ID']) ? (string) $ary['PROVIDER_TYPE_ID'] : null;
$provider = self::GetActivityProvider($ary);
if(!$skipAssocEntity && $provider !== null && $associatedEntityId > 0)
{
$provider::deleteAssociatedEntity($associatedEntityId, $ary, $options);
}
if ($provider !== null && $provider::canUseCalendarEvents($providerTypeId))
{
$skipCalendarEvent = isset($options['SKIP_CALENDAR_EVENT']) ? (bool)$options['SKIP_CALENDAR_EVENT'] : null;
if (!$skipCalendarEvent)
{
self::DeleteCalendarEvent($ary);
}
}
\Bitrix\Crm\Statistics\ActivityStatisticEntry::unregister($ID);
\Bitrix\Crm\Integration\Channel\ActivityChannelBinding::unregisterAll($ID);
if (isset($recycleBinResult))
{
$recycleBinEntityId = $recycleBinResult->getData()['recyclingEntityId'];
}
else
{
$recycleBinEntityId = Crm\Recycling\ActivityController::getInstance()->getRecyclingEntityId($ID);
}
\Bitrix\Crm\Timeline\ActivityController::getInstance()->onDelete(
$ID,
[
'FIELDS' => $ary,
'BINDINGS' => $arBindings,
'MOVED_TO_RECYCLE_BIN' => $movedToRecycleBin,
'RECYCLE_BIN_ENTITY_ID' => $recycleBinEntityId,
]
);
if (is_array($arBindings))
{
\Bitrix\Crm\Counter\Monitor::getInstance()->onActivityDelete($ary, $arBindings, $oldLightTimeDate);
}
\Bitrix\Crm\Ml\Scoring::onActivityDelete($ID);
if(!$movedToRecycleBin)
{
self::UnregisterLiveFeedEvent($ID);
CCrmSonetSubscription::UnRegisterSubscriptionByEntity(CCrmOwnerType::Activity, $ID);
}
if ($provider !== null)
{
$provider::onAfterDelete($ID, $ary);
}
$rsEvents = GetModuleEvents('crm', 'OnActivityDelete');
while ($arEvent = $rsEvents->Fetch())
{
ExecuteModuleEventEx($arEvent, array($ID));
}
if(defined("BX_COMP_MANAGED_CACHE"))
{
$GLOBALS["CACHE_MANAGER"]->ClearByTag("CRM_ACTIVITY_".$ID);
}
return true;
}