- Модуль: tasks
- Путь к файлу: ~/bitrix/modules/tasks/lib/comments/task.php
- Класс: BitrixTasksCommentsTask
- Вызов: Task::getNewCommentsCountForTasks
static function getNewCommentsCountForTasks(array $taskIds, int $userId): array
{
if (empty($taskIds) || !Forum::includeModule())
{
return [];
}
$query = (new Query(TaskTable::class))
->setSelect([
'TASK_ID' => 'ID',
new ExpressionField('CNT', 'COUNT(DISTINCT %s)', 'FM.ID'),
])
->registerRuntimeField('TV', new ReferenceField(
'TV',
ViewedTable::getEntity(),
Join::on('this.ID', 'ref.TASK_ID')->where('ref.USER_ID', $userId),
['join_type' => 'left']
))
->registerRuntimeField('FM', new ReferenceField(
'FM',
MessageTable::getEntity(),
Join::on('this.FORUM_TOPIC_ID', 'ref.TOPIC_ID'),
['join_type' => 'inner']
))
->whereIn('ID', $taskIds)
->where(
Query::filter()
->logic('or')
->where(
Query::filter()
->whereNotNull('TV.VIEWED_DATE')
->whereColumn('FM.POST_DATE', '>', 'TV.VIEWED_DATE')
)
->where(
Query::filter()
->whereNull('TV.VIEWED_DATE')
->whereColumn('FM.POST_DATE', '>=', 'CREATED_DATE')
)
)
->where('FM.NEW_TOPIC', 'N')
->where(
Query::filter()
->logic('or')
->where(
Query::filter()
->where('FM.AUTHOR_ID', '<>', $userId)
->where(
Query::filter()
->logic('or')
->whereNull('FM.UF_TASK_COMMENT_TYPE')
->where('FM.UF_TASK_COMMENT_TYPE', '<>', InternalsComment::TYPE_EXPIRED)
)
)
->where('FM.UF_TASK_COMMENT_TYPE', InternalsComment::TYPE_EXPIRED_SOON)
)
;
$startCounterDate = COption::GetOptionString("tasks", "tasksDropCommentCounters", null);
if ($startCounterDate)
{
$query->where('FM.POST_DATE', '>', new DateTime($startCounterDate, 'Y-m-d H:i:s'));
}
$newComments = array_fill_keys($taskIds, 0);
$newCommentsResult = $query->exec();
while ($row = $newCommentsResult->fetch())
{
$newComments[$row['TASK_ID']] = (int)$row['CNT'];
}
return $newComments;
}