• Модуль: tasks
  • Путь к файлу: ~/bitrix/modules/tasks/lib/scrum/service/taskservice.php
  • Класс: BitrixTasksScrumServiceTaskService
  • Вызов: TaskService::onAfterTaskUpdate
static function onAfterTaskUpdate(int $taskId, array &$fields, array &$previousFields)
{
	if (!Loader::includeModule('socialnetwork'))
	{
		return;
	}

	$newGroupId = (int) ($fields['GROUP_ID'] ?? null);
	$previousGroupId = (int) ($previousFields['GROUP_ID'] ?? null);

	$isGroupUpdateAction = ($newGroupId > 0 && $newGroupId !== $previousGroupId);

	if ($isGroupUpdateAction)
	{
		$newGroupIsScrum = false;
		$newGroup = Workgroup::getById($newGroupId);
		if ($newGroup && $newGroup->isScrumProject())
		{
			$newGroupIsScrum = true;
		}

		$previousGroupIsScrum = false;
		$previousGroup = Workgroup::getById($previousGroupId);
		if ($previousGroup && $previousGroup->isScrumProject())
		{
			$previousGroupIsScrum = true;
		}

		if (!$newGroupIsScrum)
		{
			if ($previousGroupIsScrum)
			{
				(new CacheService($taskId, CacheService::ITEM_TASKS))->clean();

				self::deleteScrumItem($taskId);
			}

			return;
		}
	}

	$currentGroupId = $newGroupId ?: $previousGroupId;

	$groupIsScrum = false;
	$group = Workgroup::getById($currentGroupId);
	if ($group && $group->isScrumProject())
	{
		$groupIsScrum = true;
	}
	if (!$groupIsScrum)
	{
		return;
	}

	$newParentId = (int) ($fields['PARENT_ID'] ?? null);
	$oldParentId = (int) ($previousFields['PARENT_ID'] ?? null);

	if ($isGroupUpdateAction)
	{
		$itemService = new ItemService();
		$scrumItem = $itemService->getItemBySourceId($taskId);
		if ($scrumItem->isEmpty())
		{
			self::createScrumItem($taskId, $fields, $previousFields);
		}
		else
		{
			$previousFieldsPart = [];
			if ($previousGroupId && $newGroupId && $newGroupId !== $previousGroupId)
			{
				$previousFieldsPart = ['GROUP_ID' => $newGroupId];
			}
			if ($oldParentId && $newParentId && $newParentId !== $oldParentId)
			{
				$previousFieldsPart['PARENT_ID'] = $newParentId;
			}

			self::updateScrumItem($taskId, array_merge($previousFields, $previousFieldsPart));
		}
	}

	$hasLinks = (isset($fields['DEPENDS_ON']) && is_array($fields['DEPENDS_ON']));
	$hasPrevLinks = (isset($previousFields['DEPENDS_ON']) && is_array($previousFields['DEPENDS_ON']));
	if ($hasLinks)
	{
		$taskService = new TaskService(UtilUser::getId());

		foreach ($fields['DEPENDS_ON'] as $linkedTaskId)
		{
			$taskService->updateTaskLinks($linkedTaskId, $taskId);
		}

		if ($hasPrevLinks)
		{
			foreach (array_diff($previousFields['DEPENDS_ON'], $fields['DEPENDS_ON']) as $linkedTaskId)
			{
				$taskDependence = new CTaskDependence();

				$taskDependence->delete($linkedTaskId, $taskId);
			}
		}
	}

	$isScrumFieldsUpdated = (
		(isset($fields['TITLE']) && $fields['TITLE'] !== $previousFields['TITLE'])
		|| (
			isset($fields['TAGS'])
			&& $fields['TAGS'] != $previousFields['TAGS']
		)
		|| (
			isset($fields['RESPONSIBLE_ID'])
			&& $fields['RESPONSIBLE_ID'] != $previousFields['RESPONSIBLE_ID']
		)
		|| (
			isset($fields['UF_TASK_WEBDAV_FILES'])
			&& (array_filter($fields['UF_TASK_WEBDAV_FILES']) != ($previousFields['UF_TASK_WEBDAV_FILES'] ?? null))
		)
	);
	$isCompleteAction = (
		isset($fields['STATUS']) && (int)$fields['STATUS'] === Status::COMPLETED
		&& (isset($previousFields['STATUS']) && (int)$previousFields['STATUS'] !== Status::COMPLETED)
	);

	$isRenewAction = (
		(isset($fields['STATUS']) && (int)$fields['STATUS'] === Status::PENDING)
		&& (
			isset($previousFields['STATUS'])
			&& (
				(int)$previousFields['STATUS'] === Status::COMPLETED
				|| (int)$previousFields['STATUS'] === Status::SUPPOSEDLY_COMPLETED
			)
		)
	);

	$isEpicChangeAction = (($fields['EPIC'] ?? null) !== ($previousFields['EPIC'] ?? null));
	if ($isEpicChangeAction)
	{
		$itemService = new ItemService();
		$pushService = (Loader::includeModule('pull') ? new PushService() : null);

		$scrumItem = $itemService->getItemBySourceId($taskId);
		$scrumItem->setEpicId($fields['EPIC']);

		$itemService->changeItem($scrumItem, $pushService);
	}

	$isParentChangeAction = ($newParentId && $newParentId !== $oldParentId);
	if ($isParentChangeAction)
	{
		$itemService = new ItemService();
		$pushService = (Loader::includeModule('pull') ? new PushService() : null);

		if ($oldParentId)
		{
			$parentItem = $itemService->getItemBySourceId($oldParentId);
			if (!$parentItem->isEmpty())
			{
				$itemService->changeItem($parentItem, $pushService);

				(new CacheService($parentItem->getSourceId(), CacheService::ITEM_TASKS))->clean();
			}
		}

		if ($newParentId)
		{
			$parentItem = $itemService->getItemBySourceId($newParentId);
			if (!$parentItem->isEmpty())
			{
				$itemService->changeItem($parentItem, $pushService);

				(new CacheService($parentItem->getSourceId(), CacheService::ITEM_TASKS))->clean();
			}
		}

		$itemService->changeItem($itemService->getItemBySourceId($taskId), $pushService);
	}

	if (($isScrumFieldsUpdated || $isCompleteAction || $isRenewAction) && !$isParentChangeAction)
	{
		$itemService = new ItemService();
		$pushService = (Loader::includeModule('pull') ? new PushService() : null);
		$itemService->changeItem($itemService->getItemBySourceId($taskId), $pushService);
	}

	if ($isRenewAction)
	{
		if ($oldParentId && self::isTaskInActiveSprint($oldParentId, $currentGroupId))
		{
			if (!self::isTaskInActiveSprint($taskId, $currentGroupId))
			{
				self::moveTaskToActiveSprint($taskId, $currentGroupId);
			}

			$itemService = new ItemService();

			$item = $itemService->getItemBySourceId($taskId);
			$parentItem = $itemService->getItemBySourceId($oldParentId);
			if (!$item->isEmpty() && !$parentItem->isEmpty())
			{
				$entityService = new EntityService();
				$parentEntity = $entityService->getEntityById($parentItem->getEntityId());
				if ($parentEntity->getGroupId() === $currentGroupId)
				{
					$kanbanService = new KanbanService();
					if ($kanbanService->isTaskInFinishStatus($parentEntity->getId(), $taskId))
					{
						$kanbanService->addTaskToNewStatus($parentEntity->getId(), $taskId);
					}

					$parentItem->getInfo()->setVisibilitySubtasks('Y');

					$itemService->changeItem($parentItem);
				}
			}
		}
		else
		{
			self::moveTaskToBacklog($taskId, $currentGroupId);
		}
	}

	if ($isCompleteAction)
	{
		self::moveTaskToFinishStatus($taskId, $currentGroupId);
	}

	(new CacheService($taskId, CacheService::ITEM_TASKS))->clean();
}