• Модуль: tasks
  • Путь к файлу: ~/bitrix/modules/tasks/lib/provider/taskprovider.php
  • Класс: BitrixTasksProviderTaskProvider
  • Вызов: TaskProvider::makeArFields
private function makeArFields(bool $isCount = false): self
{
	$this->arFields = [
		"ID" => "T.ID",
		"TITLE" => "T.TITLE",
		"DESCRIPTION" => "T.DESCRIPTION",
		"DESCRIPTION_IN_BBCODE" => "T.DESCRIPTION_IN_BBCODE",
		"DECLINE_REASON" => "T.DECLINE_REASON",
		"PRIORITY" => "T.PRIORITY",
		// 1) deadline in past, real status is not STATE_SUPPOSEDLY_COMPLETED and not STATE_COMPLETED and (not STATE_DECLINED or responsible is not me (user))
		// 2) viewed by noone(?) and created not by me (user) and (STATE_NEW or STATE_PENDING)
		"STATUS" => "
			CASE
				WHEN
					T.DEADLINE < DATE_ADD(". $this->db->CurrentTimeFunction() .", INTERVAL ".
			CounterDeadline::getDeadlineTimeLimit()." SECOND)
					AND T.DEADLINE >= ". $this->db->CurrentTimeFunction() ."
					AND T.STATUS != '4'
					AND T.STATUS != '5'
					AND (
						T.STATUS != '7'
						OR T.RESPONSIBLE_ID != ". $this->userId ."
					)
				THEN
					'-3'
				WHEN
					T.DEADLINE < ". $this->db->CurrentTimeFunction() ." AND T.STATUS != '4' AND T.STATUS != '5' AND (T.STATUS != '7' OR T.RESPONSIBLE_ID != ". $this->userId .")
				THEN
					'-1'
				WHEN
					TV.USER_ID IS NULL
					AND
					T.CREATED_BY != ". $this->userId ."
					AND
					(T.STATUS = 1 OR T.STATUS = 2)
				THEN
					'-2'
				ELSE
					T.STATUS
			END
		",
		"NOT_VIEWED" => "
			CASE
				WHEN
					TV.USER_ID IS NULL
					AND
					T.CREATED_BY != ". $this->userId ."
					AND
					(T.STATUS = 1 OR T.STATUS = 2)
				THEN
					'Y'
				ELSE
					'N'
			END
		",
		// used in ORDER BY to make completed tasks go after (or before) all other tasks
		"STATUS_COMPLETE" => "
			CASE
				WHEN
					T.STATUS = '5'
				THEN
					'2'
				ELSE
					'1'
				END
		",
		"REAL_STATUS" => "T.STATUS",
		"MULTITASK" => "T.MULTITASK",
		"STAGE_ID" => "T.STAGE_ID",
		"RESPONSIBLE_ID" => "T.RESPONSIBLE_ID",
		"RESPONSIBLE_NAME" => "RU.NAME",
		"RESPONSIBLE_LAST_NAME" => "RU.LAST_NAME",
		"RESPONSIBLE_SECOND_NAME" => "RU.SECOND_NAME",
		"RESPONSIBLE_LOGIN" => "RU.LOGIN",
		"RESPONSIBLE_WORK_POSITION" => "RU.WORK_POSITION",
		"RESPONSIBLE_PHOTO" => "RU.PERSONAL_PHOTO",
		"DATE_START" => $this->db->DateToCharFunction("T.DATE_START", "FULL"),
		"DURATION_FACT" => "(SELECT SUM(TE.MINUTES) FROM b_tasks_elapsed_time TE WHERE TE.TASK_ID = T.ID GROUP BY TE.TASK_ID)",
		"TIME_ESTIMATE" => "T.TIME_ESTIMATE",
		"TIME_SPENT_IN_LOGS" => "(SELECT SUM(TE.SECONDS) FROM b_tasks_elapsed_time TE WHERE TE.TASK_ID = T.ID GROUP BY TE.TASK_ID)",
		"REPLICATE" => "T.REPLICATE",
		"DEADLINE" => $this->db->DateToCharFunction("T.DEADLINE", "FULL"),
		"DEADLINE_ORIG" => "T.DEADLINE",
		"START_DATE_PLAN" => $this->db->DateToCharFunction("T.START_DATE_PLAN", "FULL"),
		"END_DATE_PLAN" => $this->db->DateToCharFunction("T.END_DATE_PLAN", "FULL"),
		"CREATED_BY" => "T.CREATED_BY",
		"CREATED_BY_NAME" => "CU.NAME",
		"CREATED_BY_LAST_NAME" => "CU.LAST_NAME",
		"CREATED_BY_SECOND_NAME" => "CU.SECOND_NAME",
		"CREATED_BY_LOGIN" => "CU.LOGIN",
		"CREATED_BY_WORK_POSITION" => "CU.WORK_POSITION",
		"CREATED_BY_PHOTO" => "CU.PERSONAL_PHOTO",
		"CREATED_DATE" => $this->db->DateToCharFunction("T.CREATED_DATE", "FULL"),
		"CHANGED_BY" => "T.CHANGED_BY",
		"CHANGED_DATE" => $this->db->DateToCharFunction("T.CHANGED_DATE", "FULL"),
		"STATUS_CHANGED_BY" => "T.CHANGED_BY",
		"STATUS_CHANGED_DATE" =>
			'CASE WHEN T.STATUS_CHANGED_DATE IS NULL THEN '
			. $this->db->DateToCharFunction("T.CHANGED_DATE", "FULL")
			. ' ELSE '
			. $this->db->DateToCharFunction("T.STATUS_CHANGED_DATE", "FULL")
			. ' END ',
		"CLOSED_BY" => "T.CLOSED_BY",
		"CLOSED_DATE" => $this->db->DateToCharFunction("T.CLOSED_DATE", "FULL"),
		"ACTIVITY_DATE" => $this->db->DateToCharFunction("T.ACTIVITY_DATE", "FULL"),
		'GUID' => 'T.GUID',
		"XML_ID" => "T.XML_ID",
		"MARK" => "T.MARK",
		"ALLOW_CHANGE_DEADLINE" => "T.ALLOW_CHANGE_DEADLINE",
		"ALLOW_TIME_TRACKING" => 'T.ALLOW_TIME_TRACKING',
		"MATCH_WORK_TIME" => "T.MATCH_WORK_TIME",
		"TASK_CONTROL" => "T.TASK_CONTROL",
		"ADD_IN_REPORT" => "T.ADD_IN_REPORT",
		"GROUP_ID" => "CASE WHEN T.GROUP_ID IS NULL THEN 0 ELSE T.GROUP_ID END",
		"FORUM_TOPIC_ID" => "T.FORUM_TOPIC_ID",
		"PARENT_ID" => "T.PARENT_ID",
		"COMMENTS_COUNT" => "FT.POSTS",
		"SERVICE_COMMENTS_COUNT" => "FT.POSTS_SERVICE",
		"FORUM_ID" => "FT.FORUM_ID",
		"MESSAGE_ID" => "MIN(TSIF.MESSAGE_ID)",
		"SITE_ID" => "T.SITE_ID",
		"SUBORDINATE" => ($strSql = CTasks::GetSubordinateSql('', $this->arParams)) ? "CASE WHEN EXISTS(".$strSql.") THEN 'Y' ELSE 'N' END" : "'N'",
		"EXCHANGE_MODIFIED" => "T.EXCHANGE_MODIFIED",
		"EXCHANGE_ID" => "T.EXCHANGE_ID",
		"OUTLOOK_VERSION" => "T.OUTLOOK_VERSION",
		"VIEWED_DATE" => $this->db->DateToCharFunction("TV.VIEWED_DATE", "FULL"),
		"DEADLINE_COUNTED" => "T.DEADLINE_COUNTED",
		"FORKED_BY_TEMPLATE_ID" => "T.FORKED_BY_TEMPLATE_ID",

		"FAVORITE" => "CASE WHEN FVT.TASK_ID IS NULL THEN 'N' ELSE 'Y' END",
		"SORTING" => "SRT.SORT",

		"DURATION_PLAN_SECONDS" => "T.DURATION_PLAN",
		"DURATION_TYPE_ALL" => "T.DURATION_TYPE",

		"DURATION_PLAN" => "
			case
				when
					T.DURATION_TYPE = '".TimeUnitType::MINUTE."' or T.DURATION_TYPE = '".TimeUnitType::HOUR."'
				then
					ROUND(T.DURATION_PLAN / 3600, 0)
				when
					T.DURATION_TYPE = '".TimeUnitType::DAY."' or T.DURATION_TYPE = '' or T.DURATION_TYPE is null
				then
					ROUND(T.DURATION_PLAN / 86400, 0)
				else
					T.DURATION_PLAN
			end
		",
		"DURATION_TYPE" => "
			case
				when
					T.DURATION_TYPE = '".TimeUnitType::MINUTE."'
				then
					'".TimeUnitType::HOUR."'
				else
					T.DURATION_TYPE
			end
		",
		"SCENARIO_NAME" => "SCR.SCENARIO",
	];

	if ($this->userId)
	{
		$this->arFields['IS_MUTED'] = UserOption::getSelectSql($this->userId, UserOptionOption::MUTED);
		$this->arFields['IS_PINNED'] = UserOption::getSelectSql($this->userId, UserOptionOption::PINNED);
		$this->arFields['IS_PINNED_IN_GROUP'] = UserOption::getSelectSql($this->userId, UserOptionOption::PINNED_IN_GROUP);
	}

	return $this;
}