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;
}