vendor/uvdesk/support-center-bundle/Controller/Ticket.php line 885

Open in your IDE?
  1. <?php
  2. //SI
  3. namespace Webkul\UVDesk\SupportCenterBundle\Controller;
  4. use Symfony\Component\HttpFoundation\Request;
  5. use Symfony\Component\HttpFoundation\Response;
  6. use Symfony\Component\EventDispatcher\GenericEvent;
  7. use Webkul\UVDesk\CoreFrameworkBundle\Entity\Thread;
  8. use Webkul\UVDesk\CoreFrameworkBundle\Entity\Website;
  9. use Symfony\Component\Validator\Constraints\DateTime;
  10. use Symfony\Component\Security\Core\User\UserInterface;
  11. use Symfony\Bundle\FrameworkBundle\Controller\Controller;
  12. use Webkul\UVDesk\CoreFrameworkBundle\Entity\TicketRating;
  13. use Webkul\UVDesk\SupportCenterBundle\Form\Ticket as TicketForm;
  14. use Symfony\Component\HttpKernel\Exception\NotFoundHttpException;
  15. use Webkul\UVDesk\SupportCenterBundle\Entity\KnowledgebaseWebsite;
  16. use Webkul\UVDesk\CoreFrameworkBundle\Entity\Ticket as TicketEntity;
  17. use Webkul\UVDesk\CoreFrameworkBundle\Workflow\Events as CoreWorkflowEvents;
  18. use Symfony\Component\Process\PhpProcess;
  19. use Webkul\UVDesk\SupportCenterBundle\Controller\ObjClient;
  20. use Webkul\UVDesk\CoreFrameworkBundle\Entity\Attachment;
  21. use Webkul\UVDesk\CoreFrameworkBundle\Entity\SupportTicketSubtypes;
  22. class Ticket extends Controller
  23. {
  24.     protected function isWebsiteActive()
  25.     {
  26.         $entityManager $this->getDoctrine()->getManager();
  27.         $website $entityManager->getRepository(Website::class)->findOneByCode('knowledgebase');
  28.         if (!empty($website)) {
  29.             $knowledgebaseWebsite $entityManager->getRepository(KnowledgebaseWebsite::class)->findOneBy(['website' => $website->getId(), 'status' => 1]);
  30.             
  31.             if (!empty($knowledgebaseWebsite) && true == $knowledgebaseWebsite->getIsActive()) {
  32.                 return true;
  33.             }
  34.         }
  35.         $this->noResultFound();
  36.     }
  37.     /**
  38.      * If customer is playing with url and no result is found then what will happen
  39.      * @return
  40.      */
  41.     protected function noResultFound()
  42.     {
  43.         throw new NotFoundHttpException('Not found !');
  44.     }
  45.     public function solicitarUrgencia($ticket$entityManager)
  46.     {
  47.         $nova = array(" ");
  48.         //Modificacion para validar si se muestra el boton.
  49.         $currentThread $this->getDoctrine()->getRepository('UVDeskCoreFrameworkBundle:Thread')->getTicketCurrentThread($ticket);
  50.         $attachments $entityManager->getRepository(Attachment::class)->findByThread($currentThread);
  51.         $subject utf8_encode($ticket->getSubject());
  52.         $subject str_replace($nova"<BLANK>"$subject);
  53.         $msj utf8_encode($currentThread->getMessage());
  54.         $msj str_replace($nova"<BLANK>"$msj);
  55.         if(count($attachments)){
  56.             $pathutf8_encode($attachments[0]->getPath());
  57.             $path str_replace($nova"<BLANK>"$path);
  58.             $nameFileAttachment=utf8_encode($attachments[0]->getName());
  59.             $nameFileAttachment str_replace($nova"<BLANK>"$nameFileAttachment);
  60.         }else{
  61.             $nameFileAttachment=$path='';
  62.         }
  63.         $user $this->get('user.service')->getSessionUser();
  64.         $haveSupport file_get_contents($_ENV['EXTERNAL_PATH']."UserController.php?case=1&user=".$user->getEmail());
  65.         if($haveSupport==1//24/7
  66.             $TicketStatus $entityManager->getRepository('UVDeskCoreFrameworkBundle:TicketStatus')->findOneById("8"); //in process of attention
  67.         if($haveSupport==3//Low Cost
  68.             $TicketStatus $entityManager->getRepository('UVDeskCoreFrameworkBundle:TicketStatus')->findOneById("7");//Pending Payment
  69.         $TicketPriority $entityManager->getRepository('UVDeskCoreFrameworkBundle:TicketPriority')->findOneById("4"); // Urgent
  70.         $UserClient file_get_contents($_ENV['EXTERNAL_PATH']."UserController.php?case=3&user=".$user->getEmail());
  71.         $jsonUser=json_decode($UserClienttrue);
  72.         $str$_SERVER['HTTP_REFERER'];
  73.         $param_url=explode("public/",$str);
  74.         $lang=substr($param_url[1],0,2);
  75.         //$lang='es';
  76.         //$haveSupport=1;
  77.         $url=$_ENV['EXTERNAL_PATH']."TicketController.php?case=1&serial='".$jsonUser[0]["Nroserie"]."'&haveSupport='".$haveSupport."'&user='".$user->getEmail()."'&subject='".$subject."'&msj='".$msj."'&path='".$path."'&nameFileAttachment='".$nameFileAttachment."'&lang='".$lang."'&whatsapp='".$ticket->getWhatsapp()."'";
  78.         $idTicketSeries file_get_contents($url);
  79.         $ticket->setCodigoSeries($idTicketSeries);
  80.         $ticket->setPriority($TicketPriority);
  81.         $ticket->setStatus($TicketStatus);
  82.         $entityManager->persist($ticket);
  83.         $entityManager->flush();
  84.     }
  85.     
  86.      public function trans($text)
  87.     {
  88.         return $this->container->get('translator')->trans($text);
  89.     }
  90.     
  91. public function getTicketData(Request $request) {
  92.     $supportTicketSubtypesId $request->query->get('supportTicketSubtypesId');
  93.     // Conectar a la base de datos
  94.     $connection $this->getDoctrine()->getConnection();
  95.     // Consulta para obtener el subtipo de ticket
  96.     $subtypeQuery 'SELECT * FROM uv_ticket_subtype WHERE id = :id';
  97.     $stmt $connection->prepare($subtypeQuery);
  98.     $stmt->execute(['id' => $supportTicketSubtypesId]);
  99.     $supportTicketSubtype $stmt->fetch();
  100.     if (!$supportTicketSubtype) {
  101.         return new Response(json_encode(['error' => 'No se encontró el subtipo de ticket']), Response::HTTP_NOT_FOUND);
  102.     }
  103.     // Consulta para obtener los datos del ticket
  104.     $dataQuery '
  105.         SELECT d.id, d.data, d.tipo, ds.required
  106.         FROM uv_ticket_data d
  107.         JOIN uv_ticket_data_subtype ds ON ds.id_ticket_data = d.id
  108.         WHERE ds.id_ticket_subtype = :id_ticket_subtype
  109.     ';
  110.     $stmt $connection->prepare($dataQuery);
  111.     $stmt->execute(['id_ticket_subtype' => $supportTicketSubtypesId]);
  112.     $ticketDataCollection $stmt->fetchAll();
  113.     $translator $this->container->get('translator');
  114.        //     $emailPlaceholders['ticket.status'] = $translator->trans($emailPlaceholders['ticket.status'],[],'messages',$language);
  115.             
  116.     // Convertir los datos a un arreglo
  117.     $ticketDataArray = [];
  118.     foreach ($ticketDataCollection as $ticketData) {
  119.         $ticketDataArray[] = [
  120.             'data' => $translator->trans($ticketData['data']),
  121.             'required' => $ticketData['required'],
  122.             // Agrega otras propiedades que necesites
  123.         ];
  124.     }
  125.     // Preparar la respuesta
  126.     $responseArray = [
  127.         'id' => $supportTicketSubtype['id'],
  128.         'ticketData' => $ticketDataArray// Agrega la colección de TicketData
  129.     ];
  130.     return new Response(json_encode($responseArray), Response::HTTP_OK, ['Content-Type' => 'application/json']);
  131. }
  132.     public function ticketadd(Request $request)
  133.     {
  134.       
  135.         $this->isWebsiteActive();   
  136.         
  137.         $formErrors $errors = array();
  138.         $em $this->getDoctrine()->getManager();
  139.         $website $em->getRepository(Website::class)->findOneByCode('knowledgebase');
  140.         $websiteConfiguration $this->get('uvdesk.service')->getActiveConfiguration($website->getId());
  141.         if (!$websiteConfiguration || !$websiteConfiguration->getTicketCreateOption() || ($websiteConfiguration->getLoginRequiredToCreate() && !$this->getUser())) {
  142.             return $this->redirect($this->generateUrl('helpdesk_knowledgebase'));
  143.         }
  144.         $post $request->request->all();
  145.         $fueraDeHorario=file_get_contents($_ENV['EXTERNAL_PATH']."UserController.php?case=2");
  146.         //Validación día feriado
  147.         $esFeriado=file_get_contents($_ENV['EXTERNAL_PATH']."UserController.php?case=4");
  148.         $user $this->get('user.service')->getSessionUser();
  149.         //Horario comercial
  150.         $conexionSeries 1;
  151.         if($fueraDeHorario){
  152.             $isSupportActive=file_get_contents($_ENV['EXTERNAL_PATH']."UserController.php?case=1&user=".$user->getEmail());
  153.             //Si esta fuera de horario y no hay conexión , creo el ticket, no envío correo y muestro mensaje
  154.             if($isSupportActive == -1){
  155.                 $isSupportActive 1;
  156.                 $conexionSeries 0;
  157.             }
  158.         }else{
  159.             //Si esta en horario comercial creo el ticket, no consunlto info de plan de usuario a series y no envío correo
  160.             $isSupportActive=1;
  161.         }
  162.         if($request->getMethod() == "POST") {
  163.             //Solicitud de urgencia en session
  164.             $session $request->getSession();
  165.             if($session->get('critical')){
  166.                 $start_date = new \DateTime($session->get('critical'));
  167.                 $since_start $start_date->diff(new \DateTime(date("Y-m-d H:i:s")));
  168.                 if($since_start->10){
  169.                     $session->remove('critical');
  170.                 }else{
  171.                     $request->getSession()->getFlashBag()->set('warning'$this->get('translator')->trans('Warning ! You previously requested an emergency, please wait 10 minutes and try again.'));
  172.                     return $this->redirect($this->generateUrl('helpdesk_customer_create_ticket'));
  173.                 }
  174.             }
  175.             //Validaciones para estado critical/urgent
  176.             if($post['priority'] == 4){
  177.                 if($post['urgent_check']){
  178.                    /*  if($post['business_impact']){
  179.                         if($post['phone']){
  180.                         }else{
  181.                             $request->getSession()->getFlashBag()->set('warning', $this->get('translator')->trans('Warning ! Phone is required.'));
  182.                             return $this->redirect($this->generateUrl('helpdesk_customer_create_ticket'));
  183.                         }
  184.                     }else{
  185.                         $request->getSession()->getFlashBag()->set('warning', $this->get('translator')->trans('Warning ! Business impact is required.'));
  186.                         return $this->redirect($this->generateUrl('helpdesk_customer_create_ticket'));
  187.                     } */
  188.                 }else{
  189.                     $request->getSession()->getFlashBag()->set('warning'$this->get('translator')->trans('Warning ! Urgent check is required.'));
  190.                     return $this->redirect($this->generateUrl('helpdesk_customer_create_ticket'));
  191.                 }
  192.             }else{
  193.             }
  194.             /////////////////////////////
  195.             //INICIO CAMBIO :  Cuando NO tiene usuario activo debo crear el ticket pero se debe poner en estado "pendiente de pago" 
  196.             $user $this->get('user.service')->getSessionUser();
  197.             
  198.         //Horario comercial
  199.             $conexionSeries 1;
  200.             $fueraDeHorario=file_get_contents($_ENV['EXTERNAL_PATH']."UserController.php?case=2");
  201.             if($fueraDeHorario){
  202.                 $isSupportActive=file_get_contents($_ENV['EXTERNAL_PATH']."UserController.php?case=1&user=".$user->getEmail());
  203.                 //Si esta fuera de horario y no hay conexión , creo el ticket, no envío correo y muestro mensaje
  204.                 if($isSupportActive == -1){
  205.                     $isSupportActive 1;
  206.                     $conexionSeries 0;
  207.                 }
  208.             }else{
  209.                 //Si esta en horario comercial creo el ticket, no consunlto info de plan de usuario a series y no envío correo
  210.                 $isSupportActive=1;
  211.             }
  212.             //FIN CAMBIO /////////////////////////
  213.             
  214.             if($_POST) {
  215.                 $error false;
  216.                 $message '';
  217.                 $ticketType $em->getRepository('UVDeskCoreFrameworkBundle:TicketType')->find($request->request->get('type'));
  218.             
  219.                 
  220.                 if($request->files->get('customFields') && !$this->get('file.service')->validateAttachmentsSize($request->files->get('customFields'))) {
  221.                     $error true;
  222.                     $this->addFlash(
  223.                             'warning',
  224.                             $this->get('translator')->trans("Warning ! Files size can not exceed %size% MB", [
  225.                                 '%size%' => $this->container->getParameter('max_upload_size')
  226.                             ])
  227.                         );
  228.                 }
  229.                 $ticket = new TicketEntity();
  230.                 
  231.                 $loggedUser $this->get('security.token_storage')->getToken()->getUser();
  232.                 
  233.                 if(!empty($loggedUser) && $loggedUser != 'anon.') {
  234.                     
  235.                     $form $this->createForm(TicketForm::class, $ticket, [
  236.                         'container' => $this->container,
  237.                         'entity_manager' => $em,
  238.                     ]);
  239.                     $email $loggedUser->getEmail();
  240.                     try {
  241.                         $name $loggedUser->getFirstName() . ' ' $loggedUser->getLastName();
  242.                     } catch(\Exception $e) {
  243.                         $name explode(' 'strstr($email'@'true));
  244.                     }
  245.                 } else {
  246.                     $form $this->createForm(TicketForm::class, $ticket, [
  247.                         'container' => $this->container,
  248.                         'entity_manager' => $em,
  249.                     ]);
  250.                     $email $request->request->get('from');
  251.                     $name explode(' '$request->request->get('name'));
  252.                 }
  253.                 $website $em->getRepository('UVDeskCoreFrameworkBundle:Website')->findOneByCode('knowledgebase');
  254.                 if(!empty($email) && $this->container->get('ticket.service')->isEmailBlocked($email$website)) {
  255.                     $request->getSession()->getFlashBag()->set('warning'$this->get('translator')->trans('Warning ! Cannot create ticket, given email is blocked by admin.'));
  256.                     return $this->redirect($this->generateUrl('helpdesk_customer_create_ticket'));
  257.                 }
  258.                 if($request->request->all())
  259.                     $form->submit($request->request->all());
  260.                 if ($form->isValid() && !count($formErrors) && !$error) {
  261.                     $data = array(
  262.                         'from' => $email//email$request->getSession()->getFlashBag()->set('success', $this->get('translator')->trans('Success ! Ticket has been created successfully.'));
  263.                         'subject' => $request->request->get('subject'),
  264.                         'reference' => $request->request->get('reference'),
  265.                         // @TODO: We need to filter js (XSS) instead of html
  266.                         'reply' => strip_tags($request->request->get('reply')),
  267.                         'firstName' => $name[0],
  268.                         'lastName' => isset($name[1]) ? $name[1] : '',
  269.                         'role' => 4,
  270.                         'active' => true
  271.                     );
  272.                     $em $this->getDoctrine()->getManager();
  273.                     if($request->request->get('subtype')){
  274.                         $data['subtype'] =  $em->getRepository('UVDeskCoreFrameworkBundle:SupportTicketSubtypes')->find($request->request->get('subtype'));
  275.                     }
  276.                     
  277.                     
  278.             
  279.                     $data['type'] = $em->getRepository('UVDeskCoreFrameworkBundle:TicketType')->find($request->request->get('type'));
  280.                     $data['priority'] = $em->getRepository('UVDeskCoreFrameworkBundle:TicketPriority')->find($request->request->get('priority'));
  281.                     if(!is_object($data['customer'] = $this->container->get('security.token_storage')->getToken()->getUser()) == "anon.") {
  282.                         $supportRole $em->getRepository('UVDeskCoreFrameworkBundle:SupportRole')->findOneByCode("ROLE_CUSTOMER");
  283.                         $customerEmail $params['email'] = $request->request->get('from');
  284.                         $customer $em->getRepository('UVDeskCoreFrameworkBundle:User')->findOneBy(array('email' => $customerEmail));
  285.                         $params['flag'] = (!$customer) ? 0;$request->getSession()->getFlashBag()->set('success'$this->get('translator')->trans('Success ! Ticket has been created successfully.'));
  286.                         $data['firstName'] = current($nameDetails explode(' '$request->request->get('name')));
  287.                         $data['fullname'] = $request->request->get('name');
  288.                         $data['lastName'] = ($data['firstName'] != end($nameDetails)) ? end($nameDetails) : " ";
  289.                         $data['from'] = $customerEmail;
  290.                         $data['role'] = 4;
  291.                         $data['customer'] = $this->get('user.service')->createUserInstance($customerEmail$data['fullname'], $supportRole$extras = ["active" => true]);
  292.                     } else {
  293.                         $userDetail $em->getRepository('UVDeskCoreFrameworkBundle:User')->find($data['customer']->getId());
  294.                         $data['email'] = $customerEmail $data['customer']->getEmail();
  295.                         $nameCollection = [$userDetail->getFirstName(), $userDetail->getLastName()];
  296.                         $name implode(' '$nameCollection);
  297.                         $data['fullname'] = $name;
  298.                     }
  299.                     $data['user'] = $data['customer'];
  300.                     $data['subject'] = $request->request->get('subject');
  301.                     $data['reference'] = $request->request->get('reference');
  302.                     $data['source'] = 'website';
  303.                     $data['threadType'] = 'create';
  304.                     $data['message'] = str_replace(['&lt;script&gt;''&lt;/script&gt;'], ''htmlspecialchars($data['reply']));
  305.                     $data['message'] = nl2br($data['message']);
  306.                     $data['createdBy'] = 'customer';
  307.                     $data['attachments'] = $request->files->get('attachments');
  308.                     $data['businessImpact'] = $post['business_impact'] ? $post['business_impact']:'';
  309.                     $data['whatsapp'] = $post['phone'] ? $post['phone']:'';
  310.                     $data['urlPlataforma'] = $post['urlPlataforma'] ? $post['urlPlataforma']:'';
  311.                     
  312.                        if($fueraDeHorario){
  313.                         // Verificar si la asignación automática está habilitada para Casa Central
  314.                         $connection $em->getConnection();
  315.                         $checkAutoAssignmentSql "
  316.                             SELECT wh.auto_assignment_enabled 
  317.                             FROM uv_support_group sg
  318.                             LEFT JOIN uv_working_hours wh ON sg.id = wh.support_group_id
  319.                             WHERE sg.name = 'Casa Central'
  320.                         ";
  321.                         $stmt $connection->prepare($checkAutoAssignmentSql);
  322.                         $stmt->execute();
  323.                         $autoAssignmentResult $stmt->fetch(\PDO::FETCH_ASSOC);
  324.                         
  325.                         // Solo asignar automáticamente si está habilitado (por defecto habilitado si no existe el registro)
  326.                         $autoAssignmentEnabled $autoAssignmentResult 
  327.                             ($autoAssignmentResult['auto_assignment_enabled'] ?? 1) : 1;
  328.                         
  329.                         if($autoAssignmentEnabled) {
  330.                             // Usar cualquier agente disponible de oficinas abiertas
  331.                             $workingHoursController $this->container->get('App\Controller\WorkingHoursController');
  332.                             $availableAgent $workingHoursController->getAvailableOfficeAgent();
  333.                             
  334.                             if($availableAgent){
  335.                                 $data['agent'] = $em->getRepository('UVDeskCoreFrameworkBundle:User')->findOneBy(array('id' => $availableAgent['agentId']));
  336.                             }
  337.                         }
  338.                         
  339.                           //Si es soporte, se selecciona un subtipo y se asigna el ticket al agente de ese grupo de subtipo que menos tickets abiertos asignados tiene
  340.                         if($request->request->get('subtype')){
  341.                             $userService $this->container->get('user.service');
  342.                             $agentUsers $userService->getAgentUsersByTicketSubtype($request->request->get('subtype'));
  343.                             if($agentUsers[0]){
  344.                                 $data['agent'] = $em->getRepository('UVDeskCoreFrameworkBundle:User')->findOneBy(array('id' => $agentUsers[0]['id']));
  345.                             }
  346.                         }
  347.                         // Si autoAssignmentEnabled es false, no se asigna ningún agente automáticamente
  348.                     }else{
  349.                         //Si es soporte, se selecciona un subtipo y se asigna el ticket al agente de ese grupo de subtipo que menos tickets abiertos asignados tiene
  350.                         if($request->request->get('subtype')){
  351.                             $userService $this->container->get('user.service');
  352.                             $agentUsers $userService->getAgentUsersByTicketSubtype($request->request->get('subtype'));
  353.                             if($agentUsers[0]){
  354.                                 $data['agent'] = $em->getRepository('UVDeskCoreFrameworkBundle:User')->findOneBy(array('id' => $agentUsers[0]['id']));
  355.                             }
  356.                         }
  357.                     }
  358.                     if(!empty($request->server->get("HTTP_CF_CONNECTING_IP") )) {
  359.                         $data['ipAddress'] = $request->server->get("HTTP_CF_CONNECTING_IP");
  360.                         if(!empty($request->server->get("HTTP_CF_IPCOUNTRY"))) {
  361.                             $data['ipAddress'] .= '(' $request->server->get("HTTP_CF_IPCOUNTRY") . ')';
  362.                         }
  363.                     }
  364.                     ///// INICIO cambio estado tipo de licencias vencidas o resto de licencias que entren en el grupo (24/7, Low cost, Lunes a viernes)
  365.                     if($isSupportActive=='0' ||  $isSupportActive=='2'){
  366.                         
  367.                      if($conexionSeries == 0){
  368.                             $thread $this->get('ticket.service')->createTicketBase($data,1);
  369.                         }else{
  370.                             $thread $this->get('ticket.service')->createTicketBase($data,1); //estado pendiente de pago
  371.                             //envio email
  372.                             $user $this->get('user.service')->getSessionUser();
  373.                             $UserClient file_get_contents($_ENV['EXTERNAL_PATH']."UserController.php?case=3&user=".$user->getEmail());
  374.                             $jsonUser=json_decode($UserClienttrue);
  375.                             $url=$_ENV['EXTERNAL_PATH']."TicketController.php?case=2&serial='".$jsonUser[0]["Nroserie"]."'&haveSupport='".$isSupportActive."'&user='".$user->getEmail()."'&subject=''&msj=''&path=''&nameFileAttachment=''";
  376.                             $aClient=file_get_contents($url);
  377.                         }
  378.                     }
  379.                     else{
  380.                         $thread $this->get('ticket.service')->createTicketBase($data,1);
  381.                     }
  382.                     ///// FIN cambio 
  383.                     
  384.                     if ($thread) {
  385.                         if($conexionSeries == 0){
  386.                             $request->getSession()->getFlashBag()->set('warning'$this->get('translator')->trans('Success ! Ticket has been created successfully. SYSTEM IN RECOVERY, CONTACT SUPPORT AT sop24op@softguard.com'));
  387.                         }else{
  388.                             $request->getSession()->getFlashBag()->set('success'$this->get('translator')->trans('Success ! Ticket has been created successfully.'));
  389.                         }
  390.                     } else {
  391.                         $request->getSession()->getFlashBag()->set('warning'$this->get('translator')->trans('Warning ! Can not create ticket, invalid details.'));
  392.                     }
  393.                     // Trigger ticket created event
  394.                     $event = new GenericEvent(CoreWorkflowEvents\Ticket\Create::getId(), [
  395.                         'entity' => $thread->getTicket(),
  396.                     ]);
  397.                     $this->get('event_dispatcher')->dispatch('uvdesk.automation.workflow.execute'$event);
  398.                     
  399.                 
  400.                     //aca se debe mandar mail de pago, para lo cual se debe insertar en quotes. FALTA DEFINIR.
  401.                     //return $this->render('@UVDeskSupportCenter/Knowledgebase/ticketList.html.twig',
  402.                       //  array(
  403.                         //    'searchDisable' => true
  404.                        // )
  405.                     //);
  406.                     if($post['priority'] == 4) {
  407.                         
  408.                             $curl curl_init();
  409.                             curl_setopt_array($curl, array(
  410.                                 CURLOPT_URL => $_ENV['URL_API'].'token.php',
  411.                                 CURLOPT_RETURNTRANSFER => true,
  412.                                 CURLOPT_ENCODING => "",
  413.                                 CURLOPT_MAXREDIRS => 10,
  414.                                 CURLOPT_TIMEOUT => 240,
  415.                                 CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1,
  416.                                 CURLOPT_CUSTOMREQUEST => "GET",
  417.                                 CURLOPT_HTTPHEADER => array(
  418.                                     "cache-control: no-cache"
  419.                                 ),
  420.                             ));
  421.                     
  422.                             $responseToken curl_exec($curl);
  423.                     
  424.                     
  425.                     
  426.                             $jResponseToken=json_decode($responseTokentrue);
  427.                             $token=$jResponseToken['token'];
  428.                     
  429.                             $envioMensaje "https://sistema.softguard.com/sistema/sg/endpoint/ticketera-addlectura.php?t=".$token."&ticket=".$thread->getTicket()->getCodigoSeries()."&evento=6&ticketera=".$thread->getTicket()->getId();
  430.                    
  431.                     
  432.                             $curl curl_init();
  433.                             curl_setopt_array($curl, array(
  434.                                 CURLOPT_URL => $envioMensaje,
  435.                                 CURLOPT_RETURNTRANSFER => true,
  436.                                 CURLOPT_ENCODING => "",
  437.                                 CURLOPT_MAXREDIRS => 10,
  438.                                 CURLOPT_TIMEOUT => 240,
  439.                                 CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1,
  440.                                 CURLOPT_CUSTOMREQUEST => "POST",
  441.                                 CURLOPT_HTTPHEADER => array(
  442.                                     "cache-control: no-cache"
  443.                                 ),
  444.                             ));
  445.                     
  446.                             $idioms curl_exec($curl);
  447.                    
  448.                             curl_close($curl);
  449.                         $session->set('critical'date("Y-m-d H:i:s"));
  450.                         $this->solicitarUrgencia($thread->getTicket(), $em);
  451.                     }
  452.                     return $this->redirect($this->generateUrl('helpdesk_customer_ticket_collection'));
  453.                     //return $this->redirect($this->generateUrl('helpdesk_customer_create_ticket'));
  454.                 } else {
  455.                     $errors $this->getFormErrors($form);
  456.                     $errors array_merge($errors$formErrors);
  457.                 }
  458.             } else {
  459.                 $this->addFlash(
  460.                     'warning',
  461.                     $this->get('translator')->trans("Warning ! Post size can not exceed 25MB")
  462.                 );
  463.             }
  464.             if(isset($errors) && count($errors)) {
  465.                 $this->addFlash('warning'key($errors) . ': ' reset($errors));
  466.             }
  467.         }
  468.         $sesion=null;
  469.         if($this->get('user.service')->getSessionUser()!=null)
  470.             $sesion=true;
  471.         $breadcrumbs = [
  472.             [
  473.                 'label' => $this->get('translator')->trans('Support Center'),
  474.                 'url' => $this->generateUrl('helpdesk_knowledgebase'), 'sesion'=> $sesion
  475.             ],
  476.             [
  477.                 'label' => $this->get('translator')->trans("Create Ticket Request"),
  478.                 'url' => '#''sesion'=> $sesion
  479.             ],
  480.         ];
  481.         
  482.         return $this->render('@UVDeskSupportCenter/Knowledgebase/ticket.html.twig',
  483.             array(
  484.                 'formErrors' => $formErrors,
  485.                 'errors' => json_encode($errors),
  486.                 'customFieldsValues' => $request->request->get('customFields'),
  487.                 'breadcrumbs' => $breadcrumbs,
  488.                 'post' => $post,
  489.                 'fueraDeHorario' => $fueraDeHorario,
  490.                 'isSupportActive' => $isSupportActive,
  491.                 'esFeriado' => $esFeriado
  492.             )
  493.         );
  494.     }
  495.     public function ticketList(Request $request)
  496.     {
  497.         
  498.         $em $this->getDoctrine()->getManager();
  499.         $ticketRepo $em->getRepository('UVDeskCoreFrameworkBundle:Ticket');
  500.         $currentUser $this->get('security.token_storage')->getToken()->getUser();
  501.         if(!$currentUser || $currentUser == "anon.") {
  502.             //throw error
  503.         }
  504.         
  505.         $tickets $ticketRepo->getAllCustomerTickets($currentUser);
  506.     
  507.         return $this->render('@UVDeskSupportCenter/Knowledgebase/ticketList.html.twig', array(
  508.             'ticketList' => $tickets,
  509.         ));
  510.     }
  511.     public function changeStatus(int $id,Request $request){
  512.         
  513.         $nova = array(" ");
  514.         $entityManager $this->getDoctrine()->getManager();
  515.         $ticket $this->getDoctrine()->getRepository('UVDeskCoreFrameworkBundle:Ticket')->find($id);
  516.         //Solicitud de urgencia en session
  517.         $session $request->getSession();
  518.         if($session->get('critical')){
  519.             $start_date = new \DateTime($session->get('critical'));
  520.             $since_start $start_date->diff(new \DateTime(date("Y-m-d H:i:s")));
  521.             if($since_start->10){
  522.                 $session->remove('critical');
  523.             }else{
  524.                 $request->getSession()->getFlashBag()->set('warning'$this->get('translator')->trans('Warning ! You previously requested an emergency, please wait 10 minutes and try again.'));
  525.                 return $this->redirect($this->generateUrl('helpdesk_customer_ticket',array(
  526.                     'id' => $ticket->getId()
  527.                 )));
  528.             }
  529.         }
  530.         $session->set('critical'date("Y-m-d H:i:s"));
  531.        
  532.         //Modificacion para validar si se muestra el boton.
  533.         $currentThread =  $this->getDoctrine()->getRepository('UVDeskCoreFrameworkBundle:Thread')->getTicketCurrentThread($ticket);
  534.        
  535.         $attachments $entityManager->getRepository(Attachment::class)->findByThread($currentThread);
  536.         
  537.         $subject utf8_encode($ticket->getSubject());
  538.         $subject str_replace($nova"<BLANK>"$subject);
  539.         $msj utf8_encode($currentThread->getMessage());
  540.         $msj str_replace($nova"<BLANK>"$msj);
  541.         
  542.         if(count($attachments)){
  543.             $pathutf8_encode($attachments[0]->getPath());
  544.             $path str_replace($nova"<BLANK>"$path);
  545.         
  546.             $nameFileAttachment=utf8_encode($attachments[0]->getName());
  547.             $nameFileAttachment str_replace($nova"<BLANK>"$nameFileAttachment);
  548.         }else{
  549.             $nameFileAttachment=$path='';
  550.         }
  551.         $user $this->get('user.service')->getSessionUser();
  552.         $haveSupport file_get_contents($_ENV['EXTERNAL_PATH']."UserController.php?case=1&user=".$user->getEmail());
  553.         if($haveSupport == -1){
  554.             $request->getSession()->getFlashBag()->set('warning'$this->get('translator')->trans('Warning ! Cannot create ticket, connection failed.'));
  555.             return $this->redirect($this->generateUrl('helpdesk_customer_ticket',array(
  556.                 'id' => $ticket->getId()
  557.             )));
  558.         }      
  559.         if($haveSupport==1//24/7
  560.             $TicketStatus $entityManager->getRepository('UVDeskCoreFrameworkBundle:TicketStatus')->findOneById("8"); //in process of attention
  561.         // no debe aparecer el boton por lo tanto aqui no deberia entrar
  562.         // if($haveSupport==2) 
  563.         // $TicketStatus = $entityManager->getRepository('UVDeskCoreFrameworkBundle:TicketStatus')->findOneById("7");
  564.         
  565.         if($haveSupport==3//Low Cost
  566.             $TicketStatus $entityManager->getRepository('UVDeskCoreFrameworkBundle:TicketStatus')->findOneById("7");//Pending Payment
  567.         
  568.         $TicketPriority $entityManager->getRepository('UVDeskCoreFrameworkBundle:TicketPriority')->findOneById("4"); // Urgent
  569.     
  570.         $UserClient file_get_contents($_ENV['EXTERNAL_PATH']."UserController.php?case=3&user=".$user->getEmail());
  571.         $jsonUser=json_decode($UserClienttrue);
  572.         $str$_SERVER['HTTP_REFERER'];
  573.         $param_url=explode("public/",$str);
  574.         $lang=substr($param_url[1],0,2);
  575.         $url=$_ENV['EXTERNAL_PATH']."TicketController.php?case=1&serial='".$jsonUser[0]["Nroserie"]."'&haveSupport='".$haveSupport."'&user='".$user->getEmail()."'&subject='".$subject."'&msj='".$msj."'&path='".$path."'&nameFileAttachment='".$nameFileAttachment."'&lang='".$lang."'";
  576.         //$aClient=file_get_contents($url);
  577.         //$idTicketSeries = file_get_contents($url);
  578.         if (($idTicketSeries = @file_get_contents($url)) === false) {
  579.             $error error_get_last();
  580.             $myfileIdTicket fopen("log_id_ticket_series_err.txt""a") or die ("Unable to open file!");
  581.             fwrite($myfileIdTicket$error['message']);
  582.             fclose($myfileIdTicket);
  583.         }
  584.         $myfileIdTicket fopen("log_id_ticket_series.txt""a") or die ("Unable to open file!");
  585.         fwrite($myfileIdTicket$idTicketSeries);
  586.         fclose($myfileIdTicket);
  587.         if($idTicketSeries == -|| $idTicketSeries == 0){
  588.             $request->getSession()->getFlashBag()->set('warning'$this->get('translator')->trans('Warning ! Cannot create ticket, connection failed.'));
  589.             return $this->redirect($this->generateUrl('helpdesk_customer_ticket',array(
  590.                 'id' => $ticket->getId()
  591.             )));
  592.         }
  593.         $ticket->setCodigoSeries($idTicketSeries);
  594.         $ticket->setPriority($TicketPriority);
  595.         $ticket->setStatus($TicketStatus);
  596.         $entityManager->persist($ticket);
  597.         $entityManager->flush();
  598.           
  599.         
  600.         ///////////////////////////
  601.         $this->addFlash('success',$this->get('translator')->trans("SuccessUrgency ! Urgency requested successfully."));
  602.         
  603.         return $this->redirect($this->generateUrl('helpdesk_customer_ticket',array(
  604.             'id' => $ticket->getId()
  605.         )));
  606.     }
  607.     public function rollback(int $id,Request $request){
  608.         $nova = array(" ");
  609.         $entityManager $this->getDoctrine()->getManager();
  610.         $ticket $this->getDoctrine()->getRepository('UVDeskCoreFrameworkBundle:Ticket')->find($id);
  611.        
  612.         
  613.         $currentThread =  $this->getDoctrine()->getRepository('UVDeskCoreFrameworkBundle:Thread')->getTicketCurrentThread($ticket);
  614.         $attachments $entityManager->getRepository(Attachment::class)->findByThread($currentThread);
  615.         
  616.         
  617.         $TicketStatus $entityManager->getRepository('UVDeskCoreFrameworkBundle:TicketStatus')->findOneById("1");
  618.         
  619.         $TicketPriority $entityManager->getRepository('UVDeskCoreFrameworkBundle:TicketPriority')->findOneById("1");
  620.             
  621.         $ticket->setPriority($TicketPriority);
  622.         $ticket->setStatus($TicketStatus);
  623.         $entityManager->persist($ticket);
  624.         $entityManager->flush();
  625.         $user $this->get('user.service')->getSessionUser();
  626.         $UserClient file_get_contents($_ENV['EXTERNAL_PATH']."UserController.php?case=3&user=".$user->getEmail());
  627.         if($UserClient == -1){
  628.             $request->getSession()->getFlashBag()->set('warning'$this->get('translator')->trans('Warning ! Cannot create ticket, connection failed.'));
  629.             return $this->redirect($this->generateUrl('helpdesk_customer_ticket',array(
  630.                 'id' => $ticket->getId()
  631.             )));
  632.         }
  633.         $jsonUser=json_decode($UserClienttrue);
  634.         $url=$_ENV['EXTERNAL_PATH']."TicketController.php?case=3&codigo_series='".$ticket->getCodigoSeries()."'&user='".$user->getEmail();
  635.        // $url=$_ENV['EXTERNAL_PATH']."TicketController.php?case=3&serial='".$jsonUser[0]["Nroserie"];
  636.         
  637.         $aClient=file_get_contents($url);   
  638.         if($aClient == -1){
  639.             $request->getSession()->getFlashBag()->set('warning'$this->get('translator')->trans('Warning ! Cannot create ticket, connection failed.'));
  640.             return $this->redirect($this->generateUrl('helpdesk_customer_ticket',array(
  641.                 'id' => $ticket->getId()
  642.             )));
  643.         }
  644.         
  645.         $this->addFlash('success',$this->get('translator')->trans("SuccessCanceled ! Urgency Canceled."));
  646.         
  647.         return $this->redirect($this->generateUrl('helpdesk_customer_ticket',array(
  648.             'id' => $ticket->getId()
  649.         )));
  650.     }
  651.     public function saveReply(int $idRequest $request)
  652.     {
  653.         $this->isWebsiteActive();
  654.         $data $request->request->all();
  655.         $ticket $this->getDoctrine()->getRepository('UVDeskCoreFrameworkBundle:Ticket')->find($id);
  656.         if($_POST) {
  657.             if(str_replace(' ','',str_replace('&nbsp;','',trim(strip_tags($data['message'], '<img>')))) != "") {
  658.                 if(!$ticket)
  659.                     $this->noResultFound();
  660.                 $data['ticket'] = $ticket;
  661.                 $data['user'] = $this->get('user.service')->getCurrentUser();
  662.                 // @TODO: Refactor -> Why are we filtering only these two characters?
  663.                 $data['message'] = str_replace(['&lt;script&gt;''&lt;/script&gt;'], ''$data['message']);
  664.                 $userDetail $this->get('user.service')->getCustomerPartialDetailById($data['user']->getId());
  665.                 $data['fullname'] = $userDetail['name'];
  666.                 $data['source'] = 'website';
  667.                 $data['createdBy'] = 'customer';
  668.                 $data['attachments'] = $request->files->get('attachments');
  669.                 
  670.                 $em $this->getDoctrine()->getManager();
  671.                 $status $em->getRepository('UVDeskCoreFrameworkBundle:TicketStatus')->findOneByCode($data['status']);
  672.                // if($ticket->getStatus()->getId() == 5 || $ticket->getStatus()->getId() == 2 || $ticket->getStatus()->getId() == 3 || $ticket->getStatus()->getId() == 9){
  673.                     $ticket->setStatus($em->getRepository('UVDeskCoreFrameworkBundle:TicketStatus')->findOneByCode("open"));
  674.                // }
  675.                 $thread $this->get('ticket.service')->createThread($ticket$data);
  676.                 if($ticket->getPriority()->getId() == 4){
  677.                     $curl curl_init();
  678.                     curl_setopt_array($curl, array(
  679.                         CURLOPT_URL => $_ENV['URL_API'].'token.php',
  680.                         CURLOPT_RETURNTRANSFER => true,
  681.                         CURLOPT_ENCODING => "",
  682.                         CURLOPT_MAXREDIRS => 10,
  683.                         CURLOPT_TIMEOUT => 240,
  684.                         CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1,
  685.                         CURLOPT_CUSTOMREQUEST => "GET",
  686.                         CURLOPT_HTTPHEADER => array(
  687.                             "cache-control: no-cache"
  688.                         ),
  689.                     ));
  690.             
  691.                     $responseToken curl_exec($curl);
  692.             
  693.             
  694.             
  695.                     $jResponseToken=json_decode($responseTokentrue);
  696.                     $token=$jResponseToken['token'];
  697.             
  698.                     $envioMensaje "https://sistema.softguard.com/sistema/sg/endpoint/ticketera-addlectura.php?t=".$token."&ticket=".$ticket->getCodigoSeries()."&evento=6&ticketera=".$ticket->getId();
  699.            
  700.                     
  701.                     $curl curl_init();
  702.                     curl_setopt_array($curl, array(
  703.                         CURLOPT_URL => $envioMensaje,
  704.                         CURLOPT_RETURNTRANSFER => true,
  705.                         CURLOPT_ENCODING => "",
  706.                         CURLOPT_MAXREDIRS => 10,
  707.                         CURLOPT_TIMEOUT => 240,
  708.                         CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1,
  709.                         CURLOPT_CUSTOMREQUEST => "POST",
  710.                         CURLOPT_HTTPHEADER => array(
  711.                             "cache-control: no-cache"
  712.                         ),
  713.                     ));
  714.             
  715.                     $idioms curl_exec($curl);
  716.            
  717.                     curl_close($curl);
  718.                 }
  719.                 if($status) {
  720.                     $flag 0;
  721.                     if($ticket->getStatus() != $status) {
  722.                         $flag 1;
  723.                     }
  724.                     $ticket->setStatus($status);
  725.                     $em->persist($ticket);
  726.                     $em->flush();
  727.                 }
  728.                 // Trigger customer reply event
  729.                 $event = new GenericEvent(CoreWorkflowEvents\Ticket\CustomerReply::getId(), [
  730.                     'entity' =>  $ticket,
  731.                 ]);
  732.                 $this->get('event_dispatcher')->dispatch('uvdesk.automation.workflow.execute'$event);
  733.                 $this->addFlash('success'$this->get('translator')->trans("Success ! Reply added successfully."));
  734.             } else {
  735.                 $this->addFlash(
  736.                     'warning',
  737.                     $this->get('translator')->trans("Warning ! Reply field can not be blank.")
  738.                 );
  739.             }
  740.         } else {
  741.             $this->addFlash(
  742.                 'warning',
  743.                 $this->get('translator')->trans("Warning ! Post size can not exceed 25MB")
  744.             );
  745.         }
  746.         
  747.         
  748.         return $this->redirect($this->generateUrl('helpdesk_customer_ticket',array(
  749.             'id' => $ticket->getId()
  750.         )));
  751.     }
  752.     public function tickets(Request $request)
  753.     {
  754.         $this->isWebsiteActive();
  755.         
  756.        /*
  757.         $str= substr($_SERVER['HTTP_REFERER'], strlen($_SERVER['HTTP_REFERER'])-5,5);
  758.         if($str=='login')
  759.             return $this->redirect($this->generateUrl('helpdesk_knowledgebase'));
  760.     */
  761.         return $this->render('@UVDeskSupportCenter/Knowledgebase/ticketList.html.twig',
  762.             array(
  763.                 'searchDisable' => true
  764.             )
  765.         );
  766.     }
  767.     /**
  768.      * ticketListXhrAction "Filter and sort ticket collection on ajax request"
  769.      * @param Object $request "HTTP Request object"
  770.      * @return JSON "JSON response"
  771.      */
  772.     public function ticketListXhr(Request $request)
  773.     {
  774.         
  775.         
  776.         $this->isWebsiteActive();
  777.         $json = array();
  778.         if($request->isXmlHttpRequest()) {
  779.             $repository $this->getDoctrine()->getRepository('UVDeskCoreFrameworkBundle:Ticket');
  780.     
  781.             $json $repository->getAllCustomerTickets($request->query$this->container);
  782.         }
  783.         //prueba
  784.         //$a=file_get_contents("http://localhost/uvdesk/1.0.6/external/controlador.php");
  785.         $response = new Response(json_encode($json));
  786.         $response->headers->set('Content-Type''application/json');
  787.         return $response;
  788.     }
  789.     /**
  790.      * threadListXhrAction "Filter and sort user collection on ajx request"
  791.      * @param Object $request "HTTP Request object"
  792.      * @return JSON "JSON response"
  793.      */
  794.     public function threadListXhr(Request $request)
  795.     {
  796.         $this->isWebsiteActive();
  797.         $json = array();
  798.         if($request->isXmlHttpRequest()) {
  799.             $ticket $this->getDoctrine()->getRepository('UVDeskCoreFrameworkBundle:Ticket')->find($request->attributes->get('id'));
  800.             // $this->denyAccessUnlessGranted('FRONT_VIEW', $ticket);
  801.             $repository $this->getDoctrine()->getRepository('UVDeskCoreFrameworkBundle:Thread');
  802.             $json $repository->getAllCustomerThreads($request->attributes->get('id'),$request->query$this->container);
  803.         }
  804.         $response = new Response(json_encode($json));
  805.         $response->headers->set('Content-Type''application/json');
  806.         return $response;
  807.     }
  808.     public function ticketView($idRequest $request)
  809.     {
  810.         $this->isWebsiteActive();
  811.         
  812.         $entityManager $this->getDoctrine()->getManager();
  813.         $user $this->get('user.service')->getSessionUser();
  814.         $ticket $entityManager->getRepository(TicketEntity::class)->findOneBy(['id' => $id'customer' => $user]);
  815.         
  816.         ///////////////////////////
  817.         //Modificacion para validar si se muestra el boton. getEmail()
  818.     $conexionSeries 1;
  819.         $isSupportActive=file_get_contents($_ENV['EXTERNAL_PATH']."UserController.php?case=1&user=".$user->getEmail());
  820.     if($isSupportActive == -1){
  821.             $isSupportActive 0;
  822.             $conexionSeries 0;
  823.         }
  824.         if($conexionSeries == 0){
  825.             $isEnabledButton 0;
  826.         }else{
  827.             $isEnabledButton=file_get_contents($_ENV['EXTERNAL_PATH']."UserController.php?case=2");
  828.         }       
  829.        
  830.         ///////////////////////////
  831.         if($conexionSeries == 0) {
  832.             $esFeriado 0;
  833.         }else{
  834.             //Validación día feriado
  835.             $esFeriado=file_get_contents($_ENV['EXTERNAL_PATH']."UserController.php?case=4");
  836.         }
  837.         if (empty($ticket)) {
  838.             throw new NotFoundHttpException('Page Not Found!');
  839.         }
  840.         if (!empty($user) && $user->getId() == $ticket->getCustomer()->getId()) {
  841.            // $ticket->setIsCustomerViewed(1);
  842.             $entityManager->persist($ticket);
  843.             $entityManager->flush();
  844.         }
  845.         
  846.       
  847.         $twigResponse = [
  848.             'ticket' => $ticket,
  849.             'searchDisable' => true,
  850.             'initialThread' => $this->get('ticket.service')->getTicketInitialThreadDetails($ticket),
  851.             'localizedCreateAtTime' => $this->get('user.service')->getLocalizedFormattedTime($user$ticket->getCreatedAt()),
  852.             'isSupportActive'=>$isSupportActive,
  853.             'isEnabledButton'=>$isEnabledButton,
  854.             'esFeriado'=>$esFeriado,
  855.         'conexionSeries'=>$conexionSeries
  856.         ];
  857.         return $this->render('@UVDeskSupportCenter/Knowledgebase/ticketView.html.twig'$twigResponse);
  858.     }
  859.     // Ticket rating
  860.     public function rateTicket(Request $request) {
  861.         $this->isWebsiteActive();
  862.         $json = array();
  863.         $em $this->getDoctrine()->getManager();
  864.         $data json_decode($request->getContent(), true);
  865.         $id $data['id'];
  866.         $count intval($data['rating']);
  867.         
  868.         if($count || $count 6) {
  869.             $ticket $em->getRepository('UVDeskCoreFrameworkBundle:Ticket')->find($id);
  870.             $customer $this->get('user.service')->getCurrentUser();
  871.             $rating $em->getRepository('UVDeskCoreFrameworkBundle:TicketRating')->findOneBy(array('ticket' => $id,'customer'=>$customer->getId()));
  872.             if($rating) {
  873.                 $rating->setcreatedAt(new \DateTime);
  874.                 $rating->setStars($count);
  875.                 $em->persist($rating);
  876.                 $em->flush();
  877.             } else {
  878.                 $rating = new TicketRating();
  879.                 $rating->setStars($count);
  880.                 $rating->setCustomer($customer);
  881.                 $rating->setTicket($ticket);
  882.                 $em->persist($rating);
  883.                 $em->flush();
  884.             }
  885.             $json['alertClass'] = 'success';
  886.             $json['alertMessage'] = $this->get('translator')->trans('Success ! Rating has been successfully added.');
  887.         } else {
  888.             $json['alertClass'] = 'danger';
  889.             $json['alertMessage'] = $this->get('translator')->trans('Warning ! Invalid rating.');
  890.         }
  891.         $response = new Response(json_encode($json));
  892.         $response->headers->set('Content-Type''application/json');
  893.         return $response;
  894.     }
  895.     public function voteTicket(Request $request) {
  896.         $this->isWebsiteActive();
  897.         $json = array();
  898.         $em $this->getDoctrine()->getManager();
  899.         $id $request->attributes->get('id');
  900.         $count intval($request->attributes->get('vote')); 
  901.         $comment $request->attributes->get('comment');
  902. /* 
  903.         if($count > 0 || $count < 4) {
  904.             $ticket = $em->getRepository('UVDeskCoreFrameworkBundle:Ticket')->find($id);
  905.             $customer = $this->get('user.service')->getCurrentUser();
  906.             $ticket->setVote($count);
  907.             $em->persist($ticket);
  908.             $em->flush();
  909.           
  910.            
  911.             $json['alertClass'] = 'success';
  912.             $json['alertMessage'] = $this->get('translator')->trans('Success ! Rating has been successfully added.');
  913.         } else {
  914.             $json['alertClass'] = 'danger';
  915.             $json['alertMessage'] = $this->get('translator')->trans('Warning ! Invalid rating.');
  916.         }
  917.  */
  918.         if($count || $count 6) {
  919.             $ticket $em->getRepository('UVDeskCoreFrameworkBundle:Ticket')->find($id);
  920.             $customer $this->get('user.service')->getCurrentUser();
  921.             $rating $em->getRepository('UVDeskCoreFrameworkBundle:TicketRating')->findOneBy(array('ticket' => $id,'customer'=>$customer->getId()));
  922.             if($rating) {
  923.                 $rating->setcreatedAt(new \DateTime);
  924.                 $rating->setStars($count);
  925.                 $rating->setFeedback($comment);
  926.                 $em->persist($rating);
  927.                 $em->flush();
  928.             } else {
  929.                 $rating = new TicketRating();
  930.                 $rating->setStars($count);
  931.                 $rating->setFeedback($comment);
  932.                 $rating->setCustomer($customer);
  933.                 $rating->setTicket($ticket);
  934.                 $em->persist($rating);
  935.                 $em->flush();
  936.             }
  937.             $json['alertClass'] = 'success';
  938.             $json['alertMessage'] = $this->get('translator')->trans('Success ! Rating has been successfully added.');
  939.         } else {
  940.             $json['alertClass'] = 'danger';
  941.             $json['alertMessage'] = $this->get('translator')->trans('Warning ! Invalid rating.');
  942.         }
  943.         $response = new Response(json_encode($json));
  944.         $response->headers->set('Content-Type''application/json');
  945.         return $response;
  946.     }
  947.     public function downloadAttachmentZip(Request $request)
  948.     {
  949.         $threadId $request->attributes->get('threadId');
  950.         $attachmentRepository $this->getDoctrine()->getManager()->getRepository('UVDeskCoreFrameworkBundle:Attachment');
  951.         $attachment $attachmentRepository->findByThread($threadId);
  952.         if (!$attachment) {
  953.             $this->noResultFound();
  954.         }
  955.         $zipname 'attachments/' .$threadId.'.zip';
  956.         $zip = new \ZipArchive;
  957.         $zip->open($zipname, \ZipArchive::CREATE);
  958.         if(count($attachment)){
  959.             foreach ($attachment as $attach) {
  960.                 $zip->addFile(substr($attach->getPath(), 1)); 
  961.             }
  962.         }
  963.         $zip->close();
  964.         $response = new Response();
  965.         $response->setStatusCode(200);
  966.         $response->headers->set('Content-type''application/zip');
  967.         $response->headers->set('Content-Disposition''attachment; filename=' $threadId '.zip');
  968.         $response->sendHeaders();
  969.         $response->setContent(readfile($zipname));
  970.         return $response;
  971.     }
  972.     public function downloadAttachment(Request $request)
  973.     {
  974.         $attachmendId $request->attributes->get('attachmendId');
  975.         $attachmentRepository $this->getDoctrine()->getManager()->getRepository('UVDeskCoreFrameworkBundle:Attachment');
  976.         $attachment $attachmentRepository->findOneById($attachmendId);
  977.         $baseurl $request->getScheme() . '://' $request->getHttpHost() . $request->getBasePath();
  978.         if (!$attachment) {
  979.             $this->noResultFound();
  980.         }
  981.         $path $this->get('kernel')->getProjectDir() . "/public/"$attachment->getPath();
  982.         $response = new Response();
  983.         $response->setStatusCode(200);
  984.         
  985.         $response->headers->set('Content-type'$attachment->getContentType());
  986.         $response->headers->set('Content-Disposition''attachment; filename='$attachment->getName());
  987.         $response->sendHeaders();
  988.         $response->setContent(readfile($path));
  989.         
  990.         return $response;
  991.     }
  992.     
  993.     public function ticketCollaboratorXhr(Request $request)
  994.     {
  995.         $json = array();
  996.         $content json_decode($request->getContent(), true);
  997.         $em $this->getDoctrine()->getManager();
  998.         $ticket $em->getRepository('UVDeskCoreFrameworkBundle:Ticket')->find($content['ticketId']);
  999.         
  1000.         if ($request->getMethod() == "POST") {
  1001.             if ($content['email'] == $ticket->getCustomer()->getEmail()) {
  1002.                 $json['alertClass'] = 'danger';
  1003.                 $json['alertMessage'] = $this->get('translator')->trans('Error ! Can not add customer as a collaborator.');
  1004.             } else {
  1005.                 $data = array(
  1006.                     'from' => $content['email'],
  1007.                     'firstName' => ($firstName ucfirst(current(explode('@'$content['email'])))),
  1008.                     'lastName' => ' ',
  1009.                     'role' => 4,
  1010.                 );
  1011.                 $supportRole $em->getRepository('UVDeskCoreFrameworkBundle:SupportRole')->findOneByCode('ROLE_CUSTOMER');
  1012.                 $collaborator $this->get('user.service')->createUserInstance($data['from'], $data['firstName'], $supportRole$extras = ["active" => true]);
  1013.                 
  1014.                 $checkTicket $em->getRepository('UVDeskCoreFrameworkBundle:Ticket')->isTicketCollaborator($ticket,$content['email']);
  1015.                 
  1016.                 if (!$checkTicket) {
  1017.                     $ticket->addCollaborator($collaborator);
  1018.                     $em->persist($ticket);
  1019.                     $em->flush();
  1020.                     $ticket->lastCollaborator $collaborator;
  1021.                     $collaborator $em->getRepository('UVDeskCoreFrameworkBundle:User')->find($collaborator->getId());
  1022.                    
  1023.                     $json['collaborator'] =  $this->get('user.service')->getCustomerPartialDetailById($collaborator->getId());
  1024.                     $json['alertClass'] = 'success';
  1025.                     $json['alertMessage'] = $this->get('translator')->trans('Success ! Collaborator added successfully.');
  1026.                 } else {
  1027.                     $json['alertClass'] = 'danger';
  1028.                     $json['alertMessage'] = $this->get('translator')->trans('Error ! Collaborator is already added.');
  1029.                 }
  1030.             }
  1031.         } elseif ($request->getMethod() == "DELETE") {
  1032.             $collaborator $em->getRepository('UVDeskCoreFrameworkBundle:User')->findOneBy(array('id' => $request->attributes->get('id')));
  1033.             
  1034.             if ($collaborator) {
  1035.                 $ticket->removeCollaborator($collaborator);
  1036.                 $em->persist($ticket);
  1037.                 $em->flush();
  1038.                 $json['alertClass'] = 'success';
  1039.                 $json['alertMessage'] = $this->get('translator')->trans('Success ! Collaborator removed successfully.');
  1040.             } else {
  1041.                 $json['alertClass'] = 'danger';
  1042.                 $json['alertMessage'] = $this->get('translator')->trans('Error ! Invalid Collaborator.');
  1043.             }
  1044.         }
  1045.         $response = new Response(json_encode($json));
  1046.         $response->headers->set('Content-Type''application/json');
  1047.         return $response;
  1048.     }
  1049.     
  1050.       public function getTicketChatStatusXHR(Request $request)
  1051.     {
  1052.         
  1053.         $entityManager $this->getDoctrine()->getManager();
  1054.         $ticketId $request->get('id');
  1055.         $json = [];
  1056.         $ticket $entityManager->getRepository('UVDeskCoreFrameworkBundle:Ticket')->findOneById($ticketId);
  1057.         if (!empty($ticket)) {
  1058.             $isStarred $ticket->getIsStarred();
  1059.           
  1060.             if ($request->isXmlHttpRequest()) {
  1061.                 $json['isStarred'] = $isStarred;
  1062.             }
  1063.             
  1064.             return new Response(json_encode($json), 200, ['Content-Type' => 'application/json']);
  1065.         } else {
  1066.             return new Response(json_encode(['error' => 'Ticket not found']), 404, ['Content-Type' => 'application/json']);
  1067.         }
  1068.     }
  1069. }