- Модуль: crm
- Путь к файлу: ~/bitrix/modules/crm/lib/activity/provider/task.php
- Класс: Bitrix\Crm\Activity\Provider\Task
- Вызов: Task::onTaskUpdate
static function onTaskUpdate($taskId, &$currentTaskFields, &$previousTaskFields)
{
$taskId = (int)$taskId;
if (self::isTaskLocked($taskId, self::LOCK_TYPE_UPDATE))
{
return false;
}
if ($taskId <= 0 || !Loader::includeModule('tasks'))
{
return false;
}
$itemIterator = \CTasks::getByID($taskId, false);
$task = $itemIterator->fetch();
if(!$task)
{
return false;
}
$isStatusChanged = (isset($currentTaskFields['STATUS']) && (string)$currentTaskFields['STATUS'] !== (string)$previousTaskFields['STATUS']);
$listIterator = \CCrmActivity::getList(
array(),
array(
'=TYPE_ID' => \CCrmActivityType::Task,
'=ASSOCIATED_ENTITY_ID' => $taskId,
'CHECK_PERMISSIONS' => 'N'
)
);
if (self::isTaskLocked($taskId, self::LOCK_TYPE_COMPLETE))
{
if ($isStatusChanged && $activity = $listIterator->fetch())
{
self::setFromTask($taskId, $task, $activity);
if (isset($activity['BINDINGS']) && count($activity['BINDINGS']) > 0)
{
Crm\Automation\Trigger\TaskStatusTrigger::execute($activity['BINDINGS'], ['TASK' => $task]);
}
}
return false;
}
$isFound = false;
$taskBindings = [];
while($activity = $listIterator->fetch())
{
$isFound = true;
self::setFromTask($taskId, $task, $activity);
// Update activity if bindings are found otherwise delete unbound activity
if(isset($activity['BINDINGS']) && count($activity['BINDINGS']) > 0)
{
$activity['COMMUNICATIONS'] = self::prepareCommunications($activity);
\CCrmActivity::update($activity['ID'], $activity, false, true, array('SKIP_ASSOCIATED_ENTITY' => true, 'REGISTER_SONET_EVENT' => true));
\CCrmLiveFeed::syncTaskEvent($activity, $task);
$taskBindings = $activity['BINDINGS'];
}
else
{
\CCrmLiveFeed::revertTasksLogEvent(array(
"ACTIVITY" => $activity,
"TASK" => $task
));
$deletionParams = isset(self::$deletionParams[$taskId]) && is_array(self::$deletionParams[$taskId])
? self::$deletionParams[$taskId] : array();
unset(self::$deletionParams[$taskId]);
\CCrmActivity::delete(
$activity['ID'],
false,
true,
array_merge($deletionParams, array('SKIP_ASSOCIATED_ENTITY' => true))
);
}
/*
\Bitrix\Crm\Timeline\TaskController::getInstance()->onModify(
$activity['ID'],
array(
'CURRENT_TASK_FIELDS' => $currentTaskFields,
'PREVIOUS_TASK_FIELDS' => $previousTaskFields,
'BINDINGS' => isset($activity['BINDINGS']) ? $activity['BINDINGS'] : array()
)
);
*/
}
if(!$isFound && !TimeLineManager::isNewIntegrationEnabled())
{
$activity = array();
self::setFromTask($taskId, $task, $activity);
if(isset($activity['BINDINGS']) && count($activity['BINDINGS']) > 0)
{
$creationParams = isset(self::$creationParams[$taskId]) && is_array(self::$creationParams[$taskId])
? self::$creationParams[$taskId] : array();
unset(self::$creationParams[$taskId]);
//Stub for communication is required for activity list optimization (see \CCrmActivity::PrepareClientInfos)
$activity['COMMUNICATIONS'] = self::prepareCommunications($activity);
\CCrmActivity::add(
$activity,
false,
true,
array_merge($creationParams, array('SKIP_ASSOCIATED_ENTITY' => true, 'REGISTER_SONET_EVENT' => true))
);
$taskBindings = $activity['BINDINGS'];
}
}
if ($isStatusChanged && $taskBindings)
{
Crm\Automation\Trigger\TaskStatusTrigger::execute($taskBindings, ['TASK' => $task]);
}
return true;
}