• Модуль: tasks
  • Путь к файлу: ~/bitrix/modules/tasks/lib/scrum/service/sprintservice.php
  • Класс: BitrixTasksScrumServiceSprintService
  • Вызов: SprintService::startSprint
public function startSprint(
	EntityForm $sprint,
	TaskService $taskService,
	KanbanService $kanbanService,
	ItemService $itemService,
	BacklogService $backlogService,
	RobotService $robotService = null,
	PushService $pushService = null
): EntityForm
{
	try
	{
		$sprint->setStatus(EntityForm::SPRINT_ACTIVE);
		$sprint->setSort(0);

		$activeSprint = $this->getActiveSprintByGroupId($sprint->getGroupId());
		if (!$activeSprint->isEmpty())
		{
			$this->errorCollection->setError(
				new Error(Loc::getMessage('TASKS_SCRUM_SPRINT_START_ALREADY_ERROR'))
			);

			return $sprint;
		}

		$lastSprintId = $kanbanService->getLastCompletedSprintIdSameGroup($sprint->getId());
		if (!$kanbanService->hasSprintStages($sprint->getId()))
		{
			$kanbanService->createSprintStages($sprint->getId(), $lastSprintId);
		}
		if ($kanbanService->getErrors())
		{
			$this->errorCollection->add($kanbanService->getErrors());

			return $sprint;
		}

		$allTaskIds = $itemService->getTaskIdsByEntityId($sprint->getId());

		$backlog = $backlogService->getBacklogByGroupId($sprint->getGroupId());

		$taskIds = [];
		$completedTaskIds = [];
		foreach ($allTaskIds as $taskId)
		{
			if ($taskService->isCompletedTask($taskId))
			{
				$completedTaskIds[] = $taskId;
			}
			else
			{
				$taskIds[] = $taskId;
			}
		}

		$completedSubTaskIds = [];
		foreach ($completedTaskIds as $taskId)
		{
			$completedSubTaskIds = array_merge(
				$completedSubTaskIds,
				$taskService->getSubTaskIds($sprint->getGroupId(), $taskId)
			);
		}
		$completedTaskIds = array_merge($completedTaskIds, $completedSubTaskIds);

		$itemIds = $itemService->getItemIdsBySourceIds($completedTaskIds, [$sprint->getId()]);
		if (!$itemService->getErrors())
		{
			$itemService->moveItemsToEntity($itemIds, $backlog->getId(), $pushService);
		}

		$subTaskIds = [];
		foreach ($taskIds as $taskId)
		{
			$subTaskIds = array_merge(
				$subTaskIds,
				$taskService->getSubTaskIds($sprint->getGroupId(), $taskId)
			);
		}
		if ($taskService->getErrors())
		{
			$this->errorCollection->add($taskService->getErrors());

			return $sprint;
		}

		if (empty($taskIds))
		{
			$this->errorCollection->setError(
				new Error(Loc::getMessage('TASKS_SCRUM_SPRINT_START_NOT_TASKS_ERROR'))
			);

			return $sprint;
		}

		$kanbanService->addTasksToKanban(
			$sprint->getId(),
			array_unique(array_merge($taskIds, $subTaskIds)),
			$lastSprintId
		);
		if ($kanbanService->getErrors())
		{
			$this->errorCollection->add($kanbanService->getErrors());

			return $sprint;
		}

		if ($lastSprintId && $robotService)
		{
			$stageIdsMap = $kanbanService->getStageIdsMapBetweenTwoSprints(
				$sprint->getId(),
				$lastSprintId
			);
			if ($stageIdsMap)
			{
				$robotService->updateRobotsOfLastSprint($sprint->getGroupId(), $stageIdsMap);
			}

			if ($robotService->getErrors())
			{
				$this->errorCollection->add($robotService->getErrors());

				return $sprint;
			}
		}

		$result = EntityTable::update($sprint->getId(), $sprint->getFieldsToUpdateEntity());

		if ($result->isSuccess())
		{
			if ($pushService)
			{
				$pushService->sendUpdateSprintEvent($sprint);
			}
		}
		else
		{
			$this->errorCollection->setError(
				new Error(
					implode('; ', $result->getErrorMessages()),
					self::ERROR_COULD_NOT_START_SPRINT
				)
			);
		}
	}
	catch (Exception $exception)
	{
		$this->errorCollection->setError(
			new Error($exception->getMessage(), self::ERROR_COULD_NOT_START_SPRINT)
		);
	}

	return $sprint;
}