CBPTaskService :: Update: Bitrix method

      
<?php 
//  CBPTaskService :: Update()
//  /dist/bitrix/modules/bizproc/classes/mysql/taskservice.php:55

    
public 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);

        
$strSql =
            
"UPDATE b_bp_task SET ".
            
"    ".$strUpdate.", ".
            
"    MODIFIED = ".$DB->CurrentTimeFunction()." ".
            
"WHERE ID = ".intval($id)." ";
        
$DB->Query($strSqlFalse"File: ".__FILE__."<br>Line: ".__LINE__);

        
$removedUsers = array();

        if (
is_set($arFields"USERS"))
        {
            
$dbResUser $DB->Query("SELECT USER_ID FROM b_bp_task_user WHERE TASK_ID = ".intval($id)." ");
            while (
$arResUser $dbResUser->Fetch())
            {
                
CUserCounter::Decrement($arResUser["USER_ID"], 'bp_tasks''**');
                
$removedUsers[] = $arResUser["USER_ID"];
            }
            
$DB->Query("DELETE FROM b_bp_task_user WHERE TASK_ID = ".intval($id)." ");

            
$ar = array();
            foreach (
$arFields["USERS"] as $userId)
            {
                
$userId intval($userId);
                if (
in_array($userId$ar))
                    continue;

                
$DB->Query(
                    
"INSERT INTO b_bp_task_user (USER_ID, TASK_ID, ORIGINAL_USER_ID) ".
                    
"VALUES (".intval($userId).", ".intval($id).", ".intval($userId).") "
                
);

                
CUserCounter::Increment($userId'bp_tasks''**');

                
$ar[] = $userId;
            }
        }

        
$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 (
$arResUser $dbResUser->Fetch())
            {
                
CUserCounter::Decrement($arResUser["USER_ID"], 'bp_tasks''**');

                if (
$arFields['STATUS'] == CBPTaskStatus::Timeout)
                    
$userStatuses[$arResUser["USER_ID"]] = CBPTaskUserStatus::No;
                else
                    
$removedUsers[] = $arResUser["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 (
$userStatuses)
            
$arFields['USERS_STATUSES'] = $userStatuses;

        
self::onTaskChange($id$arFieldsCBPTaskChangedStatus::Update);
        return 
$id;
    }