• Модуль: tasks
  • Путь к файлу: ~/bitrix/modules/tasks/lib/internals/counter/event/projecteventprocessor.php
  • Класс: BitrixTasksInternalsCounterEventProjectEventProcessor
  • Вызов: ProjectEventProcessor::process
public function process(): void
{
	if (!Counter::isSonetEnable())
	{
		return;
	}

	$originData = $this->getResourceCollection()->getOrigin();
	$updatedData = $this->getResourceCollection()->getModified();

	$events = (EventCollection::getInstance())->list();

	$recountExpired = [];
	$recountComments = [];
	$projectPermUpdated = [];
	$pushList = [];
	$personalPush = [];

	foreach ($events as $event)
	{
		if (in_array($event, [
			EventDictionary::EVENT_TASK_EXPIRED_SOON
		]))
		{
			continue;
		}

		/* @var $event Event */
		$eventType = $event->getType();
		$taskId = $event->getTaskId();
		$groupId = $event->getGroupId();

		switch ($eventType)
		{
			case EventDictionary::EVENT_AFTER_PROJECT_READ_ALL:
				(new CounterController($event->getUserId()))->readProject($groupId);
				$pushList[] = [
					'EVENT' => $eventType,
					'USER_ID' => $event->getUserId(),
				];
				$personalPush[] = $event->getUserId();
				break;

			case EventDictionary::EVENT_AFTER_SCRUM_READ_ALL:
				(new CounterController($event->getUserId()))->readScrum($groupId);
				$pushList[] = [
					'EVENT' => $eventType,
					'USER_ID' => $event->getUserId(),
				];
				$personalPush[] = $event->getUserId();
				break;

			case EventDictionary::EVENT_PROJECT_DELETE:
				CounterController::reset(0, [CounterDictionary::COUNTER_GROUP_EXPIRED, CounterDictionary::COUNTER_GROUP_COMMENTS], [], [$groupId]);
				break;

			case EventDictionary::EVENT_PROJECT_USER_DELETE:
				CounterController::reset($event->getUserId(), [CounterDictionary::COUNTER_GROUP_EXPIRED, CounterDictionary::COUNTER_GROUP_COMMENTS], [], [$groupId]);
				break;

			case EventDictionary::EVENT_AFTER_TASK_VIEW:
				(new CounterController($event->getUserId()))->recount(CounterDictionary::COUNTER_GROUP_COMMENTS, [$taskId]);
				break;

			case EventDictionary::EVENT_PROJECT_USER_ADD:
				(new CounterController($event->getUserId()))->recount(CounterDictionary::COUNTER_GROUP_EXPIRED, [], [$groupId]);
				(new CounterController($event->getUserId()))->recount(CounterDictionary::COUNTER_GROUP_COMMENTS, [], [$groupId]);
				break;

			case EventDictionary::EVENT_PROJECT_USER_UPDATE:
				(new CounterController($event->getUserId()))->recount(CounterDictionary::COUNTER_GROUP_EXPIRED, [], [$groupId]);
				(new CounterController($event->getUserId()))->recount(CounterDictionary::COUNTER_GROUP_COMMENTS, [], [$groupId]);
				break;

			case EventDictionary::EVENT_PROJECT_PERM_UPDATE:
				$projectPermUpdated[] = $event->getData()['FEATURE_PERM'];
				break;

			case EventDictionary::EVENT_AFTER_TASK_ADD:
			case EventDictionary::EVENT_AFTER_TASK_RESTORE:
			case EventDictionary::EVENT_AFTER_TASK_UPDATE:
			case EventDictionary::EVENT_AFTER_TASK_DELETE:
				$recountExpired[] = $taskId;
				$recountComments[] = $taskId;
				break;

			case EventDictionary::EVENT_AFTER_COMMENT_ADD:
			case EventDictionary::EVENT_AFTER_COMMENT_DELETE:
				$recountComments[] = $taskId;
				break;

			case EventDictionary::EVENT_TASK_EXPIRED:
				$recountExpired[] = $taskId;
				break;

		}

		$groupEventsForUsers = [
			EventDictionary::EVENT_PROJECT_USER_ADD,
			EventDictionary::EVENT_PROJECT_USER_UPDATE,
			EventDictionary::EVENT_PROJECT_USER_DELETE,
			EventDictionary::EVENT_AFTER_COMMENTS_READ_ALL,
			EventDictionary::EVENT_AFTER_PROJECT_READ_ALL,
			EventDictionary::EVENT_AFTER_SCRUM_READ_ALL,
		];
		$taskEventsForUsers = [
			EventDictionary::EVENT_AFTER_TASK_MUTE,
			EventDictionary::EVENT_AFTER_TASK_VIEW,
		];
		$taskUpdatedEvents = [
			EventDictionary::EVENT_AFTER_TASK_ADD,
			EventDictionary::EVENT_AFTER_TASK_RESTORE,
			EventDictionary::EVENT_AFTER_TASK_UPDATE,
			EventDictionary::EVENT_AFTER_TASK_DELETE,
		];

		if (in_array($eventType, $taskUpdatedEvents, true))
		{
			if (
				array_key_exists($taskId, $originData)
				&& $originData[$taskId]->getGroupId()
			)
			{
				$pushList[] = [
					'EVENT' => $eventType,
					'GROUP_ID' => $originData[$taskId]->getGroupId(),
				];
			}
			if (
				array_key_exists($taskId, $updatedData)
				&& $updatedData[$taskId]->getGroupId()
			)
			{
				$pushList[] = [
					'EVENT' => $eventType,
					'GROUP_ID' => $updatedData[$taskId]->getGroupId(),
				];
			}
		}
		elseif (in_array($eventType, $groupEventsForUsers, true))
		{
			$pushList[] = [
				'EVENT' => $eventType,
				'USER_IDS' => [$event->getUserId()],
				'GROUP_ID' => $groupId,
			];
		}
		elseif ($taskId)
		{
			if (in_array($eventType, $taskEventsForUsers, true))
			{
				$pushList[] = [
					'EVENT' => $eventType,
					'USER_IDS' => [$event->getUserId()],
					'TASK_ID' => $taskId,
				];
				continue;
			}
			$pushList[] = [
				'EVENT' => $eventType,
				'TASK_ID' => $taskId,
			];
		}
		elseif ($groupId)
		{
			$pushList[] = [
				'EVENT' => $eventType,
				'GROUP_ID' => $groupId,
			];
		}
	}

	$counterController = new CounterController();
	if (!empty($recountExpired))
	{
		$counterController->recount(CounterDictionary::COUNTER_GROUP_EXPIRED, array_unique($recountExpired));
	}
	if (!empty($recountComments))
	{
		$counterController->recount(CounterDictionary::COUNTER_GROUP_COMMENTS, array_unique($recountComments));
	}

	$updatedGroups = $this->getGroupByPerms($projectPermUpdated);
	if (!empty($updatedGroups))
	{
		$counterController->recount(CounterDictionary::COUNTER_GROUP_EXPIRED, [], $updatedGroups);
		$counterController->recount(CounterDictionary::COUNTER_GROUP_COMMENTS, [], $updatedGroups);
	}

	foreach ($updatedGroups as $groupId)
	{
		$pushList[] = [
			'EVENT' => EventDictionary::EVENT_PROJECT_PERM_UPDATE,
			'GROUP_ID' => $groupId
		];
	}

	if (!empty($personalPush))
	{
		(new PushSender())->sendUserCounters(array_unique($personalPush));
	}

	if (!empty($pushList))
	{
		(new GroupSender())->send($pushList);
	}
}