protected function execute(InputInterface $input, OutputInterface $output) { set_time_limit(0); ini_set('memory_limit', '-1'); $container = $this->getContainer(); $output->writeln("Looking for active Sprints..."); $em = $container->get('doctrine')->getManager(); //buscamos los Sprints activos $sprints = $em->getRepository('BackendBundle:Sprint')->findByStatus(null, Entity\Sprint::STATUS_IN_PROCESS); if (!empty($sprints)) { $output->writeln(count($sprints) . " Sprints found."); foreach ($sprints as $sprint) { //buscamos todos los items asociados al Sprint $search = array('sprint' => $sprint->getId()); $order = array('priority' => 'DESC'); $allSprintItems = $em->getRepository('BackendBundle:Item')->findBy($search, $order); $estimatedTime = 0; $workedTime = 0; $remainingTime = 0; //recorremos los items del Sprint para calcular los tiempos foreach ($allSprintItems as $item) { $estimatedTime += $item->getEstimatedHours(); $workedTime += $item->getWorkedHours(); if ($item->isActive() && $item->getEstimatedHours() > $item->getWorkedHours()) { $remainingTime += $item->getEstimatedHours() - $item->getWorkedHours(); } } $sprint->setEstimatedTime($estimatedTime); $sprint->setWorkedTime($workedTime); $sprint->setRemainingTime($remainingTime); $em->persist($sprint); $output->writeln("Estimated, worked and remaining time updated to " . $sprint->getName() . ' in Project ' . $sprint->getProject()->getName()); //verificamos si la fecha actual hace parte del Sprint para calcular el tiempo restante $searchSprintDay = array('date' => Util::getCurrentDate(), 'sprint' => $sprint->getId()); $sprintDay = $em->getRepository('BackendBundle:SprintDay')->findOneBy($searchSprintDay); if ($sprintDay) { $sprintDay->setRemainingWork($remainingTime); $em->persist($sprintDay); } } $em->flush(); } else { $output->writeln("No active Sprints found."); } }
/** * Permite verificar si el usuario logueado tiene un registro de tiempo * @author Cesar Giraldo <*****@*****.**> May 25 2016 * @return \BackendBundle\Entity\TimeTracking */ public function getActiveTimeTrack() { $user = $this->tokenStorage->getToken()->getUser(); if ($user) { $searchActive = array('user' => $user->getId(), 'endTime' => null); $order = array('date' => 'DESC', 'startTime' => 'DESC'); $timeTrack = $this->em->getRepository('BackendBundle:TimeTracking')->findOneBy($searchActive, $order); if (!$timeTrack instanceof Entity\TimeTracking) { $timeTrack = new Entity\TimeTracking(); $timeTrack->setUser($user); } else { $workedTime = $this->getSecondsBetweenDates($timeTrack->getStartTime(), Util::getCurrentDate()); $timeTrack->setWorkedTime($workedTime); } return $timeTrack; } return null; }
/** * Esta funcion permite rechazar una invitacion a un proyecto * @author Cesar Giraldo <*****@*****.**> 22/01/2016 * @param Request $request datos de la solicitud * @return JsonResponse JSON con mensaje de respuesta */ public function rejectAction(Request $request) { $em = $this->getDoctrine()->getManager(); $invitationId = $request->request->get('invitationId'); $response['result'] = "__OK__"; $response['msg'] = ""; $invitation = $em->getRepository('BackendBundle:ProjectInvitation')->find($invitationId); if (!$invitation || ($invitation && $invitation->getStatus() != Entity\ProjectInvitation::STATUS_ACTIVE || $invitation && $invitation->getUser()->getId() != $this->getUser()->getId())) { $response['result'] = "__KO__"; $response['msg'] = $this->get('translator')->trans('backend.project_invitation.invitation_not_found'); return new JsonResponse($response); } try { $invitation->setStatus(Entity\ProjectInvitation::STATUS_REJECTED); $invitation->setCanceledDate(Util::getCurrentDate()); $em->persist($invitation); $em->flush(); } catch (\Exception $exc) { $response['result'] = "__KO__"; $response['msg'] = $this->get('translator')->trans('backend.project_invitation.error_rejecting'); } return new JsonResponse($response); }
/** * Esta funcion permite eliminar una invitacion de un proyecto * @author Cesar Giraldo <*****@*****.**> 20/01/2016 * @param Request $request * @return JsonResponse */ public function deleteInvitationAction(Request $request) { $em = $this->getDoctrine()->getManager(); $invitationId = $request->request->get('invitationId'); $response['result'] = "__OK__"; $response['msg'] = ""; $invitation = $em->getRepository('BackendBundle:ProjectInvitation')->find($invitationId); if (!$invitation) { $response['result'] = "__KO__"; $response['msg'] = $this->get('translator')->trans('backend.project_invitation.not_found_message'); return new JsonResponse($response); } try { $invitation->setStatus(Entity\ProjectInvitation::STATUS_CANCELED); $invitation->setCanceledDate(Util::getCurrentDate()); $em->persist($invitation); $em->flush(); } catch (\Exception $exc) { $response['result'] = "__KO__"; $response['msg'] = $this->get('translator')->trans('backend.project_invitation.error_canceling'); } return new JsonResponse($response); }
/** * Set Page initial status before persisting * @ORM\PrePersist */ public function setDefaults() { if ($this->getCreationDate() === null) { $this->setCreationDate(Util::getCurrentDate()); } if ($this->getStatus() === null) { $this->setStatus(self::STATUS_NEW); } if ($this->getWorkedHours() === null) { $this->setWorkedHours(0); } }
/** * Set Page initial status before persisting * @ORM\PrePersist */ public function setDefaults() { if ($this->getAssignationDate() === null) { $this->setAssignationDate(Util::getCurrentDate()); } }
/** * Permite iniciar un contador de tiempo para una tarea determinada * @author Cesar Giraldo <*****@*****.**> 06/04/2016 * @param Request $request * @return JsonResponse */ public function stopTimeAction(Request $request) { $response = array('result' => '__KO__', 'msg' => ''); $em = $this->getDoctrine()->getManager(); $timeTrackId = trim(strip_tags($request->request->get('timeId'))); if ($timeTrackId != '') { $timeTrack = $em->getRepository('BackendBundle:TimeTracking')->find($timeTrackId); if ($timeTrack instanceof Entity\TimeTracking && $this->container->get('access_control')->isAllowedProject($timeTrack->getProject()->getId())) { if (empty($timeTrack->getEndTime())) { $timeTrack->setEndTime(Util::getCurrentDate()); $workedTime = $this->container->get('time_tracker')->getSecondsBetweenDates($timeTrack->getStartTime(), $timeTrack->getEndTime()); $timeTrack->setWorkedTime($workedTime); $em->persist($timeTrack); $em->flush(); $response['result'] = '__OK__'; } else { $response['msg'] = $this->get('translator')->trans('backend.item.not_found_message') . "."; } } else { $response['msg'] = $this->get('translator')->trans('backend.item.not_found_message'); } } else { $response['msg'] = $this->get('translator')->trans('backend.item.not_found_message'); } return new JsonResponse($response); }
/** * Set Page initial status before persisting * @ORM\PrePersist */ public function setDefaults() { if ($this->getDate() === null) { $this->setDate(Util::getCurrentDate()); } if ($this->getStartTime() === null) { $this->setStartTime(Util::getCurrentDate()); } if ($this->getStartTime() != null && $this->getEndTime() != null) { $startTime = $this->getStartTime(); $interval = $startTime->diff($this->getEndTime()); var_dump($interval->format("%H:%I:%S")); die; } }
/** * Esta funcion permite listar el Sprint Backlog de un sprint determinado * @author Cesar Giraldo <*****@*****.**> 28/01/2016 * @param Request $request * @param string $id identificador del proyecto * @param string $sprintId identificador del sprint * @return type */ public function sprintBacklogAction(Request $request, $id, $sprintId) { $em = $this->getDoctrine()->getManager(); $sprint = $em->getRepository('BackendBundle:Sprint')->find($sprintId); if (!$sprint || $sprint && $sprint->getProject()->getId() != $id) { $this->get('session')->getFlashBag()->add('messageError', $this->get('translator')->trans('backend.sprint.not_found_message')); return $this->redirectToRoute('backend_project_sprints', array('id' => $id)); } if (!$this->container->get('access_control')->isAllowedProject($id)) { $this->get('session')->getFlashBag()->add('messageError', $this->get('translator')->trans('backend.project.not_found_message')); return $this->redirectToRoute('backend_projects'); } $search = array('sprint' => $sprint->getId()); $order = array('priority' => 'DESC'); $allSprintItems = $em->getRepository('BackendBundle:Item')->findBy($search, $order); $estimatedTime = 0; $workedTime = 0; $remainingTime = 0; foreach ($allSprintItems as $item) { $estimatedTime += $item->getEstimatedHours(); $workedTime += $item->getWorkedHours(); if ($item->isActive() && $item->getEstimatedHours() > $item->getWorkedHours()) { $remainingTime += $item->getEstimatedHours() - $item->getWorkedHours(); } } $sprint->setEstimatedTime($estimatedTime); $sprint->setWorkedTime($workedTime); $sprint->setRemainingTime($remainingTime); $em->persist($sprint); //verificamos si el Sprint esta en proceso if ($sprint->getStatus() == Entity\Sprint::STATUS_IN_PROCESS) { //verificamos si la fecha actual hace parte del Sprint para calcular el tiempo restante $searchSprintDay = array('date' => Util::getCurrentDate(), 'sprint' => $sprintId); $sprintDay = $em->getRepository('BackendBundle:SprintDay')->findOneBy($searchSprintDay); if ($sprintDay) { $sprintDay->setRemainingWork($remainingTime); $em->persist($sprintDay); } } $em->flush(); $search['parent'] = NULL; $sprintBacklog = $em->getRepository('BackendBundle:Item')->findBy($search, $order); //logica para pintar la grafica Burdown del Sprint $days = $em->getRepository('BackendBundle:SprintDay')->findBy(array('sprint' => $sprintId), array('date' => 'ASC')); $sprintDays = count($days); $listDays = array(); for ($i = 0; $i < $sprintDays; $i++) { $listDays[$i] = $days[$i]->getDate()->format($sprint->getProject()->getSettings()->getPHPDateFormat()); } $estimatedTimePerDay = 0; $idealArray = array(); if ($sprintDays > 0 && $sprint->getEstimatedTime() > 0) { $estimatedTimePerDay = number_format($sprint->getEstimatedTime() / $sprintDays, 1); $idealArray = range(0, $sprint->getEstimatedTime() - 1, $estimatedTimePerDay); } $idealXArray = array(); foreach ($idealArray as $value) { $value = trim($value); $idealXArray[] = 'Day ' . $value; } //datos del avance del sprint $actualArray = array(); for ($i = 0; $i < $sprintDays; $i++) { $actualArray[$i] = $days[$i]->getRemainingWork(); } return $this->render('BackendBundle:Project/Sprint:backlog.html.twig', array('project' => $sprint->getProject(), 'sprint' => $sprint, 'sprintBacklog' => $sprintBacklog, 'menu' => self::MENU, 'idealXArray' => $idealXArray, 'idealArray' => array_reverse($idealArray), 'actualArray' => $actualArray, 'listDays' => $listDays)); }
/** * Set Page initial status before persisting * @ORM\PrePersist */ public function setDefaults() { if ($this->getCreationDate() === null) { $this->setCreationDate(Util::getCurrentDate()); } if ($this->getIsAccountConfirmed() === null) { $this->setIsAccountConfirmed(false); } }
/** * Set Page initial status before persisting * @ORM\PrePersist */ public function setDefaults() { if ($this->getDate() === null) { $this->setDate(Util::getCurrentDate()); } if ($this->getStatus() === null) { $this->setStatus(self::STATUS_ACTIVE); } }