- Модуль: tasks
- Путь к файлу: ~/bitrix/modules/tasks/lib/util/notification/task.php
- Класс: BitrixTasksUtilNotificationTask
- Вызов: Task::getOverdueTasks
static function getOverdueTasks(): array
{
$query = new Query(TaskTable::getEntity());
$query->setSelect([
'ID',
'TITLE',
'DESCRIPTION',
'DEADLINE',
'STATUS',
'TM_USER_ID' => 'TM.USER_ID',
'TM_TYPE' => 'TM.TYPE',
]);
$query->setFilter([
'!DEADLINE' => null,
'>=DEADLINE' => static::getDayStartDateTime(), // day start
'<=DEADLINE' => new DateTime(), // current time
'=STATUS' => [Status::PENDING, Status::IN_PROGRESS],
]);
$query->registerRuntimeField('', new ReferenceField(
'TM',
MemberTable::getEntity(),
['=ref.TASK_ID' => 'this.ID']
));
Runtime::apply($query, [IMInternalsRunTime::applyChatNotExist()]);
$res = $query->exec();
$tasks = [];
$uniqueMembers = [];
while ($item = $res->fetch())
{
$taskId = $item['ID'];
$userId = $item['TM_USER_ID'];
$userType = $item['TM_TYPE'];
unset($item['TM_USER_ID'], $item['TM_TYPE']);
if (!array_key_exists($taskId, $tasks))
{
$item['SE_MEMBER'][$userId] = ['USER_ID' => $userId, 'TYPE' => $userType];
$tasks[$taskId] = $item;
}
else
{
$tasks[$taskId]['SE_MEMBER'][$userId] = ['USER_ID' => $userId, 'TYPE' => $userType];
}
if (!array_key_exists($taskId, $uniqueMembers))
{
$uniqueMembers[$taskId] = [];
}
if (!array_key_exists($userId, $uniqueMembers[$taskId]))
{
$uniqueMembers[$taskId][$userId] = 1;
}
$roleMap = ['O' => 'CREATED_BY', 'R' => 'RESPONSIBLE_ID'];
if (array_key_exists($userType, $roleMap))
{
$tasks[$taskId][$roleMap[$userType]] = $userId;
}
}
return array_filter(
$tasks,
static function($item) use($uniqueMembers)
{
return count($uniqueMembers[$item['ID']]) > 1;
}
);
}