• Модуль: 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;
		}
	);
}