PageRenderTime 53ms CodeModel.GetById 24ms RepoModel.GetById 1ms app.codeStats 0ms

/src/BrainStrategist/ProjectBundle/Controller/TicketController.php

https://gitlab.com/brainstrategist/helpdesk
PHP | 322 lines | 215 code | 79 blank | 28 comment | 28 complexity | 5875e476f777296d87de98719c8f0bd1 MD5 | raw file
  1. <?php
  2. namespace BrainStrategist\ProjectBundle\Controller;
  3. use Symfony\Component\HttpFoundation\Request;
  4. use Symfony\Bundle\FrameworkBundle\Controller\Controller;
  5. use Symfony\Component\HttpKernel\Exception\HttpException;
  6. use Sensio\Bundle\FrameworkExtraBundle\Configuration\Route;
  7. use Symfony\Component\HttpFoundation\JsonResponse;
  8. use BrainStrategist\KernelBundle\Entity\Organization;
  9. use BrainStrategist\ProjectBundle\Entity\Project;
  10. use BrainStrategist\ProjectBundle\Entity\Ticket;
  11. use BrainStrategist\ProjectBundle\Entity\Ticket_Comment;
  12. use BrainStrategist\ProjectBundle\Entity\Ticket_Log;
  13. use BrainStrategist\ProjectBundle\Form\ProjectForm;
  14. use BrainStrategist\KernelBundle\Entity\User;
  15. use BrainStrategist\ProjectBundle\Form\TicketForm;
  16. use BrainStrategist\ProjectBundle\Form\CommentForm;
  17. use Symfony\Component\HttpFoundation\File\File;
  18. use BrainStrategist\KernelBundle\Entity;
  19. class TicketController extends Controller
  20. {
  21. private $currentUser;
  22. /**
  23. *
  24. * Pre dispatcher event to check the security access of the current user
  25. *
  26. */
  27. private function preExecute(){
  28. if($this->container->get('security.authorization_checker')->isGranted('IS_AUTHENTICATED_FULLY') ) {
  29. $this->currentUser = $this->get('security.token_storage')->getToken()->getUser();
  30. }else{
  31. throw new HttpException(400, "You are not allowed to access ticket. Please register or login first");
  32. }
  33. }
  34. /**
  35. * @Route("/{_locale}/project/{slug}/ticket/list",name="ticket_list")
  36. */
  37. public function listAction(Request $request,$slug=null,$page=null,$filters=null,$limit=null){
  38. $this->preExecute();
  39. $params=array();
  40. $em = $this->getDoctrine()->getManager();
  41. $projectEntity = $em->getRepository("BrainStrategistProjectBundle:Project");
  42. if(isset($slug)) {
  43. if ($projectEntity->isMyProject($slug, $this->currentUser->getId())) {
  44. $project = $projectEntity->findOneBySlug($slug);
  45. $ticketsEntity = $em->getRepository("BrainStrategistProjectBundle:Ticket");
  46. $params = array("projectID" => $project->getId());
  47. // Get all severity by project
  48. $severityEntity = $em->getRepository("BrainStrategistProjectBundle:Severity");
  49. $severity = $severityEntity->findAllByProjectId($project->getId());
  50. $severityQuery = $severity->getQuery();
  51. $severityQuery->setHydrationMode(\Doctrine\ORM\Query::HYDRATE_ARRAY);
  52. $params['severities'] = $severityQuery->getArrayResult();
  53. // Get all category by project
  54. $categoryEntity = $em->getRepository("BrainStrategistProjectBundle:Ticket_Category");
  55. $categories = $categoryEntity->findAll();
  56. $params['categories'] = $categories;
  57. // Get all status by project
  58. $statusEntity = $em->getRepository("BrainStrategistProjectBundle:Ticket_status");
  59. $status = $statusEntity->findAllByProjectId($project->getId());
  60. $statusQuery = $status->getQuery();
  61. $statusQuery->setHydrationMode(\Doctrine\ORM\Query::HYDRATE_ARRAY);
  62. $params['status_list'] = $statusQuery->getArrayResult();
  63. if(isset($filters))
  64. $params['filters'] = $filters;
  65. // pagination
  66. if(null !== $request->query->getInt('page') && !isset($page)){
  67. $page = 1;
  68. }
  69. // nb results per page
  70. if(null !== $request->query->getInt('limit') && !isset($limit)){
  71. $limit = 10;
  72. }
  73. $ticket_query = $ticketsEntity->findAllTicketByProjectIdQuery($params);
  74. $paginator = $this->get('knp_paginator');
  75. $tickets = $paginator->paginate(
  76. $ticket_query,
  77. $page,
  78. $limit
  79. );
  80. $params['tickets'] = $tickets;
  81. }
  82. }
  83. return $this->render(
  84. 'BrainStrategistProjectBundle:Ticket:list.html.twig',
  85. $params
  86. );
  87. }
  88. /**
  89. * @Route("/{_locale}/project/{slug}/ticket/create",name="ticket_create")
  90. */
  91. public function createAction(Request $request,$slug=null){
  92. $this->preExecute();
  93. $params=array();
  94. $request = $this->container->get('request_stack')->getCurrentRequest();
  95. $em = $this->getDoctrine()->getManager();
  96. $projectEntity = $em->getRepository("BrainStrategistProjectBundle:Project");
  97. if(isset($slug)) {
  98. if ($projectEntity->isMyProject($slug, $this->currentUser->getId())) {
  99. $project = $projectEntity->findOneBySlug($slug);
  100. $params['project'] = $project;
  101. $organizationEntity = $em->getRepository("BrainStrategistKernelBundle:Organization");
  102. $organization = $organizationEntity->find($project->getOrganization()->getId());
  103. $params['organization'] = $organization;
  104. $ticket= new Ticket();
  105. $form = $this->createForm(TicketForm::class,$ticket, array('attr'=> array('project_id' => $project->getId())));
  106. $params = array_merge($params,
  107. array(
  108. "form" => $form->createView(),
  109. ));
  110. }
  111. }
  112. if ('POST' == $request->getMethod()) {
  113. $form->handleRequest($request);
  114. if ($form->isSubmitted() && $form->isValid()) {
  115. $response = $form->getData();
  116. /**
  117. * Check ticket before sending
  118. */
  119. $valid = true;
  120. $notice = null;
  121. $type_notice = null;
  122. if($response->getDescription() === null){
  123. $valid = false;
  124. $notice = 'The description is empty';
  125. $type_notice = 'alert';
  126. }
  127. if($valid){
  128. $project->addProjectTicket($ticket);
  129. $ticket->setProjet($project);
  130. $ticket->setCreator($this->currentUser);
  131. $ticket->setSeverity($response->getSeverity());
  132. $ticket->setPriority($response->getPriority());
  133. $ticket_log = new Ticket_Log();
  134. $ticket_log->setContentLog('Creation of the ticket');
  135. $ticket_log->setTicket($ticket);
  136. $ticket->addLog($ticket_log);
  137. $em->persist($ticket);
  138. $em->persist($ticket_log);
  139. $em->persist($project);
  140. $em->persist($response);
  141. $em->flush();
  142. foreach($response->getAssignedUsers() as $user){
  143. $user->addUserTicket($ticket);
  144. $em->persist($user);
  145. $em->flush();
  146. }
  147. }
  148. }
  149. return $this->forward("BrainStrategistProjectBundle:Project:access",array('slug'=>$project->getSlug(),'view' => 'default','notice'=>$notice,'type_notice'=>$type_notice));
  150. }
  151. return $this->render(
  152. 'BrainStrategistProjectBundle:Ticket:create.html.twig',
  153. $params
  154. );
  155. }
  156. /**
  157. * @Route("/{_locale}/ajax/ticket/status",name="ticket_status_ajax")
  158. */
  159. public function ajaxStatusAction(Request $request){
  160. $this->preExecute();
  161. $params=array();
  162. $request = $this->container->get('request_stack')->getCurrentRequest();
  163. $em = $this->getDoctrine()->getManager();
  164. $ticketEntity = $em->getRepository("BrainStrategistProjectBundle:Ticket");
  165. $statusEntity = $em->getRepository("BrainStrategistProjectBundle:Ticket_Status");
  166. if ('POST' == $request->getMethod()) {
  167. $ticket_id = $request->request->get('ticket');
  168. $status_id = $request->request->get('status');
  169. if($ticketEntity->isMyTicket($ticket_id,$this->currentUser->getId())){
  170. // retreive the new order from JS and build a more friendly array for
  171. // an easy processing by doctrine
  172. $orders = $request->request->get('order');
  173. $ids =array();
  174. foreach($orders as $order){
  175. $ids[$order["new_order"]]=$order["ticket_id"];
  176. }
  177. foreach ($ticketEntity->findById($ids) as $obj) {
  178. $obj->setOrder(array_search($obj->getId(), $ids));
  179. }
  180. $status = $statusEntity->find($status_id);
  181. $ticket = $ticketEntity->find($ticket_id);
  182. $ticket->setStatus($status);
  183. $em->persist($ticket);
  184. $em->flush();
  185. return new JsonResponse(array('message'=>"Done"));
  186. }else{
  187. return new JsonResponse(array('message'=>"Not my ticket"));
  188. }
  189. }
  190. return new JsonResponse(array('message'=>"Not a POST request"));
  191. }
  192. /**
  193. * @Route("/{_locale}/project/{slug}/ticket/view/{id}",name="ticket_view")
  194. * @Route("/{_locale}/project/{slug}/ticket/view/{id}/mode/{mode}",name="ticket_view_popup")
  195. */
  196. public function viewAction(Request $request,$slug=null,$id=null,$mode=null){
  197. $params=array();
  198. $request = $this->container->get('request_stack')->getCurrentRequest();
  199. $em = $this->getDoctrine()->getManager();
  200. $projectEntity = $em->getRepository("BrainStrategistProjectBundle:Project");
  201. $ticketEntity = $em->getRepository("BrainStrategistProjectBundle:Ticket");
  202. $statusEntity = $em->getRepository("BrainStrategistProjectBundle:Ticket_Status");
  203. if(isset($mode)){
  204. $params['mode']=$mode;
  205. }
  206. if(isset($slug) && isset($id)) {
  207. if ($projectEntity->isMyProject($slug, $this->currentUser->getId())) {
  208. $project = $projectEntity->findOneBySlug($slug);
  209. $ticket = $ticketEntity->findOneById($id);
  210. $params['project'] = $project;
  211. $params['ticket'] = $ticket;
  212. $params['status_list'] = $statusEntity->findAllByProjectId($params['project']->getId());
  213. $ticket_comment = new Ticket_Comment();
  214. $form = $this->createForm(CommentForm::class,$ticket_comment, array('attr'=> array('project_id' => $project->getId())));
  215. $params = array_merge($params,
  216. array(
  217. "form" => $form->createView(),
  218. ));
  219. }
  220. }
  221. if ('POST' == $request->getMethod()) {
  222. $form->handleRequest($request);
  223. if ($form->isSubmitted() && $form->isValid()) {
  224. $response = $form->getData();
  225. $ticket = $ticketEntity->find($id);
  226. if(!is_null($response->getContentComment())){
  227. $ticket_comment->setUserComment($this->currentUser);
  228. $ticket_comment->setTicket($ticket);
  229. $em->persist($ticket_comment);
  230. $em->persist($response);
  231. }
  232. $ticket->setStatus($response->getTicketStatus());
  233. $em->persist($ticket);
  234. $em->flush();
  235. return $this->redirectToRoute("ticket_view",array("id"=>$id,"slug"=>$slug));
  236. }
  237. }
  238. return $this->render(
  239. 'BrainStrategistProjectBundle:Ticket:view.html.twig',
  240. $params
  241. );
  242. }
  243. }