• Модуль: tasks
  • Путь к файлу: ~/bitrix/modules/tasks/lib/rest/controllers/scrum/sprint.php
  • Класс: BitrixTasksRestControllersScrumSprint
  • Вызов: Sprint::updateAction
public function updateAction(int $id, array $fields)
{
	$id = (int) $id;
	if (!$id)
	{
		$this->errorCollection->add([new Error('Sprint id not found')]);

		return null;
	}

	$entityService = new EntityService();
	$sprint = $entityService->getEntityById($id);

	if (!$sprint->getId())
	{
		$this->errorCollection->add([new Error('Sprint not found')]);

		return null;
	}

	if ($sprint->getEntityType() !== EntityForm::SPRINT_TYPE)
	{
		$this->errorCollection->add([new Error('Sprint not found')]);

		return null;
	}

	if (!$this->checkAccess($sprint->getGroupId()))
	{
		$this->errorCollection->add([new Error('Access denied')]);

		return null;
	}

	if (array_key_exists('groupId', $fields) && is_numeric($fields['groupId']))
	{
		$groupId = (int) $fields['groupId'];
		$itemService = new ItemService();

		$isGroupUpdatingAction = ($sprint->getGroupId() !== $groupId);
		$hasSprintItems = (!empty($itemService->getItemIdsByEntityId($sprint->getId())));

		if ($isGroupUpdatingAction && $hasSprintItems)
		{
			$this->errorCollection->add([new Error('It is forbidden move a sprint with items')]);

			return null;
		}

		$sprint->setGroupId($groupId);
	}

	if (array_key_exists('name', $fields) && is_string($fields['name']))
	{
		$sprint->setName($fields['name']);
	}

	if (array_key_exists('sort', $fields) && is_numeric($fields['sort']))
	{
		$sprint->setSort((int) $fields['sort']);
	}

	if (array_key_exists('createdBy', $fields) && is_numeric($fields['createdBy']))
	{
		$createdBy = (int) $fields['createdBy'];
		if (!$this->existsUser($createdBy))
		{
			$this->errorCollection->add([new Error('createdBy user not found')]);

			return null;
		}

		$sprint->setCreatedBy($createdBy);
	}

	$modifiedBy = 0;
	if (array_key_exists('modifiedBy', $fields) && is_numeric($fields['modifiedBy']))
	{
		$modifiedBy = (int) $fields['modifiedBy'];
		if (!$this->existsUser($modifiedBy))
		{
			$this->errorCollection->add([new Error('modifiedBy user not found')]);

			return null;
		}
	}
	$sprint->setModifiedBy($modifiedBy ?? $this->getUserId());

	if (array_key_exists('dateStart', $fields))
	{
		$dateStart = $this->formatDateField($fields['dateStart']);

		if ($dateStart === false)
		{
			$this->errorCollection->add([new Error('Incorrect dateStart format')]);

			return null;
		}

		$sprint->setDateStart(DateTime::createFromTimestamp($dateStart));
	}

	if (array_key_exists('dateEnd', $fields))
	{
		$dateEnd = $this->formatDateField($fields['dateEnd']);

		if ($dateEnd === false)
		{
			$this->errorCollection->add([new Error('Incorrect dateEnd format')]);

			return null;
		}

		$sprint->setDateEnd(DateTime::createFromTimestamp($dateEnd));
	}

	$sprintService = new SprintService();

	if (array_key_exists('status', $fields) && is_string($fields['status']))
	{
		$availableStatuses = [
			EntityForm::SPRINT_ACTIVE,
			EntityForm::SPRINT_PLANNED,
			EntityForm::SPRINT_COMPLETED,
		];
		if (!in_array($fields['status'], $availableStatuses, true))
		{
			$this->errorCollection->add([new Error('Incorrect sprint status')]);

			return null;
		}

		$sprint->setStatus($fields['status']);

		$activeSprint = $sprintService->getActiveSprintByGroupId($sprint->getGroupId());
		if (!$activeSprint->isEmpty() && $sprint->isActiveSprint())
		{
			$this->errorCollection->add([new Error('Unable to add two active sprint')]);

			return null;
		}
	}

	if (!$sprintService->changeSprint($sprint))
	{
		$this->errorCollection->add([new Error('Sprint not updated')]);

		return null;
	}

	$sprint = $sprintService->getSprintById($sprint->getId());

	return $sprint->toArray();
}