Esempio n. 1
0
 /**
  * Creates a new Project entity.
  *
  * @Route("/create", name="project_create")
  * @Method("post")
  * @Template("NeblionScrumBundle:Project:new.html.twig")
  */
 public function createAction()
 {
     $entity = new Project();
     $request = $this->getRequest();
     $form = $this->createForm(new ProjectType($this->get('translator')), $entity);
     $form->bindRequest($request);
     if ($form->isValid()) {
         // Get the current user
         $user = $this->get('security.context')->getToken()->getUser();
         $em = $this->getDoctrine()->getManager();
         // Create project
         $em->persist($entity);
         // Create member
         // Add current user to new team and set him admin role
         $status = $em->getRepository('NeblionScrumBundle:MemberStatus')->find(2);
         $role = $em->getRepository('NeblionScrumBundle:Role')->find(1);
         $member = new \Neblion\ScrumBundle\Entity\Member();
         $member->setProject($entity);
         $member->setStatus($status);
         $member->setAccount($user);
         $member->setRole($role);
         $member->setAdmin(true);
         $em->persist($member);
         // Create a default release
         $releaseStatus = $em->getRepository('NeblionScrumBundle:ProcessStatus')->find(2);
         $release = new \Neblion\ScrumBundle\Entity\ProjectRelease();
         $release->setProject($entity);
         $release->setStatus($releaseStatus);
         $release->setName('Default');
         $release->setDescription('Default release');
         $release->setStart(new \DateTime());
         $em->persist($release);
         // Create a default feature
         $feature = new \Neblion\ScrumBundle\Entity\Feature();
         $feature->setProject($entity);
         $feature->setName('Default');
         $feature->setDescription('Default feature');
         $feature->setColor('#ffffff');
         $em->persist($feature);
         if ($entity->getIsPublic()) {
             // store activity
             $this->get('scrum_activity')->add($entity, $user, 'create project ' . $entity->getName(), $this->generateUrl('project_search') . '?query=' . $entity->getName(), 'Project ' . $entity->getName());
         }
         $em->flush();
         // Set flash message
         $this->get('session')->getFlashBag()->add('success', 'Project was successfully created!');
         return $this->redirect($this->generateUrl('project_edit', array('id' => $entity->getId())));
     }
     return array('entity' => $entity, 'form' => $form->createView());
 }
Esempio n. 2
0
 /**
  * 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());
 }