private function newEntity($params) { // Create Sprint // Load release $projectRelease = $this->manager->getRepository('NeblionScrumBundle:ProjectRelease')->find($params['release']); $entity = new Sprint(); $entity->setName($params['name']); $entity->setDescription($params['name'] . ' description'); $entity->setStart($params['start']); $entity->setEnd($params['end']); $entity->setVelocity($params['velocity']); $entity->setStatus($params['status']); $entity->setProjectRelease($projectRelease); $this->manager->persist($entity); }
/** * Creates a new Sprint entity. * * @Route("/{id}/create/{story}", name="sprint_create") * @Method("post") * @Template("NeblionScrumBundle:Sprint:new.html.twig") */ public function createAction($id, $story) { // Check if user is authorized if (!$this->get('security.context')->isGranted('IS_AUTHENTICATED_REMEMBERED')) { throw new AccessDeniedException(); } $user = $this->get('security.context')->getToken()->getUser(); $em = $this->getDoctrine()->getManager(); // Load current project $project = $em->getRepository('NeblionScrumBundle:Project')->find($id); if (!$project) { throw $this->createNotFoundException('Unable to find Project entity.'); } // Check if user is really a member of this project $member = $em->getRepository('NeblionScrumBundle:Member')->isMemberOfProject($user->getId(), $project->getId()); if (!$member or !in_array($member->getRole()->getId(), array(1, 2))) { throw new AccessDeniedException(); } // Check if there is already a current sprint if ($em->getRepository('NeblionScrumBundle:Sprint')->getCurrentForProject($project->getId())) { // Set flash message $this->get('session')->getFlashBag()->add('error', 'There is already a current sprint for this project!'); return $this->redirect($this->generateUrl('project_backlog', array('id' => $project->getId()))); } // Load the last story for sprint $lastStory = $em->getRepository('NeblionScrumBundle:Story')->find($story); if (!$lastStory) { throw $this->createNotFoundException('Unable to find Story entity.'); } // Check if this story belongs to project if ($lastStory->getProject() != $project) { // Set flash message $this->get('session')->getFlashBag()->add('error', 'Story was not belong to this project!'); return $this->redirect($this->generateUrl('project_backlog', array('id' => $project->getId()))); } // Load default sprint status $status = $em->getRepository('NeblionScrumBundle:ProcessStatus')->find(1); // Load the current release $projectRelease = $em->getRepository('NeblionScrumBundle:ProjectRelease')->getCurrentForProject($project->getId()); // If there is no current release, create a default one if (!$projectRelease) { // Load in progress status $inProgress = $em->getRepository('NeblionScrumBundle:ProcessStatus')->find(2); $projectRelease = new \Neblion\ScrumBundle\Entity\ProjectRelease(); $projectRelease->setName('Default'); $projectRelease->setDescription('Default release'); $projectRelease->setProject($project); $projectRelease->setStatus($inProgress); $projectRelease->setStart(new \DateTime()); $em->persist($projectRelease); } $stories = $em->getRepository('NeblionScrumBundle:Story')->getBeforePositionForProject($project->getId(), $lastStory->getPosition()); $estimate = 0; foreach ($stories as $story) { if ($story->getEstimate() == 0) { // Set flash message $this->get('session')->getFlashBag()->add('error', 'You could not start this sprint, a story was not estimated!'); return $this->redirect($this->generateUrl('project_backlog', array('id' => $project->getId()))); } $estimate += $story->getEstimate(); } // Look for sprint date $start = $em->getRepository('NeblionScrumBundle:Sprint')->getStartOfNextSprint($project->getId(), $this->container->getParameter('sprint_duration')); $end = new \DateTime($start->format('Y-m-d')); $end->modify('+' . $this->container->getParameter('sprint_duration') . ' day'); $entity = new Sprint(); $entity->setStatus($status); $entity->setProjectRelease($projectRelease); $entity->setStart($start); $entity->setEnd($end); $entity->setVelocity(0); $form = $this->createForm(new SprintType(), $entity); $request = $this->getRequest(); $form->bindRequest($request); if ($form->isValid()) { $em->persist($entity); // Affect story to this new sprint foreach ($stories as $story) { $story->setSprint($entity); } // update sort order for the backlog stories $backlogStories = $em->getRepository('NeblionScrumBundle:Story')->getAfterPositionForProject($project->getId(), $lastStory->getPosition(), false); $position = 1; foreach ($backlogStories as $story) { $story->setPosition($position); $position++; } // store activity $this->get('scrum_activity')->add($project, $user, 'created sprint', $this->generateUrl('sprint_list', array('id' => $project->getId())), $entity->getName()); $em->flush(); // Set flash message $this->get('session')->getFlashBag()->add('success', 'Sprint was created successfully!'); return $this->redirect($this->generateUrl('sprint_list', array('id' => $project->getId()))); } return array('project' => $project, 'entity' => $entity, 'form' => $form->createView(), 'estimate' => $estimate, 'count' => count($stories), 'lastStory' => $lastStory->getId()); }