- Модуль: crm
- Путь к файлу: ~/bitrix/modules/crm/lib/timeline/activitycontroller.php
- Класс: Bitrix\Crm\Timeline\ActivityController
- Вызов: ActivityController::onModify
public function onModify($ownerID, array $params)
{
if(!is_int($ownerID))
{
$ownerID = (int)$ownerID;
}
if($ownerID <= 0)
{
throw new Main\ArgumentException('Owner ID must be greater than zero.', 'ownerID');
}
$currentFields = isset($params['CURRENT_FIELDS']) && is_array($params['CURRENT_FIELDS'])
? $params['CURRENT_FIELDS'] : array();
$currentBindings = isset($params['CURRENT_BINDINGS']) && is_array($params['CURRENT_BINDINGS'])
? $params['CURRENT_BINDINGS'] : array();
$previousFields = isset($params['PREVIOUS_FIELDS']) && is_array($params['PREVIOUS_FIELDS'])
? $params['PREVIOUS_FIELDS'] : array();
$additionalParams = isset($params['ADDITIONAL_PARAMS']) && is_array($params['ADDITIONAL_PARAMS'])
? $params['ADDITIONAL_PARAMS'] : [];
$typeID = isset($currentFields['TYPE_ID']) ? (int)$currentFields['TYPE_ID'] : \CCrmActivityType::Undefined;
$providerID = isset($currentFields['PROVIDER_ID']) ? $currentFields['PROVIDER_ID'] : '';
$prevCompleted = isset($previousFields['COMPLETED']) && $previousFields['COMPLETED'] === 'Y';
$curCompleted = isset($currentFields['COMPLETED']) && $currentFields['COMPLETED'] === 'Y';
$authorID = self::resolveAuthorID($currentFields);
$historyEntryID = 0;
if(!$prevCompleted && $curCompleted)
{
if (
$typeID === \CCrmActivityType::Provider && $providerID === Activity\Provider\Tasks\Comment::getId()
)
{
// do nothing...
}
elseif ($typeID == \CCrmActivityType::Task)
{
$historyEntryID = MarkEntry::create(
array(
'MARK_TYPE_ID' => TimelineMarkType::SUCCESS,
'ENTITY_TYPE_ID' => \CCrmOwnerType::Activity,
'ENTITY_CLASS_NAME' => $providerID,
'ENTITY_ID' => $ownerID,
'AUTHOR_ID' => $authorID,
'BINDINGS' => self::mapBindings($currentBindings)
)
);
}
else
{
$historyData = [
'ACTIVITY_TYPE_ID' => $typeID,
'ACTIVITY_PROVIDER_ID' => $providerID,
'ENTITY_ID' => $ownerID,
'AUTHOR_ID' => $authorID,
'BINDINGS' => self::mapBindings($currentBindings),
];
$provider = \CCrmActivity::GetProviderById($providerID);
if (!is_null($provider) && $provider::isTask())
{
$taskId = $currentFields['ASSOCIATED_ENTITY_ID'];
$historyData['SOURCE_ID'] = $taskId;
}
// workaround to correct sort timeline history of completed calls
// when it automatically close
if (
isset($additionalParams['CUSTOM_CREATION_TIME'])
&& Crm\Settings\Crm::isUniversalActivityScenarioEnabled()
)
{
$historyData['CREATED'] = DateTime::createFromUserTime($additionalParams['CUSTOM_CREATION_TIME'])->add('-1 second');
}
if (
isset($params['CURRENT_FIELDS']['SETTINGS']['MISSED_CALL'])
&& $params['CURRENT_FIELDS']['SETTINGS']['MISSED_CALL'] === true
&& !Crm\Settings\Crm::isUniversalActivityScenarioEnabled()
)
{
$historyData['CREATED'] = DateTime::createFromUserTime($params['CURRENT_FIELDS']['CREATED']);
}
$historyEntryID = ActivityEntry::create($historyData);
}
}
elseif($prevCompleted && !$curCompleted)
{
if(
$typeID == \CCrmActivityType::Provider
&& in_array(
$providerID,
[
Activity\Provider\ToDo::getId(),
Activity\Provider\ConfigurableRestApp::getId(),
Activity\Provider\Zoom::getId(),
Activity\Provider\Tasks\Task::getId(),
Activity\Provider\Tasks\Comment::getId(),
Activity\Provider\OpenLine::getId(),
]
)
)
{
// do nothing
}
else
{
//Add Renew event
$historyEntryID = MarkEntry::create(
array(
'MARK_TYPE_ID' => TimelineMarkType::RENEW,
'ENTITY_TYPE_ID' => \CCrmOwnerType::Activity,
'ENTITY_CLASS_NAME' => $providerID,
'ENTITY_ID' => $ownerID,
'AUTHOR_ID' => $authorID,
'BINDINGS' => self::mapBindings($currentBindings)
)
);
}
}
$enableHistoryPush = $historyEntryID > 0;
$enableActivityPush = self::isActivitySupported($currentFields);
$pullEventData = [$ownerID => $currentFields];
if ($enableActivityPush)
{
\Bitrix\Crm\Timeline\EntityController::loadCommunicationsAndMultifields(
$pullEventData,
Crm\Service\Container::getInstance()
->getUserPermissions($params['CURRENT_USER'] ?? null)
->getCrmPermissions(),
[
'ENABLE_PERMISSION_CHECK' => false,
]
);
}
foreach($currentBindings as $binding)
{
$entityItemIdentifier = Crm\ItemIdentifier::createFromArray($binding);
if (!$entityItemIdentifier)
{
continue;
}
if (!$prevCompleted && $curCompleted && $enableHistoryPush && $enableActivityPush)
// if activity has been completed and timeline history item has been produced,
// need actually move one to another on the timeline instead of separate remove and add events:
{
$this->sendPullEventOnMove(
$entityItemIdentifier,
$ownerID,
$historyEntryID,
$params['CURRENT_USER'] ?? null
);
}
elseif (!$prevCompleted && $curCompleted && $enableActivityPush)
// if activity has been completed and timeline history item has not been produced,
// need remove completed activity from timeline:
{
$this->sendPullEventOnDeleteScheduled($entityItemIdentifier, $ownerID);
}
else
{
if ($enableActivityPush)
{
if ($prevCompleted && !$curCompleted)
// if activity has been marked as not completed
// need to create new scheduled activity instead of update existed:
{
$this->sendPullEventOnAddScheduled(
$entityItemIdentifier,
$pullEventData[$ownerID],
$params['CURRENT_USER'] ?? null
);
}
else
{
// just send pull update event with new data
$this->notifyTimelinesAboutActivityUpdateForBindings(
$pullEventData[$ownerID],
[
$binding,
],
$params['CURRENT_USER'] ?? null
);
}
}
if ($enableHistoryPush)
{
$this->sendPullEventOnAdd(
$entityItemIdentifier,
$historyEntryID,
$params['CURRENT_USER'] ?? null
);
}
}
}
}