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