- Модуль: bizproc
- Путь к файлу: ~/bitrix/modules/bizproc/classes/general/taskservice.php
- Класс: CBPTaskService
- Вызов: CBPTaskService::update
static function update($id, $arFields)
{
global $DB;
$id = intval($id);
if ($id <= 0)
{
throw new Exception("id");
}
self::ParseFields($arFields, $id);
$strUpdate = $DB->PrepareUpdate("b_bp_task", $arFields);
if ($strUpdate)
{
$strSql =
"UPDATE b_bp_task SET ".
" ".$strUpdate.", ".
" MODIFIED = ".$DB->CurrentTimeFunction()." ".
"WHERE ID = ".intval($id)." ";
$DB->Query($strSql, False, "File: ".__FILE__."
Line: ".__LINE__);
}
$removedUsers = $addedUsers = $decremented = $incremented = [];
if (is_set($arFields, 'USERS'))
{
$arFields['USERS'] = array_map('intval', array_unique($arFields['USERS']));
$previousUserIds = static::getTaskUserIds($id);
foreach ($arFields['USERS'] as $userId)
{
if (in_array($userId, $previousUserIds, true))
{
continue;
}
$DB->Query(
"INSERT INTO b_bp_task_user (USER_ID, TASK_ID, ORIGINAL_USER_ID) ".
"VALUES ({$userId}, {$id}, {$userId})"
);
$incremented[] = $userId;
CUserCounter::Increment($userId, 'bp_tasks', '**');
}
$diff = array_diff($previousUserIds, $arFields['USERS']);
foreach ($diff as $removedUserId)
{
$decremented[] = $removedUserId;
CUserCounter::Decrement($removedUserId, 'bp_tasks', '**');
$removedUsers[] = $removedUserId;
$DB->Query("DELETE FROM b_bp_task_user WHERE TASK_ID = {$id} AND USER_ID = {$removedUserId}");
}
}
$userStatuses = array();
if (isset($arFields['STATUS']) && $arFields['STATUS'] > CBPTaskStatus::Running)
{
$dbResUser = $DB->Query("SELECT USER_ID FROM b_bp_task_user WHERE TASK_ID = ".$id." AND STATUS = ".CBPTaskUserStatus::Waiting);
while ($userIterator = $dbResUser->Fetch())
{
$decremented[] = $userIterator["USER_ID"];
CUserCounter::Decrement($userIterator["USER_ID"], 'bp_tasks', '**');
if ($arFields['STATUS'] == CBPTaskStatus::Timeout)
$userStatuses[$userIterator["USER_ID"]] = CBPTaskUserStatus::No;
else
$removedUsers[] = $userIterator["USER_ID"];
}
if ($arFields['STATUS'] == CBPTaskStatus::Timeout)
{
$DB->Query("UPDATE b_bp_task_user SET STATUS = ".CBPTaskUserStatus::No.", DATE_UPDATE = ".$DB->CurrentTimeFunction()
." WHERE TASK_ID = ".$id." AND STATUS = ".CBPTaskUserStatus::Waiting);
}
else
$DB->Query("DELETE FROM b_bp_task_user WHERE TASK_ID = ".$id." AND STATUS = ".CBPTaskUserStatus::Waiting);
}
foreach (GetModuleEvents("bizproc", "OnTaskUpdate", true) as $arEvent)
ExecuteModuleEventEx($arEvent, array($id, $arFields));
if ($removedUsers)
{
$arFields['USERS_REMOVED'] = $removedUsers;
}
if ($addedUsers)
{
$arFields['USERS_ADDED'] = $addedUsers;
}
if ($userStatuses)
{
$arFields['USERS_STATUSES'] = $userStatuses;
}
$arFields['COUNTERS_INCREMENTED'] = $incremented;
$arFields['COUNTERS_DECREMENTED'] = $decremented;
self::onTaskChange($id, $arFields, CBPTaskChangedStatus::Update);
return $id;
}