vendor/uvdesk/core-framework/Controller/Ticket.php line 19

Open in your IDE?
  1. <?php
  2. namespace Webkul\UVDesk\CoreFrameworkBundle\Controller;
  3. use Symfony\Component\HttpFoundation\Request;
  4. use Symfony\Component\HttpFoundation\Response;
  5. use Symfony\Component\EventDispatcher\GenericEvent;
  6. use Webkul\UVDesk\CoreFrameworkBundle\Form as CoreFrameworkBundleForms;
  7. use Symfony\Bundle\FrameworkBundle\Controller\Controller;
  8. use Webkul\UVDesk\CoreFrameworkBundle\Entity as CoreFrameworkBundleEntities;
  9. use Symfony\Component\Routing\Generator\UrlGeneratorInterface;
  10. use Webkul\UVDesk\CoreFrameworkBundle\DataProxies as CoreFrameworkBundleDataProxies;
  11. use Webkul\UVDesk\CoreFrameworkBundle\Workflow\Events as CoreWorkflowEvents;
  12. use Webkul\UVDesk\CoreFrameworkBundle\Tickets\QuickActionButtonCollection;
  13. use Webkul\UVDesk\CoreFrameworkBundle\Entity\TicketActivity;
  14. class Ticket extends Controller
  15. {
  16.     public function listTicketCollection(Request $request)
  17.     {
  18.         $entityManager $this->getDoctrine()->getManager();
  19.         return $this->render('@UVDeskCoreFramework//ticketList.html.twig', [
  20.             'ticketStatusCollection' => $entityManager->getRepository('UVDeskCoreFrameworkBundle:TicketStatus')->findBy(array(), array('sortOrder' => 'ASC')),
  21.             'ticketTypeCollection' => $entityManager->getRepository('UVDeskCoreFrameworkBundle:TicketType')->findByIsActive(true),
  22.             'ticketPriorityCollection' => $entityManager->getRepository('UVDeskCoreFrameworkBundle:TicketPriority')->findAll(),
  23.         ]);
  24.     }
  25.     
  26.     public function getUsersOnline(){
  27.         $users $this->get('user.service')->getUsersOnline();
  28.         return new Response(json_encode($users));
  29.     }
  30.     public function loadTicket($ticketIdQuickActionButtonCollection $quickActionButtonCollection)
  31.     {
  32.         $entityManager $this->getDoctrine()->getManager();
  33.         $userRepository $entityManager->getRepository('UVDeskCoreFrameworkBundle:User');
  34.         $ticketRepository $entityManager->getRepository('UVDeskCoreFrameworkBundle:Ticket');
  35.         $ticket $ticketRepository->findOneById($ticketId);
  36.         
  37.         if (empty($ticket)) {
  38.             throw new \Exception('Page not found');
  39.         }
  40.         
  41.         $user $this->get('user.service')->getSessionUser();
  42.         
  43.         // Proceed only if user has access to the resource
  44.         if (false == $this->get('ticket.service')->isTicketAccessGranted($ticket$user)) {
  45.             throw new \Exception('Access Denied'403);
  46.         }
  47.         $agent $ticket->getAgent();
  48.         $customer $ticket->getCustomer();
  49.      // Ticker users activity
  50.         $currentAgent $this->getUser();
  51.        
  52.      $ticketActivity $this->createTicketActivity$ticket );
  53.         
  54.         // Mark as viewed by agents
  55.         if (false == $ticket->getIsAgentViewed()) {
  56.            // $ticket->setIsAgentViewed(true);
  57.             $entityManager->persist($ticket);
  58.             $entityManager->flush();
  59.         }
  60.     
  61.         $quickActionButtonCollection->prepareAssets();
  62.         return $this->render('@UVDeskCoreFramework//ticket.html.twig', [
  63.             'ticket' => $ticket,
  64.             'totalReplies' => $ticketRepository->countTicketTotalThreads($ticket->getId()),
  65.             'totalCustomerTickets' => $ticketRepository->countCustomerTotalTickets($customer),
  66.             'initialThread' => $this->get('ticket.service')->getTicketInitialThreadDetails($ticket),
  67.             'ticketAgent' => !empty($agent) ? $agent->getAgentInstance()->getPartialDetails() : null,
  68.             'customer' => $customer->getCustomerInstance()->getPartialDetails(),
  69.             'currentUserDetails' => $user->getAgentInstance()->getPartialDetails(),
  70.             'currentUserTeams' => $user->getAgentInstance()->getSupportTeams(),
  71.             'supportGroupCollection' => $userRepository->getSupportGroups(),
  72.             'supportTeamCollection' => $userRepository->getSupportTeams(),
  73.             'ticketStatusCollection' => $entityManager->getRepository('UVDeskCoreFrameworkBundle:TicketStatus')->findAll(),
  74.             'ticketTypeCollection' => $entityManager->getRepository('UVDeskCoreFrameworkBundle:TicketType')->findByIsActive(true),
  75.             'ticketPriorityCollection' => $entityManager->getRepository('UVDeskCoreFrameworkBundle:TicketPriority')->findAll(),
  76.             'ticketNavigationIteration' => $ticketRepository->getTicketNavigationIteration($ticket$this->container),
  77.             'ticketLabelCollection' => $ticketRepository->getTicketLabelCollection($ticket$user),
  78.         ]);
  79.     }
  80.      public function createTicketActivity$ticket ){
  81.         $entityManager $this->getDoctrine()->getManager();
  82.         $currentAgent $this->getUser();
  83.         $ticketActivityResult $entityManager->getRepository(TicketActivity::class)->findBy(['ticket'=>$ticket,'agent'=>$currentAgent]);
  84.         if($ticketActivityResult){
  85.             $ticketActivity $ticketActivityResult[0];
  86.         }else{
  87.             $ticketActivity = new TicketActivity();
  88.         }
  89.         $ticketActivity->setTicket($ticket);
  90.         $ticketActivity->setAgent($currentAgent);
  91.         $ticketActivity->setCreatedAt(new \DateTime('now'));
  92.         $entityManager->persist($ticketActivity);
  93.         $entityManager->flush();
  94.         return $ticketActivity;
  95.     }
  96.     public function saveTicket(Request $request)
  97.     {
  98.         $requestParams $request->request->all();
  99.         $entityManager $this->getDoctrine()->getManager();
  100.         $response $this->redirect($this->generateUrl('helpdesk_member_ticket_collection'));
  101.         if ($request->getMethod() != 'POST' || false == $this->get('user.service')->isAccessAuthorized('ROLE_AGENT_CREATE_TICKET')) {
  102.             return $response;
  103.         }
  104.         // Get referral ticket if any
  105.         $ticketValidationGroup 'CreateTicket';
  106.         $referralURL $request->headers->get('referer');
  107.         if (!empty($referralURL)) {
  108.             $iterations explode('/'$referralURL);
  109.             $referralId array_pop($iterations);
  110.             $expectedReferralURL $this->generateUrl('helpdesk_member_ticket', ['ticketId' => $referralId], UrlGeneratorInterface::ABSOLUTE_URL);
  111.             if ($referralURL === $expectedReferralURL) {
  112.                 $referralTicket $entityManager->getRepository('UVDeskCoreFrameworkBundle:Ticket')->findOneById($referralId);
  113.                 if (!empty($referralTicket)) {
  114.                     $ticketValidationGroup 'CustomerCreateTicket';
  115.                 }
  116.             }
  117.         }
  118.         $ticketType $entityManager->getRepository('UVDeskCoreFrameworkBundle:TicketType')->findOneById($requestParams['type']);
  119.         $ticketPriority $entityManager->getRepository('UVDeskCoreFrameworkBundle:TicketPriority')->find($requestParams['priority']);
  120.         $ticketProxy = new CoreFrameworkBundleDataProxies\CreateTicketDataClass();
  121.         $form $this->createForm(CoreFrameworkBundleForms\CreateTicket::class, $ticketProxy);
  122.         // Validate Ticket Details
  123.         $form->submit($requestParams);
  124.         if (false == $form->isSubmitted() || false == $form->isValid()) {
  125.             if (false === $form->isValid()) {
  126.                 // @TODO: We need to handle form errors gracefully.
  127.                 // We should also look into switching to an xhr request instead.
  128.                 // $form->getErrors(true);
  129.             }
  130.             return $this->redirect(!empty($referralURL) ? $referralURL $this->generateUrl('helpdesk_member_ticket_collection'));
  131.         }
  132.         if ('CustomerCreateTicket' === $ticketValidationGroup && !empty($referralTicket)) {
  133.             // Retrieve customer details from referral ticket
  134.             $customer $referralTicket->getCustomer();
  135.             $customerPartialDetails $customer->getCustomerInstance()->getPartialDetails();
  136.         } else if (null != $ticketProxy->getFrom() && null != $ticketProxy->getName()) {
  137.             // Create customer if account does not exists
  138.             $customer $entityManager->getRepository('UVDeskCoreFrameworkBundle:User')->findOneByEmail($ticketProxy->getFrom());
  139.             if (empty($customer) || null == $customer->getCustomerInstance()) {
  140.                 $role $entityManager->getRepository('UVDeskCoreFrameworkBundle:SupportRole')->findOneByCode('ROLE_CUSTOMER');
  141.                 // Create User Instance
  142.                 $customer $this->get('user.service')->createUserInstance($ticketProxy->getFrom(), $ticketProxy->getName(), $role, [
  143.                     'source' => 'website',
  144.                     'active' => true
  145.                 ]);
  146.             }
  147.         }
  148.         $ticketData = [
  149.             'from' => $customer->getEmail(),
  150.             'name' => $customer->getFirstName() . ' ' $customer->getLastName(),
  151.             'type' => $ticketProxy->getType(),
  152.             'subject' => $ticketProxy->getSubject(),
  153.             'priority' => $ticketPriority,
  154.             // @TODO: We need to enable support for html messages. 
  155.             // Our focus here instead should be to prevent XSS (filter js)
  156.             'message' => strip_tags($ticketProxy->getReply()),
  157.             'firstName' => $customer->getFirstName(),
  158.             'lastName' => $customer->getLastName(),
  159.             'type' => $ticketProxy->getType(),
  160.             'role' => 4,
  161.             'source' => 'website',
  162.             'threadType' => 'create',
  163.             'createdBy' => 'agent',
  164.             'customer' => $customer,
  165.             'user' => $this->getUser(),
  166.             'attachments' => $request->files->get('attachments'),
  167.         ];
  168.         $thread $this->get('ticket.service')->createTicketBase($ticketData);
  169.         // Trigger ticket created event
  170.         try {
  171.             $event = new GenericEvent(CoreWorkflowEvents\Ticket\Create::getId(), [
  172.                 'entity' =>  $thread->getTicket(),
  173.             ]);
  174.             $this->get('event_dispatcher')->dispatch('uvdesk.automation.workflow.execute'$event);
  175.         } catch (\Exception $e) {
  176.             // Skip Automation
  177.         }
  178.         if (!empty($thread)) {
  179.             $ticket $thread->getTicket();
  180.             $request->getSession()->getFlashBag()->set('success'sprintf('Success! Ticket #%s has been created successfully.'$ticket->getId()));
  181.             if ($this->get('user.service')->isAccessAuthorized('ROLE_ADMIN')) {
  182.                 return $this->redirect($this->generateUrl('helpdesk_member_ticket', ['ticketId' => $ticket->getId()]));
  183.             }
  184.         } else {
  185.             $request->getSession()->getFlashBag()->set('warning''Could not create ticket, invalid details.');
  186.         }
  187.         return $this->redirect(!empty($referralURL) ? $referralURL $this->generateUrl('helpdesk_member_ticket_collection'));
  188.     }
  189.     public function listTicketTypeCollection(Request $request)
  190.     {
  191.         if (!$this->get('user.service')->isAccessAuthorized('ROLE_AGENT_MANAGE_TICKET_TYPE')) {
  192.             return $this->redirect($this->generateUrl('helpdesk_member_dashboard'));
  193.         }
  194.         return $this->render('@UVDeskCoreFramework/ticketTypeList.html.twig');
  195.     }
  196.     public function ticketType(Request $request)
  197.     {
  198.         if (!$this->get('user.service')->isAccessAuthorized('ROLE_AGENT_MANAGE_TICKET_TYPE')) {
  199.             return $this->redirect($this->generateUrl('helpdesk_member_dashboard'));
  200.         }
  201.         $errorContext = [];
  202.         $em $this->getDoctrine()->getManager();
  203.         if($id $request->attributes->get('ticketTypeId')) {
  204.             $type $em->getRepository('UVDeskCoreFrameworkBundle:TicketType')->find($id);
  205.             if (!$type) {
  206.                 $this->noResultFound();
  207.             }
  208.         } else {
  209.             $type = new CoreFrameworkBundleEntities\TicketType();
  210.         }
  211.         if ($request->getMethod() == "POST") {
  212.             $data $request->request->all();
  213.             $ticketType $em->getRepository('UVDeskCoreFrameworkBundle:TicketType')->findOneByCode($data['code']);
  214.             if (!empty($ticketType) && $id != $ticketType->getId()) {
  215.                 $this->addFlash('warning'sprintf('Error! Ticket type with same name already exist'));
  216.             } else {
  217.                 $type->setCode($data['code']);
  218.                 $type->setDescription($data['description']);
  219.                 $type->setIsActive(isset($data['isActive']) ? 0);
  220.                 $em->persist($type);
  221.                 $em->flush();
  222.                 if (!$request->attributes->get('ticketTypeId')) {
  223.                     $this->addFlash('success'sprintf('Success! Ticket type saved successfully.'));
  224.                 } else {
  225.                     $this->addFlash('success'sprintf('Success! Ticket type updated successfully.'));
  226.                 }
  227.                 return $this->redirect($this->generateUrl('helpdesk_member_ticket_type_collection'));
  228.             }
  229.         }
  230.         return $this->render('@UVDeskCoreFramework/ticketTypeAdd.html.twig', array(
  231.             'type' => $type,
  232.             'errors' => json_encode($errorContext)
  233.         ));
  234.     }
  235.     public function listTagCollection(Request $request)
  236.     {
  237.         if (!$this->get('user.service')->isAccessAuthorized('ROLE_AGENT_MANAGE_TAG')) {
  238.             return $this->redirect($this->generateUrl('helpdesk_member_dashboard'));
  239.         }
  240.         $enabled_bundles $this->container->getParameter('kernel.bundles');
  241.         return $this->render('@UVDeskCoreFramework/supportTagList.html.twig', [
  242.             'articlesEnabled' => in_array('UVDeskSupportCenterBundle'array_keys($enabled_bundles)),
  243.         ]);
  244.     }
  245.     public function removeTicketTagXHR($tagIdRequest $request)
  246.     {
  247.         if (!$this->get('user.service')->isAccessAuthorized('ROLE_AGENT_MANAGE_TAG')) {
  248.             return $this->redirect($this->generateUrl('helpdesk_member_dashboard'));
  249.         }
  250.         $json = [];
  251.         if($request->getMethod() == "DELETE") {
  252.             $em $this->getDoctrine()->getManager();
  253.             $tag $em->getRepository('UVDeskCoreFrameworkBundle:Tag')->find($tagId);
  254.             if($tag) {
  255.                 $em->remove($tag);
  256.                 $em->flush();
  257.                 $json['alertClass'] = 'success';
  258.                 $json['alertMessage'] = $this->get('translator')->trans('Success ! Tag removed successfully.');
  259.             }
  260.         }
  261.         $response = new Response(json_encode($json));
  262.         $response->headers->set('Content-Type''application/json');
  263.         return $response;
  264.     }
  265.     public function trashTicket(Request $request)
  266.     {
  267.         $ticketId $request->attributes->get('ticketId');
  268.         $entityManager $this->getDoctrine()->getManager();
  269.         $ticket $entityManager->getRepository('UVDeskCoreFrameworkBundle:Ticket')->find($ticketId);
  270.         if (!$ticket) {
  271.             $this->noResultFound();
  272.         }
  273.         if (!$ticket->getIsTrashed()) {
  274.             $ticket->setIsTrashed(1);
  275.             $entityManager->persist($ticket);
  276.             $entityManager->flush();
  277.         }
  278.         // Trigger ticket delete event
  279.         $event = new GenericEvent(CoreWorkflowEvents\Ticket\Delete::getId(), [
  280.             'entity' => $ticket,
  281.         ]);
  282.         $this->get('event_dispatcher')->dispatch('uvdesk.automation.workflow.execute'$event);
  283.         $this->addFlash('success'$this->get('translator')->trans('Success ! Ticket moved to trash successfully.'));
  284.         return $this->redirectToRoute('helpdesk_member_ticket_collection');
  285.     }
  286.     public function downloadZipAttachment(Request $request)
  287.     {
  288.         $threadId $request->attributes->get('threadId');
  289.         $attachmentRepository $this->getDoctrine()->getManager()->getRepository('UVDeskCoreFrameworkBundle:Attachment');
  290.         $attachment $attachmentRepository->findByThread($threadId);
  291.         if (!$attachment) {
  292.             $this->noResultFound();
  293.         }
  294.         $zipname 'attachments/' .$threadId.'.zip';
  295.         $zip = new \ZipArchive;
  296.         $zip->open($zipname, \ZipArchive::CREATE);
  297.         if (count($attachment)) {
  298.             foreach ($attachment as $attach) {
  299.                 $zip->addFile(substr($attach->getPath(), 1));
  300.             }
  301.         }
  302.         $zip->close();
  303.         $response = new Response();
  304.         $response->setStatusCode(200);
  305.         $response->headers->set('Content-type''application/zip');
  306.         $response->headers->set('Content-Disposition''attachment; filename=' $threadId '.zip');
  307.         $response->sendHeaders();
  308.         $response->setContent(readfile($zipname));
  309.         return $response;
  310.     }
  311.     public function downloadAttachment(Request $request)
  312.     {
  313.         $attachmendId $request->attributes->get('attachmendId');
  314.         $attachmentRepository $this->getDoctrine()->getManager()->getRepository('UVDeskCoreFrameworkBundle:Attachment');
  315.         $attachment $attachmentRepository->findOneById($attachmendId);
  316.         $baseurl $request->getScheme() . '://' $request->getHttpHost() . $request->getBasePath();
  317.         if (!$attachment) {
  318.             $this->noResultFound();
  319.         }
  320.         $path $this->get('kernel')->getProjectDir() . "/public/"$attachment->getPath();
  321.         $response = new Response();
  322.         $response->setStatusCode(200);
  323.         $response->headers->set('Content-type'$attachment->getContentType());
  324.         $response->headers->set('Content-Disposition''attachment; filename='$attachment->getName());
  325.         $response->sendHeaders();
  326.         $response->setContent(readfile($path));
  327.         return $response;
  328.     }
  329.     public function searchUserActivity(Request $request)
  330.     {
  331.         $em $this->getDoctrine()->getManager();
  332.         $ticket $request->get('id');
  333.         $ticketService $this->get('ticket.service')->getUsersTicket($ticket);
  334.         return new Response(json_encode($ticketService));
  335.     }
  336.     public function createUserActivity(Request $request)
  337.     {
  338.         $em $this->getDoctrine()->getManager();
  339.         $ticketRepository $em->getRepository('UVDeskCoreFrameworkBundle:Ticket');
  340.         $ticketId $request->get('id');
  341.         $ticket $ticketRepository->findOneById($ticketId);
  342.         $ticketActivity $this->createTicketActivity($ticket);
  343.         return new Response(json_encode($ticketActivity));
  344.     }
  345. }