<?php
//SI
namespace Webkul\UVDesk\SupportCenterBundle\Controller;
use Symfony\Component\HttpFoundation\Request;
use Symfony\Component\HttpFoundation\Response;
use Symfony\Component\EventDispatcher\GenericEvent;
use Webkul\UVDesk\CoreFrameworkBundle\Entity\Thread;
use Webkul\UVDesk\CoreFrameworkBundle\Entity\Website;
use Symfony\Component\Validator\Constraints\DateTime;
use Symfony\Component\Security\Core\User\UserInterface;
use Symfony\Bundle\FrameworkBundle\Controller\Controller;
use Webkul\UVDesk\CoreFrameworkBundle\Entity\TicketRating;
use Webkul\UVDesk\SupportCenterBundle\Form\Ticket as TicketForm;
use Symfony\Component\HttpKernel\Exception\NotFoundHttpException;
use Webkul\UVDesk\SupportCenterBundle\Entity\KnowledgebaseWebsite;
use Webkul\UVDesk\CoreFrameworkBundle\Entity\Ticket as TicketEntity;
use Webkul\UVDesk\CoreFrameworkBundle\Workflow\Events as CoreWorkflowEvents;
use Symfony\Component\Process\PhpProcess;
use Webkul\UVDesk\SupportCenterBundle\Controller\ObjClient;
use Webkul\UVDesk\CoreFrameworkBundle\Entity\Attachment;
use Webkul\UVDesk\CoreFrameworkBundle\Entity\SupportTicketSubtypes;
class Ticket extends Controller
{
protected function isWebsiteActive()
{
$entityManager = $this->getDoctrine()->getManager();
$website = $entityManager->getRepository(Website::class)->findOneByCode('knowledgebase');
if (!empty($website)) {
$knowledgebaseWebsite = $entityManager->getRepository(KnowledgebaseWebsite::class)->findOneBy(['website' => $website->getId(), 'status' => 1]);
if (!empty($knowledgebaseWebsite) && true == $knowledgebaseWebsite->getIsActive()) {
return true;
}
}
$this->noResultFound();
}
/**
* If customer is playing with url and no result is found then what will happen
* @return
*/
protected function noResultFound()
{
throw new NotFoundHttpException('Not found !');
}
public function solicitarUrgencia($ticket, $entityManager)
{
$nova = array(" ");
//Modificacion para validar si se muestra el boton.
$currentThread = $this->getDoctrine()->getRepository('UVDeskCoreFrameworkBundle:Thread')->getTicketCurrentThread($ticket);
$attachments = $entityManager->getRepository(Attachment::class)->findByThread($currentThread);
$subject = utf8_encode($ticket->getSubject());
$subject = str_replace($nova, "<BLANK>", $subject);
$msj = utf8_encode($currentThread->getMessage());
$msj = str_replace($nova, "<BLANK>", $msj);
if(count($attachments)){
$path= utf8_encode($attachments[0]->getPath());
$path = str_replace($nova, "<BLANK>", $path);
$nameFileAttachment=utf8_encode($attachments[0]->getName());
$nameFileAttachment = str_replace($nova, "<BLANK>", $nameFileAttachment);
}else{
$nameFileAttachment=$path='';
}
$user = $this->get('user.service')->getSessionUser();
$haveSupport = file_get_contents($_ENV['EXTERNAL_PATH']."UserController.php?case=1&user=".$user->getEmail());
if($haveSupport==1) //24/7
$TicketStatus = $entityManager->getRepository('UVDeskCoreFrameworkBundle:TicketStatus')->findOneById("8"); //in process of attention
if($haveSupport==3) //Low Cost
$TicketStatus = $entityManager->getRepository('UVDeskCoreFrameworkBundle:TicketStatus')->findOneById("7");//Pending Payment
$TicketPriority = $entityManager->getRepository('UVDeskCoreFrameworkBundle:TicketPriority')->findOneById("4"); // Urgent
$UserClient = file_get_contents($_ENV['EXTERNAL_PATH']."UserController.php?case=3&user=".$user->getEmail());
$jsonUser=json_decode($UserClient, true);
$str= $_SERVER['HTTP_REFERER'];
$param_url=explode("public/",$str);
$lang=substr($param_url[1],0,2);
//$lang='es';
//$haveSupport=1;
$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()."'";
$idTicketSeries = file_get_contents($url);
$ticket->setCodigoSeries($idTicketSeries);
$ticket->setPriority($TicketPriority);
$ticket->setStatus($TicketStatus);
$entityManager->persist($ticket);
$entityManager->flush();
}
public function trans($text)
{
return $this->container->get('translator')->trans($text);
}
public function getTicketData(Request $request) {
$supportTicketSubtypesId = $request->query->get('supportTicketSubtypesId');
// Conectar a la base de datos
$connection = $this->getDoctrine()->getConnection();
// Consulta para obtener el subtipo de ticket
$subtypeQuery = 'SELECT * FROM uv_ticket_subtype WHERE id = :id';
$stmt = $connection->prepare($subtypeQuery);
$stmt->execute(['id' => $supportTicketSubtypesId]);
$supportTicketSubtype = $stmt->fetch();
if (!$supportTicketSubtype) {
return new Response(json_encode(['error' => 'No se encontró el subtipo de ticket']), Response::HTTP_NOT_FOUND);
}
// Consulta para obtener los datos del ticket
$dataQuery = '
SELECT d.id, d.data, d.tipo, ds.required
FROM uv_ticket_data d
JOIN uv_ticket_data_subtype ds ON ds.id_ticket_data = d.id
WHERE ds.id_ticket_subtype = :id_ticket_subtype
';
$stmt = $connection->prepare($dataQuery);
$stmt->execute(['id_ticket_subtype' => $supportTicketSubtypesId]);
$ticketDataCollection = $stmt->fetchAll();
$translator = $this->container->get('translator');
// $emailPlaceholders['ticket.status'] = $translator->trans($emailPlaceholders['ticket.status'],[],'messages',$language);
// Convertir los datos a un arreglo
$ticketDataArray = [];
foreach ($ticketDataCollection as $ticketData) {
$ticketDataArray[] = [
'data' => $translator->trans($ticketData['data']),
'required' => $ticketData['required'],
// Agrega otras propiedades que necesites
];
}
// Preparar la respuesta
$responseArray = [
'id' => $supportTicketSubtype['id'],
'ticketData' => $ticketDataArray, // Agrega la colección de TicketData
];
return new Response(json_encode($responseArray), Response::HTTP_OK, ['Content-Type' => 'application/json']);
}
public function ticketadd(Request $request)
{
$this->isWebsiteActive();
$formErrors = $errors = array();
$em = $this->getDoctrine()->getManager();
$website = $em->getRepository(Website::class)->findOneByCode('knowledgebase');
$websiteConfiguration = $this->get('uvdesk.service')->getActiveConfiguration($website->getId());
if (!$websiteConfiguration || !$websiteConfiguration->getTicketCreateOption() || ($websiteConfiguration->getLoginRequiredToCreate() && !$this->getUser())) {
return $this->redirect($this->generateUrl('helpdesk_knowledgebase'));
}
$post = $request->request->all();
$fueraDeHorario=file_get_contents($_ENV['EXTERNAL_PATH']."UserController.php?case=2");
//Validación dÃa feriado
$esFeriado=file_get_contents($_ENV['EXTERNAL_PATH']."UserController.php?case=4");
$user = $this->get('user.service')->getSessionUser();
//Horario comercial
$conexionSeries = 1;
if($fueraDeHorario){
$isSupportActive=file_get_contents($_ENV['EXTERNAL_PATH']."UserController.php?case=1&user=".$user->getEmail());
//Si esta fuera de horario y no hay conexión , creo el ticket, no envÃo correo y muestro mensaje
if($isSupportActive == -1){
$isSupportActive = 1;
$conexionSeries = 0;
}
}else{
//Si esta en horario comercial creo el ticket, no consunlto info de plan de usuario a series y no envÃo correo
$isSupportActive=1;
}
if($request->getMethod() == "POST") {
//Solicitud de urgencia en session
$session = $request->getSession();
if($session->get('critical')){
$start_date = new \DateTime($session->get('critical'));
$since_start = $start_date->diff(new \DateTime(date("Y-m-d H:i:s")));
if($since_start->i > 10){
$session->remove('critical');
}else{
$request->getSession()->getFlashBag()->set('warning', $this->get('translator')->trans('Warning ! You previously requested an emergency, please wait 10 minutes and try again.'));
return $this->redirect($this->generateUrl('helpdesk_customer_create_ticket'));
}
}
//Validaciones para estado critical/urgent
if($post['priority'] == 4){
if($post['urgent_check']){
/* if($post['business_impact']){
if($post['phone']){
}else{
$request->getSession()->getFlashBag()->set('warning', $this->get('translator')->trans('Warning ! Phone is required.'));
return $this->redirect($this->generateUrl('helpdesk_customer_create_ticket'));
}
}else{
$request->getSession()->getFlashBag()->set('warning', $this->get('translator')->trans('Warning ! Business impact is required.'));
return $this->redirect($this->generateUrl('helpdesk_customer_create_ticket'));
} */
}else{
$request->getSession()->getFlashBag()->set('warning', $this->get('translator')->trans('Warning ! Urgent check is required.'));
return $this->redirect($this->generateUrl('helpdesk_customer_create_ticket'));
}
}else{
}
/////////////////////////////
//INICIO CAMBIO : Cuando NO tiene usuario activo debo crear el ticket pero se debe poner en estado "pendiente de pago"
$user = $this->get('user.service')->getSessionUser();
//Horario comercial
$conexionSeries = 1;
$fueraDeHorario=file_get_contents($_ENV['EXTERNAL_PATH']."UserController.php?case=2");
if($fueraDeHorario){
$isSupportActive=file_get_contents($_ENV['EXTERNAL_PATH']."UserController.php?case=1&user=".$user->getEmail());
//Si esta fuera de horario y no hay conexión , creo el ticket, no envÃo correo y muestro mensaje
if($isSupportActive == -1){
$isSupportActive = 1;
$conexionSeries = 0;
}
}else{
//Si esta en horario comercial creo el ticket, no consunlto info de plan de usuario a series y no envÃo correo
$isSupportActive=1;
}
//FIN CAMBIO /////////////////////////
if($_POST) {
$error = false;
$message = '';
$ticketType = $em->getRepository('UVDeskCoreFrameworkBundle:TicketType')->find($request->request->get('type'));
if($request->files->get('customFields') && !$this->get('file.service')->validateAttachmentsSize($request->files->get('customFields'))) {
$error = true;
$this->addFlash(
'warning',
$this->get('translator')->trans("Warning ! Files size can not exceed %size% MB", [
'%size%' => $this->container->getParameter('max_upload_size')
])
);
}
$ticket = new TicketEntity();
$loggedUser = $this->get('security.token_storage')->getToken()->getUser();
if(!empty($loggedUser) && $loggedUser != 'anon.') {
$form = $this->createForm(TicketForm::class, $ticket, [
'container' => $this->container,
'entity_manager' => $em,
]);
$email = $loggedUser->getEmail();
try {
$name = $loggedUser->getFirstName() . ' ' . $loggedUser->getLastName();
} catch(\Exception $e) {
$name = explode(' ', strstr($email, '@', true));
}
} else {
$form = $this->createForm(TicketForm::class, $ticket, [
'container' => $this->container,
'entity_manager' => $em,
]);
$email = $request->request->get('from');
$name = explode(' ', $request->request->get('name'));
}
$website = $em->getRepository('UVDeskCoreFrameworkBundle:Website')->findOneByCode('knowledgebase');
if(!empty($email) && $this->container->get('ticket.service')->isEmailBlocked($email, $website)) {
$request->getSession()->getFlashBag()->set('warning', $this->get('translator')->trans('Warning ! Cannot create ticket, given email is blocked by admin.'));
return $this->redirect($this->generateUrl('helpdesk_customer_create_ticket'));
}
if($request->request->all())
$form->submit($request->request->all());
if ($form->isValid() && !count($formErrors) && !$error) {
$data = array(
'from' => $email, //email$request->getSession()->getFlashBag()->set('success', $this->get('translator')->trans('Success ! Ticket has been created successfully.'));
'subject' => $request->request->get('subject'),
'reference' => $request->request->get('reference'),
// @TODO: We need to filter js (XSS) instead of html
'reply' => strip_tags($request->request->get('reply')),
'firstName' => $name[0],
'lastName' => isset($name[1]) ? $name[1] : '',
'role' => 4,
'active' => true
);
$em = $this->getDoctrine()->getManager();
if($request->request->get('subtype')){
die(print_r($request->request->get('subtype')));
$data['subtype'] = $em->getRepository('UVDeskCoreFrameworkBundle:SupportTicketSubtypes')->find($request->request->get('subtype'));
}
$data['type'] = $em->getRepository('UVDeskCoreFrameworkBundle:TicketType')->find($request->request->get('type'));
$data['priority'] = $em->getRepository('UVDeskCoreFrameworkBundle:TicketPriority')->find($request->request->get('priority'));
if(!is_object($data['customer'] = $this->container->get('security.token_storage')->getToken()->getUser()) == "anon.") {
$supportRole = $em->getRepository('UVDeskCoreFrameworkBundle:SupportRole')->findOneByCode("ROLE_CUSTOMER");
$customerEmail = $params['email'] = $request->request->get('from');
$customer = $em->getRepository('UVDeskCoreFrameworkBundle:User')->findOneBy(array('email' => $customerEmail));
$params['flag'] = (!$customer) ? 1 : 0;$request->getSession()->getFlashBag()->set('success', $this->get('translator')->trans('Success ! Ticket has been created successfully.'));
$data['firstName'] = current($nameDetails = explode(' ', $request->request->get('name')));
$data['fullname'] = $request->request->get('name');
$data['lastName'] = ($data['firstName'] != end($nameDetails)) ? end($nameDetails) : " ";
$data['from'] = $customerEmail;
$data['role'] = 4;
$data['customer'] = $this->get('user.service')->createUserInstance($customerEmail, $data['fullname'], $supportRole, $extras = ["active" => true]);
} else {
$userDetail = $em->getRepository('UVDeskCoreFrameworkBundle:User')->find($data['customer']->getId());
$data['email'] = $customerEmail = $data['customer']->getEmail();
$nameCollection = [$userDetail->getFirstName(), $userDetail->getLastName()];
$name = implode(' ', $nameCollection);
$data['fullname'] = $name;
}
$data['user'] = $data['customer'];
$data['subject'] = $request->request->get('subject');
$data['reference'] = $request->request->get('reference');
$data['source'] = 'website';
$data['threadType'] = 'create';
$data['message'] = str_replace(['<script>', '</script>'], '', htmlspecialchars($data['reply']));
$data['message'] = nl2br($data['message']);
$data['createdBy'] = 'customer';
$data['attachments'] = $request->files->get('attachments');
$data['businessImpact'] = $post['business_impact'] ? $post['business_impact']:'';
$data['whatsapp'] = $post['phone'] ? $post['phone']:'';
$data['urlPlataforma'] = $post['urlPlataforma'] ? $post['urlPlataforma']:'';
//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
if($request->request->get('subtype')){
$userService = $this->container->get('user.service');
$agentUsers = $userService->getAgentUsersByTicketSubtype($request->request->get('subtype'));
if($agentUsers[0]){
$data['agent'] = $em->getRepository('UVDeskCoreFrameworkBundle:User')->findOneBy(array('id' => $agentUsers[0]['id']));
}
}
if(!empty($request->server->get("HTTP_CF_CONNECTING_IP") )) {
$data['ipAddress'] = $request->server->get("HTTP_CF_CONNECTING_IP");
if(!empty($request->server->get("HTTP_CF_IPCOUNTRY"))) {
$data['ipAddress'] .= '(' . $request->server->get("HTTP_CF_IPCOUNTRY") . ')';
}
}
///// INICIO cambio estado tipo de licencias vencidas o resto de licencias que entren en el grupo (24/7, Low cost, Lunes a viernes)
if($isSupportActive=='0' || $isSupportActive=='2'){
if($conexionSeries == 0){
$thread = $this->get('ticket.service')->createTicketBase($data,1);
}else{
$thread = $this->get('ticket.service')->createTicketBase($data,1); //estado pendiente de pago
//envio email
$user = $this->get('user.service')->getSessionUser();
$UserClient = file_get_contents($_ENV['EXTERNAL_PATH']."UserController.php?case=3&user=".$user->getEmail());
$jsonUser=json_decode($UserClient, true);
$url=$_ENV['EXTERNAL_PATH']."TicketController.php?case=2&serial='".$jsonUser[0]["Nroserie"]."'&haveSupport='".$isSupportActive."'&user='".$user->getEmail()."'&subject=''&msj=''&path=''&nameFileAttachment=''";
$aClient=file_get_contents($url);
}
}
else{
$thread = $this->get('ticket.service')->createTicketBase($data,1);
}
///// FIN cambio
if ($thread) {
if($conexionSeries == 0){
$request->getSession()->getFlashBag()->set('warning', $this->get('translator')->trans('Success ! Ticket has been created successfully. SYSTEM IN RECOVERY, CONTACT SUPPORT AT sop24op@softguard.com'));
}else{
$request->getSession()->getFlashBag()->set('success', $this->get('translator')->trans('Success ! Ticket has been created successfully.'));
}
} else {
$request->getSession()->getFlashBag()->set('warning', $this->get('translator')->trans('Warning ! Can not create ticket, invalid details.'));
}
// Trigger ticket created event
$event = new GenericEvent(CoreWorkflowEvents\Ticket\Create::getId(), [
'entity' => $thread->getTicket(),
]);
$this->get('event_dispatcher')->dispatch('uvdesk.automation.workflow.execute', $event);
//aca se debe mandar mail de pago, para lo cual se debe insertar en quotes. FALTA DEFINIR.
//return $this->render('@UVDeskSupportCenter/Knowledgebase/ticketList.html.twig',
// array(
// 'searchDisable' => true
// )
//);
if($post['priority'] == 4) {
$curl = curl_init();
curl_setopt_array($curl, array(
CURLOPT_URL => $_ENV['URL_API'].'token.php',
CURLOPT_RETURNTRANSFER => true,
CURLOPT_ENCODING => "",
CURLOPT_MAXREDIRS => 10,
CURLOPT_TIMEOUT => 240,
CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1,
CURLOPT_CUSTOMREQUEST => "GET",
CURLOPT_HTTPHEADER => array(
"cache-control: no-cache"
),
));
$responseToken = curl_exec($curl);
$jResponseToken=json_decode($responseToken, true);
$token=$jResponseToken['token'];
$envioMensaje = "https://sistema.softguard.com/sistema/sg/endpoint/ticketera-addlectura.php?t=".$token."&ticket=".$thread->getTicket()->getCodigoSeries()."&evento=6&ticketera=".$thread->getTicket()->getId();
$curl = curl_init();
curl_setopt_array($curl, array(
CURLOPT_URL => $envioMensaje,
CURLOPT_RETURNTRANSFER => true,
CURLOPT_ENCODING => "",
CURLOPT_MAXREDIRS => 10,
CURLOPT_TIMEOUT => 240,
CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1,
CURLOPT_CUSTOMREQUEST => "POST",
CURLOPT_HTTPHEADER => array(
"cache-control: no-cache"
),
));
$idioms = curl_exec($curl);
curl_close($curl);
$session->set('critical', date("Y-m-d H:i:s"));
$this->solicitarUrgencia($thread->getTicket(), $em);
}
return $this->redirect($this->generateUrl('helpdesk_customer_ticket_collection'));
//return $this->redirect($this->generateUrl('helpdesk_customer_create_ticket'));
} else {
$errors = $this->getFormErrors($form);
$errors = array_merge($errors, $formErrors);
}
} else {
$this->addFlash(
'warning',
$this->get('translator')->trans("Warning ! Post size can not exceed 25MB")
);
}
if(isset($errors) && count($errors)) {
$this->addFlash('warning', key($errors) . ': ' . reset($errors));
}
}
$sesion=null;
if($this->get('user.service')->getSessionUser()!=null)
$sesion=true;
$breadcrumbs = [
[
'label' => $this->get('translator')->trans('Support Center'),
'url' => $this->generateUrl('helpdesk_knowledgebase'), 'sesion'=> $sesion
],
[
'label' => $this->get('translator')->trans("Create Ticket Request"),
'url' => '#', 'sesion'=> $sesion
],
];
return $this->render('@UVDeskSupportCenter/Knowledgebase/ticket.html.twig',
array(
'formErrors' => $formErrors,
'errors' => json_encode($errors),
'customFieldsValues' => $request->request->get('customFields'),
'breadcrumbs' => $breadcrumbs,
'post' => $post,
'fueraDeHorario' => $fueraDeHorario,
'isSupportActive' => $isSupportActive,
'esFeriado' => $esFeriado
)
);
}
public function ticketList(Request $request)
{
$em = $this->getDoctrine()->getManager();
$ticketRepo = $em->getRepository('UVDeskCoreFrameworkBundle:Ticket');
$currentUser = $this->get('security.token_storage')->getToken()->getUser();
if(!$currentUser || $currentUser == "anon.") {
//throw error
}
$tickets = $ticketRepo->getAllCustomerTickets($currentUser);
return $this->render('@UVDeskSupportCenter/Knowledgebase/ticketList.html.twig', array(
'ticketList' => $tickets,
));
}
public function changeStatus(int $id,Request $request){
$nova = array(" ");
$entityManager = $this->getDoctrine()->getManager();
$ticket = $this->getDoctrine()->getRepository('UVDeskCoreFrameworkBundle:Ticket')->find($id);
//Solicitud de urgencia en session
$session = $request->getSession();
if($session->get('critical')){
$start_date = new \DateTime($session->get('critical'));
$since_start = $start_date->diff(new \DateTime(date("Y-m-d H:i:s")));
if($since_start->i > 10){
$session->remove('critical');
}else{
$request->getSession()->getFlashBag()->set('warning', $this->get('translator')->trans('Warning ! You previously requested an emergency, please wait 10 minutes and try again.'));
return $this->redirect($this->generateUrl('helpdesk_customer_ticket',array(
'id' => $ticket->getId()
)));
}
}
$session->set('critical', date("Y-m-d H:i:s"));
//Modificacion para validar si se muestra el boton.
$currentThread = $this->getDoctrine()->getRepository('UVDeskCoreFrameworkBundle:Thread')->getTicketCurrentThread($ticket);
$attachments = $entityManager->getRepository(Attachment::class)->findByThread($currentThread);
$subject = utf8_encode($ticket->getSubject());
$subject = str_replace($nova, "<BLANK>", $subject);
$msj = utf8_encode($currentThread->getMessage());
$msj = str_replace($nova, "<BLANK>", $msj);
if(count($attachments)){
$path= utf8_encode($attachments[0]->getPath());
$path = str_replace($nova, "<BLANK>", $path);
$nameFileAttachment=utf8_encode($attachments[0]->getName());
$nameFileAttachment = str_replace($nova, "<BLANK>", $nameFileAttachment);
}else{
$nameFileAttachment=$path='';
}
$user = $this->get('user.service')->getSessionUser();
$haveSupport = file_get_contents($_ENV['EXTERNAL_PATH']."UserController.php?case=1&user=".$user->getEmail());
if($haveSupport == -1){
$request->getSession()->getFlashBag()->set('warning', $this->get('translator')->trans('Warning ! Cannot create ticket, connection failed.'));
return $this->redirect($this->generateUrl('helpdesk_customer_ticket',array(
'id' => $ticket->getId()
)));
}
if($haveSupport==1) //24/7
$TicketStatus = $entityManager->getRepository('UVDeskCoreFrameworkBundle:TicketStatus')->findOneById("8"); //in process of attention
// no debe aparecer el boton por lo tanto aqui no deberia entrar
// if($haveSupport==2)
// $TicketStatus = $entityManager->getRepository('UVDeskCoreFrameworkBundle:TicketStatus')->findOneById("7");
if($haveSupport==3) //Low Cost
$TicketStatus = $entityManager->getRepository('UVDeskCoreFrameworkBundle:TicketStatus')->findOneById("7");//Pending Payment
$TicketPriority = $entityManager->getRepository('UVDeskCoreFrameworkBundle:TicketPriority')->findOneById("4"); // Urgent
$UserClient = file_get_contents($_ENV['EXTERNAL_PATH']."UserController.php?case=3&user=".$user->getEmail());
$jsonUser=json_decode($UserClient, true);
$str= $_SERVER['HTTP_REFERER'];
$param_url=explode("public/",$str);
$lang=substr($param_url[1],0,2);
$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."'";
//$aClient=file_get_contents($url);
//$idTicketSeries = file_get_contents($url);
if (($idTicketSeries = @file_get_contents($url)) === false) {
$error = error_get_last();
$myfileIdTicket = fopen("log_id_ticket_series_err.txt", "a") or die ("Unable to open file!");
fwrite($myfileIdTicket, $error['message']);
fclose($myfileIdTicket);
}
$myfileIdTicket = fopen("log_id_ticket_series.txt", "a") or die ("Unable to open file!");
fwrite($myfileIdTicket, $idTicketSeries);
fclose($myfileIdTicket);
if($idTicketSeries == -1 || $idTicketSeries == 0){
$request->getSession()->getFlashBag()->set('warning', $this->get('translator')->trans('Warning ! Cannot create ticket, connection failed.'));
return $this->redirect($this->generateUrl('helpdesk_customer_ticket',array(
'id' => $ticket->getId()
)));
}
$ticket->setCodigoSeries($idTicketSeries);
$ticket->setPriority($TicketPriority);
$ticket->setStatus($TicketStatus);
$entityManager->persist($ticket);
$entityManager->flush();
///////////////////////////
$this->addFlash('success',$this->get('translator')->trans("SuccessUrgency ! Urgency requested successfully."));
return $this->redirect($this->generateUrl('helpdesk_customer_ticket',array(
'id' => $ticket->getId()
)));
}
public function rollback(int $id,Request $request){
$nova = array(" ");
$entityManager = $this->getDoctrine()->getManager();
$ticket = $this->getDoctrine()->getRepository('UVDeskCoreFrameworkBundle:Ticket')->find($id);
$currentThread = $this->getDoctrine()->getRepository('UVDeskCoreFrameworkBundle:Thread')->getTicketCurrentThread($ticket);
$attachments = $entityManager->getRepository(Attachment::class)->findByThread($currentThread);
$TicketStatus = $entityManager->getRepository('UVDeskCoreFrameworkBundle:TicketStatus')->findOneById("1");
$TicketPriority = $entityManager->getRepository('UVDeskCoreFrameworkBundle:TicketPriority')->findOneById("1");
$ticket->setPriority($TicketPriority);
$ticket->setStatus($TicketStatus);
$entityManager->persist($ticket);
$entityManager->flush();
$user = $this->get('user.service')->getSessionUser();
$UserClient = file_get_contents($_ENV['EXTERNAL_PATH']."UserController.php?case=3&user=".$user->getEmail());
if($UserClient == -1){
$request->getSession()->getFlashBag()->set('warning', $this->get('translator')->trans('Warning ! Cannot create ticket, connection failed.'));
return $this->redirect($this->generateUrl('helpdesk_customer_ticket',array(
'id' => $ticket->getId()
)));
}
$jsonUser=json_decode($UserClient, true);
$url=$_ENV['EXTERNAL_PATH']."TicketController.php?case=3&codigo_series='".$ticket->getCodigoSeries()."'&user='".$user->getEmail();
// $url=$_ENV['EXTERNAL_PATH']."TicketController.php?case=3&serial='".$jsonUser[0]["Nroserie"];
$aClient=file_get_contents($url);
if($aClient == -1){
$request->getSession()->getFlashBag()->set('warning', $this->get('translator')->trans('Warning ! Cannot create ticket, connection failed.'));
return $this->redirect($this->generateUrl('helpdesk_customer_ticket',array(
'id' => $ticket->getId()
)));
}
$this->addFlash('success',$this->get('translator')->trans("SuccessCanceled ! Urgency Canceled."));
return $this->redirect($this->generateUrl('helpdesk_customer_ticket',array(
'id' => $ticket->getId()
)));
}
public function saveReply(int $id, Request $request)
{
$this->isWebsiteActive();
$data = $request->request->all();
$ticket = $this->getDoctrine()->getRepository('UVDeskCoreFrameworkBundle:Ticket')->find($id);
if($_POST) {
if(str_replace(' ','',str_replace(' ','',trim(strip_tags($data['message'], '<img>')))) != "") {
if(!$ticket)
$this->noResultFound();
$data['ticket'] = $ticket;
$data['user'] = $this->get('user.service')->getCurrentUser();
// @TODO: Refactor -> Why are we filtering only these two characters?
$data['message'] = str_replace(['<script>', '</script>'], '', $data['message']);
$userDetail = $this->get('user.service')->getCustomerPartialDetailById($data['user']->getId());
$data['fullname'] = $userDetail['name'];
$data['source'] = 'website';
$data['createdBy'] = 'customer';
$data['attachments'] = $request->files->get('attachments');
$em = $this->getDoctrine()->getManager();
$status = $em->getRepository('UVDeskCoreFrameworkBundle:TicketStatus')->findOneByCode($data['status']);
// if($ticket->getStatus()->getId() == 5 || $ticket->getStatus()->getId() == 2 || $ticket->getStatus()->getId() == 3 || $ticket->getStatus()->getId() == 9){
$ticket->setStatus($em->getRepository('UVDeskCoreFrameworkBundle:TicketStatus')->findOneByCode("open"));
// }
$thread = $this->get('ticket.service')->createThread($ticket, $data);
if($ticket->getPriority()->getId() == 4){
$curl = curl_init();
curl_setopt_array($curl, array(
CURLOPT_URL => $_ENV['URL_API'].'token.php',
CURLOPT_RETURNTRANSFER => true,
CURLOPT_ENCODING => "",
CURLOPT_MAXREDIRS => 10,
CURLOPT_TIMEOUT => 240,
CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1,
CURLOPT_CUSTOMREQUEST => "GET",
CURLOPT_HTTPHEADER => array(
"cache-control: no-cache"
),
));
$responseToken = curl_exec($curl);
$jResponseToken=json_decode($responseToken, true);
$token=$jResponseToken['token'];
$envioMensaje = "https://sistema.softguard.com/sistema/sg/endpoint/ticketera-addlectura.php?t=".$token."&ticket=".$ticket->getCodigoSeries()."&evento=6&ticketera=".$ticket->getId();
$curl = curl_init();
curl_setopt_array($curl, array(
CURLOPT_URL => $envioMensaje,
CURLOPT_RETURNTRANSFER => true,
CURLOPT_ENCODING => "",
CURLOPT_MAXREDIRS => 10,
CURLOPT_TIMEOUT => 240,
CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1,
CURLOPT_CUSTOMREQUEST => "POST",
CURLOPT_HTTPHEADER => array(
"cache-control: no-cache"
),
));
$idioms = curl_exec($curl);
curl_close($curl);
}
if($status) {
$flag = 0;
if($ticket->getStatus() != $status) {
$flag = 1;
}
$ticket->setStatus($status);
$em->persist($ticket);
$em->flush();
}
// Trigger customer reply event
$event = new GenericEvent(CoreWorkflowEvents\Ticket\CustomerReply::getId(), [
'entity' => $ticket,
]);
$this->get('event_dispatcher')->dispatch('uvdesk.automation.workflow.execute', $event);
$this->addFlash('success', $this->get('translator')->trans("Success ! Reply added successfully."));
} else {
$this->addFlash(
'warning',
$this->get('translator')->trans("Warning ! Reply field can not be blank.")
);
}
} else {
$this->addFlash(
'warning',
$this->get('translator')->trans("Warning ! Post size can not exceed 25MB")
);
}
return $this->redirect($this->generateUrl('helpdesk_customer_ticket',array(
'id' => $ticket->getId()
)));
}
public function tickets(Request $request)
{
$this->isWebsiteActive();
/*
$str= substr($_SERVER['HTTP_REFERER'], strlen($_SERVER['HTTP_REFERER'])-5,5);
if($str=='login')
return $this->redirect($this->generateUrl('helpdesk_knowledgebase'));
*/
return $this->render('@UVDeskSupportCenter/Knowledgebase/ticketList.html.twig',
array(
'searchDisable' => true
)
);
}
/**
* ticketListXhrAction "Filter and sort ticket collection on ajax request"
* @param Object $request "HTTP Request object"
* @return JSON "JSON response"
*/
public function ticketListXhr(Request $request)
{
$this->isWebsiteActive();
$json = array();
if($request->isXmlHttpRequest()) {
$repository = $this->getDoctrine()->getRepository('UVDeskCoreFrameworkBundle:Ticket');
$json = $repository->getAllCustomerTickets($request->query, $this->container);
}
//prueba
//$a=file_get_contents("http://localhost/uvdesk/1.0.6/external/controlador.php");
$response = new Response(json_encode($json));
$response->headers->set('Content-Type', 'application/json');
return $response;
}
/**
* threadListXhrAction "Filter and sort user collection on ajx request"
* @param Object $request "HTTP Request object"
* @return JSON "JSON response"
*/
public function threadListXhr(Request $request)
{
$this->isWebsiteActive();
$json = array();
if($request->isXmlHttpRequest()) {
$ticket = $this->getDoctrine()->getRepository('UVDeskCoreFrameworkBundle:Ticket')->find($request->attributes->get('id'));
// $this->denyAccessUnlessGranted('FRONT_VIEW', $ticket);
$repository = $this->getDoctrine()->getRepository('UVDeskCoreFrameworkBundle:Thread');
$json = $repository->getAllCustomerThreads($request->attributes->get('id'),$request->query, $this->container);
}
$response = new Response(json_encode($json));
$response->headers->set('Content-Type', 'application/json');
return $response;
}
public function ticketView($id, Request $request)
{
$this->isWebsiteActive();
$entityManager = $this->getDoctrine()->getManager();
$user = $this->get('user.service')->getSessionUser();
$ticket = $entityManager->getRepository(TicketEntity::class)->findOneBy(['id' => $id, 'customer' => $user]);
///////////////////////////
//Modificacion para validar si se muestra el boton. getEmail()
$conexionSeries = 1;
$isSupportActive=file_get_contents($_ENV['EXTERNAL_PATH']."UserController.php?case=1&user=".$user->getEmail());
if($isSupportActive == -1){
$isSupportActive = 0;
$conexionSeries = 0;
}
if($conexionSeries == 0){
$isEnabledButton = 0;
}else{
$isEnabledButton=file_get_contents($_ENV['EXTERNAL_PATH']."UserController.php?case=2");
}
///////////////////////////
if($conexionSeries == 0) {
$esFeriado = 0;
}else{
//Validación dÃa feriado
$esFeriado=file_get_contents($_ENV['EXTERNAL_PATH']."UserController.php?case=4");
}
if (empty($ticket)) {
throw new NotFoundHttpException('Page Not Found!');
}
if (!empty($user) && $user->getId() == $ticket->getCustomer()->getId()) {
// $ticket->setIsCustomerViewed(1);
$entityManager->persist($ticket);
$entityManager->flush();
}
$twigResponse = [
'ticket' => $ticket,
'searchDisable' => true,
'initialThread' => $this->get('ticket.service')->getTicketInitialThreadDetails($ticket),
'localizedCreateAtTime' => $this->get('user.service')->getLocalizedFormattedTime($user, $ticket->getCreatedAt()),
'isSupportActive'=>$isSupportActive,
'isEnabledButton'=>$isEnabledButton,
'esFeriado'=>$esFeriado,
'conexionSeries'=>$conexionSeries
];
return $this->render('@UVDeskSupportCenter/Knowledgebase/ticketView.html.twig', $twigResponse);
}
// Ticket rating
public function rateTicket(Request $request) {
$this->isWebsiteActive();
$json = array();
$em = $this->getDoctrine()->getManager();
$data = json_decode($request->getContent(), true);
$id = $data['id'];
$count = intval($data['rating']);
if($count > 0 || $count < 6) {
$ticket = $em->getRepository('UVDeskCoreFrameworkBundle:Ticket')->find($id);
$customer = $this->get('user.service')->getCurrentUser();
$rating = $em->getRepository('UVDeskCoreFrameworkBundle:TicketRating')->findOneBy(array('ticket' => $id,'customer'=>$customer->getId()));
if($rating) {
$rating->setcreatedAt(new \DateTime);
$rating->setStars($count);
$em->persist($rating);
$em->flush();
} else {
$rating = new TicketRating();
$rating->setStars($count);
$rating->setCustomer($customer);
$rating->setTicket($ticket);
$em->persist($rating);
$em->flush();
}
$json['alertClass'] = 'success';
$json['alertMessage'] = $this->get('translator')->trans('Success ! Rating has been successfully added.');
} else {
$json['alertClass'] = 'danger';
$json['alertMessage'] = $this->get('translator')->trans('Warning ! Invalid rating.');
}
$response = new Response(json_encode($json));
$response->headers->set('Content-Type', 'application/json');
return $response;
}
public function voteTicket(Request $request) {
$this->isWebsiteActive();
$json = array();
$em = $this->getDoctrine()->getManager();
$id = $request->attributes->get('id');
$count = intval($request->attributes->get('vote'));
$comment = $request->attributes->get('comment');
/*
if($count > 0 || $count < 4) {
$ticket = $em->getRepository('UVDeskCoreFrameworkBundle:Ticket')->find($id);
$customer = $this->get('user.service')->getCurrentUser();
$ticket->setVote($count);
$em->persist($ticket);
$em->flush();
$json['alertClass'] = 'success';
$json['alertMessage'] = $this->get('translator')->trans('Success ! Rating has been successfully added.');
} else {
$json['alertClass'] = 'danger';
$json['alertMessage'] = $this->get('translator')->trans('Warning ! Invalid rating.');
}
*/
if($count > 0 || $count < 6) {
$ticket = $em->getRepository('UVDeskCoreFrameworkBundle:Ticket')->find($id);
$customer = $this->get('user.service')->getCurrentUser();
$rating = $em->getRepository('UVDeskCoreFrameworkBundle:TicketRating')->findOneBy(array('ticket' => $id,'customer'=>$customer->getId()));
if($rating) {
$rating->setcreatedAt(new \DateTime);
$rating->setStars($count);
$rating->setFeedback($comment);
$em->persist($rating);
$em->flush();
} else {
$rating = new TicketRating();
$rating->setStars($count);
$rating->setFeedback($comment);
$rating->setCustomer($customer);
$rating->setTicket($ticket);
$em->persist($rating);
$em->flush();
}
$json['alertClass'] = 'success';
$json['alertMessage'] = $this->get('translator')->trans('Success ! Rating has been successfully added.');
} else {
$json['alertClass'] = 'danger';
$json['alertMessage'] = $this->get('translator')->trans('Warning ! Invalid rating.');
}
$response = new Response(json_encode($json));
$response->headers->set('Content-Type', 'application/json');
return $response;
}
public function downloadAttachmentZip(Request $request)
{
$threadId = $request->attributes->get('threadId');
$attachmentRepository = $this->getDoctrine()->getManager()->getRepository('UVDeskCoreFrameworkBundle:Attachment');
$attachment = $attachmentRepository->findByThread($threadId);
if (!$attachment) {
$this->noResultFound();
}
$zipname = 'attachments/' .$threadId.'.zip';
$zip = new \ZipArchive;
$zip->open($zipname, \ZipArchive::CREATE);
if(count($attachment)){
foreach ($attachment as $attach) {
$zip->addFile(substr($attach->getPath(), 1));
}
}
$zip->close();
$response = new Response();
$response->setStatusCode(200);
$response->headers->set('Content-type', 'application/zip');
$response->headers->set('Content-Disposition', 'attachment; filename=' . $threadId . '.zip');
$response->sendHeaders();
$response->setContent(readfile($zipname));
return $response;
}
public function downloadAttachment(Request $request)
{
$attachmendId = $request->attributes->get('attachmendId');
$attachmentRepository = $this->getDoctrine()->getManager()->getRepository('UVDeskCoreFrameworkBundle:Attachment');
$attachment = $attachmentRepository->findOneById($attachmendId);
$baseurl = $request->getScheme() . '://' . $request->getHttpHost() . $request->getBasePath();
if (!$attachment) {
$this->noResultFound();
}
$path = $this->get('kernel')->getProjectDir() . "/public/". $attachment->getPath();
$response = new Response();
$response->setStatusCode(200);
$response->headers->set('Content-type', $attachment->getContentType());
$response->headers->set('Content-Disposition', 'attachment; filename='. $attachment->getName());
$response->sendHeaders();
$response->setContent(readfile($path));
return $response;
}
public function ticketCollaboratorXhr(Request $request)
{
$json = array();
$content = json_decode($request->getContent(), true);
$em = $this->getDoctrine()->getManager();
$ticket = $em->getRepository('UVDeskCoreFrameworkBundle:Ticket')->find($content['ticketId']);
if ($request->getMethod() == "POST") {
if ($content['email'] == $ticket->getCustomer()->getEmail()) {
$json['alertClass'] = 'danger';
$json['alertMessage'] = $this->get('translator')->trans('Error ! Can not add customer as a collaborator.');
} else {
$data = array(
'from' => $content['email'],
'firstName' => ($firstName = ucfirst(current(explode('@', $content['email'])))),
'lastName' => ' ',
'role' => 4,
);
$supportRole = $em->getRepository('UVDeskCoreFrameworkBundle:SupportRole')->findOneByCode('ROLE_CUSTOMER');
$collaborator = $this->get('user.service')->createUserInstance($data['from'], $data['firstName'], $supportRole, $extras = ["active" => true]);
$checkTicket = $em->getRepository('UVDeskCoreFrameworkBundle:Ticket')->isTicketCollaborator($ticket,$content['email']);
if (!$checkTicket) {
$ticket->addCollaborator($collaborator);
$em->persist($ticket);
$em->flush();
$ticket->lastCollaborator = $collaborator;
$collaborator = $em->getRepository('UVDeskCoreFrameworkBundle:User')->find($collaborator->getId());
$json['collaborator'] = $this->get('user.service')->getCustomerPartialDetailById($collaborator->getId());
$json['alertClass'] = 'success';
$json['alertMessage'] = $this->get('translator')->trans('Success ! Collaborator added successfully.');
} else {
$json['alertClass'] = 'danger';
$json['alertMessage'] = $this->get('translator')->trans('Error ! Collaborator is already added.');
}
}
} elseif ($request->getMethod() == "DELETE") {
$collaborator = $em->getRepository('UVDeskCoreFrameworkBundle:User')->findOneBy(array('id' => $request->attributes->get('id')));
if ($collaborator) {
$ticket->removeCollaborator($collaborator);
$em->persist($ticket);
$em->flush();
$json['alertClass'] = 'success';
$json['alertMessage'] = $this->get('translator')->trans('Success ! Collaborator removed successfully.');
} else {
$json['alertClass'] = 'danger';
$json['alertMessage'] = $this->get('translator')->trans('Error ! Invalid Collaborator.');
}
}
$response = new Response(json_encode($json));
$response->headers->set('Content-Type', 'application/json');
return $response;
}
public function getTicketChatStatusXHR(Request $request)
{
$entityManager = $this->getDoctrine()->getManager();
$ticketId = $request->get('id');
$json = [];
$ticket = $entityManager->getRepository('UVDeskCoreFrameworkBundle:Ticket')->findOneById($ticketId);
if (!empty($ticket)) {
$isStarred = $ticket->getIsStarred();
if ($request->isXmlHttpRequest()) {
$json['isStarred'] = $isStarred;
}
return new Response(json_encode($json), 200, ['Content-Type' => 'application/json']);
} else {
return new Response(json_encode(['error' => 'Ticket not found']), 404, ['Content-Type' => 'application/json']);
}
}
}