• Модуль: tasks
  • Путь к файлу: ~/bitrix/modules/tasks/classes/general/taskelapsed.php
  • Класс: not
  • Вызов: not::Update
function Update($ID, $arFields, $arParams = array())
{
	global $DB;

	$ID = intval($ID);
	if ($ID < 1)
		return false;

	$executiveUserId = null;
	if (isset($arParams['USER_ID']))
		$executiveUserId = (int) $arParams['USER_ID'];
	elseif ($userId = BitrixTasksUtilUser::getId())
		$executiveUserId = $userId;

	if ($this->CheckFields($arFields, $ID))
	{
		/** @noinspection PhpDeprecationInspection */
		$rsUpdatingLogItem = self::getByID($ID);

		if ($rsUpdatingLogItem && ($arUpdatingLogItem = $rsUpdatingLogItem->fetch()))
			$taskId = $arUpdatingLogItem['TASK_ID'];
		else
			return (false);

		$curDuration = 0;
		$rsTask = CTasks::getList(
			array(),
			array('ID' => $taskId),
			array('ID', 'TIME_SPENT_IN_LOGS')
		);
		if ($rsTask && ($arTask = $rsTask->fetch()))
			$curDuration = (int) $arTask['TIME_SPENT_IN_LOGS'];

		unset($arFields["ID"]);

		$arBinds = array(
			"COMMENT_TEXT" => $arFields["COMMENT_TEXT"]
		);

		// Maintance backward compatibility
		if (isset($arFields['MINUTES'], $arFields['SECONDS']))
		{
			CTaskAssert::logError('[0x63038b4f] ');
			CTaskAssert::assert(false);
		}

		if (isset($arFields['SECONDS']))
			$arFields['MINUTES'] = (int) round($arFields['SECONDS'] / 60, 0);
		elseif (isset($arFields['MINUTES']))
			$arFields['SECONDS'] = 60 * $arFields['MINUTES'];
		else
		{
			CTaskAssert::logError('[0x14e5d0eb] ');
			CTaskAssert::assert(false);
		}

		foreach(GetModuleEvents('tasks', 'OnBeforeTaskElapsedTimeUpdate', true) as $arEvent)
		{
			if (ExecuteModuleEventEx($arEvent, array($ID, $arUpdatingLogItem, &$arFields))===false)
				return false;
		}

		// If time changed - set CTaskElapsedItem::SOURCE_MANUAL flag
		if (
			($arUpdatingLogItem['MINUTES'] != $arFields['MINUTES'])
			|| ($arUpdatingLogItem['SECONDS'] != $arFields['SECONDS'])
		)
		{
			$arFields['SOURCE'] = CTaskElapsedItem::SOURCE_MANUAL;
		}

		$update = array();
		if (array_key_exists("CREATED_DATE", $arFields))
			$update["CREATED_DATE"] = BitrixMainTypeDateTime::createFromUserTime($arFields['CREATED_DATE']);
		if (array_key_exists("DATE_START", $arFields))
			$update["DATE_START"] = BitrixMainTypeDateTime::createFromUserTime($arFields['DATE_START']);
		if (array_key_exists("DATE_STOP", $arFields))
			$update["DATE_STOP"] = BitrixMainTypeDateTime::createFromUserTime($arFields['DATE_STOP']);
		if (array_key_exists("USER_ID", $arFields))
			$update["USER_ID"] = $arFields['USER_ID'];
		if (array_key_exists("TASK_ID", $arFields))
			$update["TASK_ID"] = $arFields['TASK_ID'];
		if (array_key_exists("MINUTES", $arFields))
			$update["MINUTES"] = $arFields['MINUTES'];
		if (array_key_exists("SECONDS", $arFields))
			$update["SECONDS"] = $arFields['SECONDS'];
		if (array_key_exists("SOURCE", $arFields))
			$update["SOURCE"] = $arFields['SOURCE'];
		if (array_key_exists("COMMENT_TEXT", $arFields))
			$update["COMMENT_TEXT"] = $arFields['COMMENT_TEXT'];
		$updateResult = BitrixTasksInternalsTaskElapsedTimeTable::update($ID, $update);

		$occurAsUserId = CTasksTools::getOccurAsUserId();
		if ( ! $occurAsUserId )
			$occurAsUserId = ($executiveUserId ? $executiveUserId : 1);

		$oLog = new CTaskLog();
		$oLog->Add(array(
			'TASK_ID'       =>  $taskId,
			'USER_ID'       =>  $occurAsUserId,
			'~CREATED_DATE' =>  $DB->currentTimeFunction(),
			'FIELD'         => 'TIME_SPENT_IN_LOGS',
			'FROM_VALUE'    =>  $curDuration,
			'TO_VALUE'      =>  $curDuration - (int) $arUpdatingLogItem['SECONDS'] + (int) $arFields['SECONDS']
		));

		foreach(GetModuleEvents('tasks', 'OnTaskElapsedTimeUpdate', true) as $arEvent)
			ExecuteModuleEventEx($arEvent, array($ID, $arFields));

		return $updateResult;
	}

	return false;
}