<?php
namespace App\Controller;
use App\Entity\Product;
use App\Entity\Supportcase;
use Symfony\Bundle\FrameworkBundle\Controller\AbstractController;
use Symfony\Component\HttpFoundation\Response;
use Symfony\Component\HttpFoundation\Request;
use Symfony\Component\Routing\Annotation\Route;
use Symfony\Contracts\Translation\TranslatorInterface;
use App\Service\TrafficTracker;
use App\Service\Translation;
use App\Entity\User;
use App\Entity\Ticket;
use App\Entity\TicketComercial;
use App\Entity\Tickettecnico;
use App\Entity\Tipoticket;
use App\Service\ReportingColors;
use App\Service\ProductlineJsonTree;
use App\Form\Type\TicketEditType;
use App\Service\ServiceNotification;
use Symfony\Component\HttpKernel\Exception\AccessDeniedHttpException;
use App\Form\Ticket\MessageSupport;
use Psr\Log\LoggerInterface;
use Symfony\Component\HttpFoundation\JsonResponse;
use App\Service\ExtensionFileService;
use PhpOffice\PhpSpreadsheet\Calculation\Web\Service;
class TicketController extends AbstractController
{
protected static $level = 1;
/**
* @Route("/ticket/default/index", name="ticket_index")
*/
public function index(TrafficTracker $trafficTracker, Translation $translation, ReportingColors $reportingColors, Request $request, LoggerInterface $logger): Response
{
$trafficTracker->registerTraffic();
$entityManager = $this->getDoctrine()->getManager();
$locale = $request->getLocale();
$user = $this->getUser();
$dataM = array();
$userRepository = $this->getDoctrine()->getRepository(User::class);
$ticketmonthpreview[1] = 0;
$tickettotalYearPrev[1] = 0;
$ticketmonth[1] = 0;
$tickettotalYear[1] = 0;
/* datos de mis incidencia */
$incidencias = $entityManager->createQuery('SELECT sc'
. ' FROM App\Entity\Supportcase sc'
. ' WHERE sc.createdby = :user')
->setParameter('user', $user)
->getResult();
foreach ($incidencias as $incidencia) {
$ticketRepository = $this->getDoctrine()->getRepository(Ticket::class);
$supportcaseRepository = $this->getDoctrine()->getRepository(\App\Entity\Supportcase::class);
$userLevel = $userRepository->getUserLevel($request, $user);
$logger->info('>>>> Ticket Logs <<<< Case: ' . $incidencia->getId() . ' user: ' . $user->getId() . ' level: ' . $userLevel);
$myTicket = $entityManager->createQuery('SELECT t'
. ' FROM App\Entity\Ticket t'
. ' WHERE t.supportcase = :incidencia'
. ' AND t.level = :level')
->setParameter('incidencia', $incidencia)
->setParameter('level', $userLevel)
->getOneOrNullResult();
$logger->info('>>>> End Ticket Logs <<<< Case: ' . $incidencia->getId() . ' user: ' . $user->getId() . ' level: ' . $userLevel);
$dataM[] = array(
'id' => $incidencia->getId(),
'tipo' => $translation->getTranslationBy($incidencia->getTipoTicket(), $locale, 'nombretipo'),
'creationDate' => $incidencia->getCreationdate(),
'orderDate' => $incidencia->getCreationdate()->format('Ymdhms'),
'status' => $myTicket ? $myTicket->getStatus() : '',
'subject' => $incidencia->getSubject(),
'supportCaseId' => $supportcaseRepository->getSupportCaseId10Digits($incidencia),
'myTicket' => $myTicket,
'statusTicket' => $myTicket ? $ticketRepository->getStatusTicket($user, $myTicket) : '',
);
}
$ticketTipesToShow = array();
if ($userRepository->hasSupportRole($user)) {
$ticketTipesToShow[] = 1;
}
if ($userRepository->hasAdminRole($user)) {
$ticketTipesToShow[] = 2;
}
if ($userRepository->hasSeminarRole($user)) {
$ticketTipesToShow[] = 3;
}
if ($userRepository->hasCommercialRole($user)) {
$ticketTipesToShow[] = 4;
}
//Informacion de ticket segun Rol
//si el user es vendor
if ($user->getVendor()) {
$ticketmonth = $entityManager->createQuery('SELECT SUM(dv.ticket)'
. ' FROM App\Entity\Dwvendor dv'
. ' WHERE dv.vendor = :vendor'
. ' AND dv.year = :year'
. ' AND dv.month = :month')
->setParameter('vendor', $user->getVendor())
->setParameter('year', date('Y'))
->setParameter('month', date('n'))
->getOneOrNullResult();
$ticketmonthpreview = $entityManager->createQuery('SELECT SUM(dv.ticket)'
. ' FROM App\Entity\Dwvendor dv'
. ' WHERE dv.vendor = :vendor'
. ' AND dv.year = :year'
. ' AND dv.month = :month')
->setParameter('vendor', $user->getVendor())
->setParameter('year', date('Y'))
->setParameter('month', date('n') - 1)
->getOneOrNullResult();
$tickettotalYear = $entityManager->createQuery('SELECT SUM(dv.ticket)'
. ' FROM App\Entity\Dwvendor dv'
. ' WHERE dv.vendor = :vendor'
. ' AND dv.year = :year')
->setParameter('vendor', $user->getVendor())
->setParameter('year', date('Y'))
->getOneOrNullResult();
$tickettotalYearPrev = $entityManager->createQuery('SELECT SUM(dv.ticket)'
. ' FROM App\Entity\Dwvendor dv'
. ' WHERE dv.vendor = :vendor'
. ' AND dv.year = :year')
->setParameter('vendor', $user->getVendor())
->setParameter('year', date('Y') - 1)
->getOneOrNullResult();
} else
//si el user logueado es wholesaler
if ($user->getWholesaler()) {
$fecha = new \DateTime();
$month = $fecha->format('n');
$year = $fecha->format('Y');
if ($month == 1) {
$monthp = 12;
$yearp = $year - 1;
} else {
$monthp = $month - 1;
$yearp = $year;
}
$ticketmonth = $entityManager->createQuery('SELECT SUM(dw.ticket)'
. ' FROM App\Entity\Dwwholesaler dw'
. ' WHERE dw.wholesaler = :wholesaler'
. ' AND dw.year = :year'
. ' AND dw.month = :month')
->setParameter('wholesaler', $user->getWholesaler())
->setParameter('year', $year)
->setParameter('month', $month)
->getOneOrNullResult();
$ticketmonthpreview = $entityManager->createQuery('SELECT SUM(dw.ticket)'
. ' FROM App\Entity\Dwwholesaler dw'
. ' WHERE dw.wholesaler = :wholesaler'
. ' AND dw.year = :year'
. ' AND dw.month = :month')
->setParameter('wholesaler', $user->getWholesaler())
->setParameter('year', $yearp)
->setParameter('month', $monthp)
->getOneOrNullResult();
$tickettotalYear = $entityManager->createQuery('SELECT SUM(dw.ticket)'
. ' FROM App\Entity\Dwwholesaler dw'
. ' WHERE dw.wholesaler = :wholesaler'
. ' AND dw.year = :year')
->setParameter('wholesaler', $user->getWholesaler())
->setParameter('year', $year)
->getOneOrNullResult();
$tickettotalYearPrev = $entityManager->createQuery('SELECT SUM(dw.ticket)'
. ' FROM App\Entity\Dwwholesaler dw'
. ' WHERE dw.wholesaler = :wholesaler'
. ' AND dw.year = :year')
->setParameter('wholesaler', $user->getWholesaler())
->setParameter('year', $yearp)
->getOneOrNullResult();
} else
//si el user logueado es Partner
if ($user->getPartner()) {
$ticketmonth = $entityManager->createQuery('SELECT SUM(dp.ticket)'
. ' FROM App\Entity\Dwpartner dp'
. ' WHERE dp.partner = :partner'
. ' AND dp.year = :year'
. ' AND dp.month = :month')
->setParameter('partner', $user->getPartner())
->setParameter('year', date('Y'))
->setParameter('month', date('n'))
->getOneOrNullResult();
$ticketmonthpreview = $entityManager->createQuery('SELECT SUM(dp.ticket)'
. ' FROM App\Entity\Dwpartner dp'
. ' WHERE dp.partner = :partner'
. ' AND dp.year = :year'
. ' AND dp.month = :month')
->setParameter('partner', $user->getPartner())
->setParameter('year', date('Y'))
->setParameter('month', date('n') - 1)
->getOneOrNullResult();
$tickettotalYear = $entityManager->createQuery('SELECT SUM(dp.ticket)'
. ' FROM App\Entity\Dwpartner dp'
. ' WHERE dp.partner = :partner'
. ' AND dp.year = :year')
->setParameter('partner', $user->getPartner())
->setParameter('year', date('Y'))
->getOneOrNullResult();
$tickettotalYearPrev = $entityManager->createQuery('SELECT SUM(dp.ticket)'
. ' FROM App\Entity\Dwpartner dp'
. ' WHERE dp.partner = :partner'
. ' AND dp.year = :year')
->setParameter('partner', $user->getPartner())
->setParameter('year', date('Y') - 1)
->getOneOrNullResult();
} else
//si el user logueado es Customer
if ($user->getCustomer()) {
$ticketmonth = $entityManager->createQuery('SELECT SUM(dc.ticket)'
. ' FROM App\Entity\Dwcustomer dc'
. ' WHERE dc.customer = :customer'
. ' AND dc.year = :year'
. ' AND dc.month = :month')
->setParameter('customer', $user->getCustomer())
->setParameter('year', date('Y'))
->setParameter('month', date('n'))
->getOneOrNullResult();
$ticketmonthpreview = $entityManager->createQuery('SELECT SUM(dc.ticket)'
. ' FROM App\Entity\Dwcustomer dc'
. ' WHERE dc.customer = :customer'
. ' AND dc.year = :year'
. ' AND dc.month = :month')
->setParameter('customer', $user->getCustomer())
->setParameter('year', date('Y'))
->setParameter('month', date('n') - 1)
->getOneOrNullResult();
$tickettotalYear = $entityManager->createQuery('SELECT SUM(dc.ticket)'
. ' FROM App\Entity\Dwcustomer dc'
. ' WHERE dc.customer = :customer'
. ' AND dc.year = :year')
->setParameter('customer', $user->getCustomer())
->setParameter('year', date('Y'))
->getOneOrNullResult();
$tickettotalYearPrev = $entityManager->createQuery('SELECT SUM(dc.ticket)'
. ' FROM App\Entity\Dwcustomer dc'
. ' WHERE dc.customer = :customer'
. ' AND dc.year = :year')
->setParameter('customer', $user->getCustomer())
->setParameter('year', date('Y') - 1)
->getOneOrNullResult();
}
$ticketmonthporcent = $ticketmonthpreview[1] ? (100 * ($ticketmonth[1] - $ticketmonthpreview[1]) / $ticketmonthpreview[1]) : 0;
$ticketyearporcentprev = $tickettotalYearPrev[1] ? (100 * ($tickettotalYear[1] - $tickettotalYearPrev[1]) / $tickettotalYearPrev[1]) : 0;
return $this->render('ticket/index.html.twig', [
'dataM' => $dataM,
'ticketmonth' => $ticketmonth[1] ? $ticketmonth[1] : 0,
'ticketmonthporcent' => $ticketmonthporcent,
'ticketyears' => $tickettotalYear[1] ? $tickettotalYear[1] : 0,
'ticketyearporcent' => $ticketyearporcentprev,
'estadosticket' => json_encode($this->SupportTicketByStatus($reportingColors, $user)),
]);
}
/**
* @Route("/ticket/default/indexclient", name="ticket_indexclient")
*/
public function indexclient(TrafficTracker $trafficTracker, Translation $translation, ReportingColors $reportingColors, Request $request): Response
{
$trafficTracker->registerTraffic();
$entityManager = $this->getDoctrine()->getManager();
$userRepository = $this->getDoctrine()->getRepository(User::class);
$supportcaseRepository = $this->getDoctrine()->getRepository(\App\Entity\Supportcase::class);
$locale = $request->getLocale();
$user = $this->getUser();
$dataC = array();
$incidencias = array();
$katy = false;
$ticketTipesToShow = array();
if ($userRepository->hasSupportRole($user) || $userRepository->hasRole($user, "ROLE_SUPPORT_TECHNICAL")) {
$ticketTipesToShow[] = 1;
}
if ($userRepository->hasAdminRole($user) || $userRepository->hasRole($user, "ROLE_SUPPORT_ADMINISTRATIVE")) {
$ticketTipesToShow[] = 2;
}
$katySupportUser = $entityManager->createQuery('SELECT distinct u'
. ' FROM App\Entity\User u'
. ' WHERE u.id = :user'
. ' AND u.roles like :role_one')
->setParameter('user', $user)
->setParameter('role_one', '%ROLE_SUPPORT_KATY%')
->getOneOrNullResult();
$katySupportManagementUser = $entityManager->createQuery('SELECT distinct u'
. ' FROM App\Entity\User u'
. ' WHERE u.id = :user'
. ' AND u.roles like :role_one')
->setParameter('user', $user)
->setParameter('role_one', '%ROLE_SUPPORT_MANAGEMENT_KATY%')
->getOneOrNullResult();
$katySupportBIUser = $entityManager->createQuery('SELECT distinct u'
. ' FROM App\Entity\User u'
. ' WHERE u.id = :user'
. ' AND u.roles like :role_one')
->setParameter('user', $user)
->setParameter('role_one', '%ROLE_BI_MANAGER%')
->getOneOrNullResult();
$katySupportAdminUser = $entityManager->createQuery('SELECT distinct u'
. ' FROM App\Entity\User u'
. ' WHERE u.id = :user'
. ' AND u.roles like :role_one')
->setParameter('user', $user)
->setParameter('role_one', '%ROLE_SUPPORT_ADMIN_KATY%')
->getOneOrNullResult();
//search the katy support type roles to show
$ticketKatyTypesToShow = array();
if ($katySupportUser) {
$ticketKatyTypesToShow[] = 4;
}
if ($katySupportBIUser) {
$ticketKatyTypesToShow[] = 5;
}
if ($katySupportManagementUser) {
$ticketKatyTypesToShow[] = 6;
}
//incidencias de canal
if ($user->getVendor() && $user->getVendor()->getisMiniVendor()) {
$supportcaseQ = $supportcaseRepository->MySupportCaseQuery($user);
$supportcaseQ->andWhere('s.createdby != :user');
$supportcaseQ->setParameter('user', $user);
$supportcaseQ->andwhere('s.tipoticket in (:tipo)');
$supportcaseQ->setParameter('tipo', $ticketTipesToShow);
} elseif ($katySupportUser || $katySupportManagementUser || $katySupportBIUser) {
//show platform technical tickets and/or platform management tickets and/or bi tickets
$supportcaseQ = $supportcaseRepository->MySupportCaseQuery($user);
$supportcaseQ->andwhere('s.tipoticket in (:tipo)');
$supportcaseQ->andWhere('s.createdby != :user');
$supportcaseQ->innerJoin('\App\Entity\Ticket', 't', 'WITH', 't.supportcase = s.id');
$supportcaseQ->andWhere('t.status != :closed OR t.creationdate >= :limitDate');
$supportcaseQ->setParameter('closed', 'closed');
$supportcaseQ->setParameter('limitDate', (new \DateTime())->modify('-3 months'));
$supportcaseQ->setParameter('tipo', $ticketKatyTypesToShow);
$supportcaseQ->setParameter('user', $user);
} else {
$supportcaseQ = $supportcaseRepository->MySupportCaseQuery($user);
$supportcaseQ->andWhere('s.createdby != :user');
$supportcaseQ->setParameter('user', $user);
$supportcaseQ->andWhere('s.tipoticket in (:tipo)');
$supportcaseQ->setParameter('tipo', $ticketTipesToShow);
$supportcaseQ->innerJoin('\App\Entity\Ticket', 't', 'WITH', 't.supportcase = s.id');
$supportcaseQ->andWhere('t.level = :level');
$supportcaseQ->setParameter('level', $userRepository->getUserLevel($request, $user) + 1);
$supportcaseQ->andWhere('t.status != :closed OR t.creationdate >= :limitDate');
$supportcaseQ->setParameter('closed', 'closed');
$supportcaseQ->setParameter('limitDate', (new \DateTime())->modify('-3 months'));
$supportcaseQ->orderBy('s.creationdate', 'DESC');
}
$incidencias = $supportcaseQ->getQuery()->execute();
if ($katySupportAdminUser) {
//show administrative vendor tickets
$supportcaseQ = $supportcaseRepository->MySupportCaseQuery($user);
$supportcaseQ->innerJoin('\App\Entity\Ticket', 't', 'WITH', ' t.supportcase = s.id');
$supportcaseQ->andwhere('s.tipoticket = :tipo');
$supportcaseQ->andwhere('t.level = 1');
$supportcaseQ->setParameter('tipo', 2);
$incidencias2 = $supportcaseQ->getQuery()->execute();
$incidencias = array_merge($incidencias, $incidencias2);
}
if (($userRepository->hasCommercialRole($user) || $user->getMaster() || $userRepository->hasRole($user, "ROLE_SUPPORT_COMMERCIAL")) && !$katySupportUser
&& !$katySupportManagementUser && !$katySupportAdminUser && !$katySupportBIUser
) {
$ticketTipesToShow[] = 3;
if ($user->getMaster()) {
$supportcaseQ->setParameter('tipo', '3');
} elseif ($user->getPartner()) {
$supportcaseQ->andWhere('c.idcommercialagent = :user2');
$supportcaseQ->setParameter('user2', $user);
$supportcaseQ->setParameter('tipo', '3');
} elseif ($user->getWholesaler()) {
$supportcaseQ->andWhere('pu.idcommercialagent = :user2');
$supportcaseQ->setParameter('user2', $user->getId());
$supportcaseQ->setParameter('tipo', '3');
}
$incidencias2 = $supportcaseQ->getQuery()->execute();
$incidencias = array_merge($incidencias, $incidencias2);
}
foreach ($incidencias as $incidencia) {
if ($user->getVendor() && $user->getVendor()->getisMiniVendor()) {
$ticketToMe = $entityManager->createQuery('SELECT t'
. ' FROM App\Entity\Ticket t'
. ' WHERE t.supportcase = :supportcase')
->setParameter('supportcase', $incidencia)
->getOneOrNullResult();
$myTicket = $entityManager->createQuery('SELECT t'
. ' FROM App\Entity\Ticket t'
. ' WHERE t.supportcase = :supportcase')
->setParameter('supportcase', $incidencia)
->getOneOrNullResult();
} else {
if ($katySupportUser || $katySupportManagementUser || $katySupportAdminUser || $katySupportBIUser) { //if user katy
$ticketToMe = $entityManager->createQuery('SELECT t'
. ' FROM App\Entity\Ticket t'
. ' WHERE t.supportcase = :supportcase')
->setParameter('supportcase', $incidencia)
->getOneOrNullResult();
} else {
$ticketToMe = $entityManager->createQuery('SELECT t'
. ' FROM App\Entity\Ticket t'
. ' WHERE t.supportcase = :supportcase'
. ' AND t.level = :level')
->setParameter('supportcase', $incidencia)
->setParameter('level', $userRepository->getUserLevel($request, $user) + 1)
->getOneOrNullResult();
}
$myTicket = $entityManager->createQuery('SELECT t'
. ' FROM App\Entity\Ticket t'
. ' WHERE t.supportcase = :supportcase'
. ' AND t.level = :level')
->setParameter('supportcase', $incidencia)
->setParameter('level', $userRepository->getUserLevel($request, $user))
->getOneOrNullResult();
}
$companyName = 'KATY';
$level = 0;
if ($incidencia->getCreatedby()->getCustomer()) {
$customerName = $userRepository->getCompanyName($incidencia->getCreatedby());
$companyName = $customerName;
$level = 4;
$partnerName = $incidencia->getCreatedby()->getCustomer()->getPartner()->getName();
} else {
$customerName = null;
}
if ($incidencia->getCreatedby()->getPartner()) {
$partnerName = $userRepository->getCompanyName($incidencia->getCreatedby());
$companyName = $partnerName;
$level = 3;
if ($incidencia->getTipoTicket()->getId() === 1) {
$TicketTecnico = $entityManager->getRepository(\App\Entity\Tickettecnico::class)->find($incidencia);
if ($TicketTecnico) {
$customerName = $TicketTecnico->getCustomer() ? $TicketTecnico->getCustomer()->getCompany() : '';
}
}
} else {
$partnerName = null;
}
if ($incidencia->getCreatedby()->getWholesaler()) {
$companyName = $incidencia->getCreatedby()->getWholesaler()->getName();
$level = 2;
}
if ($incidencia->getCreatedby()->getVendor()) {
$companyName = $incidencia->getCreatedby()->getVendor()->getName();
$level = 1;
}
$ticketRepository = $entityManager->getRepository(\App\Entity\Ticket::class);
$supportcaseRepository = $entityManager->getRepository(\App\Entity\Supportcase::class);
$supportCaseId = $supportcaseRepository->getSupportCaseId10Digits($incidencia);
if (!$user->getVendor() && !$user->getWholesaler() && !$user->getPartner() && !$user->getCustomer()) {
$katy = true;
}
if (!$user->getVendor() && !$supportcaseRepository->isToMinivendor($incidencia)) {
$dataC[] = array(
'id' => $incidencia->getId(),
'number' => $ticketToMe ? $ticketToMe->getSupportCase()->getId() : 'N/A',
'tipo' => $translation->getTranslationBy($incidencia->getTipoticket(), $locale, 'nombretipo'),
'creationDate' => $ticketToMe ? $ticketToMe->getCreationdate() : $incidencia->getCreationdate(),
'orderDate' => $ticketToMe ? $ticketToMe->getCreationdate()->format('Ymdhms') : $incidencia->getCreationdate()->format('Ymdhms'),
'status' => $ticketToMe ? $ticketToMe->getStatus() : '',
'subject' => $incidencia->getSubject(),
'userlevel' => $userRepository->getUserLevel($request, $user),
'companyName' => $companyName,
'level' => $level,
'Partnername' => $partnerName,
'supportCaseId' => $supportCaseId,
'ClientName' => $customerName,
'myTicket' => $myTicket ? $ticketRepository->getStatusTicket($user, $myTicket) : '-',
'ticketToMe' => $ticketToMe ? $ticketRepository->getStatusTicket($user, $ticketToMe) : '-',
);
} else {
if ($user->getVendor()) {
$dataC[] = array(
'id' => $incidencia->getId(),
'number' => $ticketToMe ? $ticketToMe->getSupportCase()->getId() : 'N/A',
'tipo' => $translation->getTranslationBy($incidencia->getTipoticket(), $locale, 'nombretipo'),
'creationDate' => $incidencia->getCreationdate(),
'orderDate' => $incidencia->getCreationdate()->format('Ymdhms'),
'status' => $ticketToMe ? $ticketToMe->getStatus() : '',
'subject' => $incidencia->getSubject(),
'userlevel' => $userRepository->getUserLevel($request, $user),
'Partnername' => $partnerName,
'supportCaseId' => $supportCaseId,
'ClientName' => $customerName,
'myTicket' => $myTicket ? $ticketRepository->getStatusTicket($user, $myTicket) : '-',
'ticketToMe' => $ticketToMe ? $ticketRepository->getStatusTicket($user, $ticketToMe) : '-',
);
}
}
}
return $this->render('ticket/indexclient.html.twig', [
'dataC' => $dataC,
'isKatyUser' => $katy,
//'estadosticket' => json_encode($this->SupportTicketByStatus($reportingColors, $user)),
]);
}
/**
* @Route("/ticket/default/new/{product}", defaults={"product"=null}, name="ticket_new")
*/
public function new($product, TrafficTracker $trafficTracker, TranslatorInterface $translator, ServiceNotification $serviceNotification, ProductlineJsonTree $jsonTreeService, Translation $translation, Request $request): Response
{
$trafficTracker->registerTraffic();
$entityManager = $this->getDoctrine()->getManager();
$locale = $request->getLocale();
$user = $this->getUser();
$licenses = array();
$session = $this->get('session');
$jsonData = $jsonTreeService->getJsonTree(null, $locale, $user, true, true);
$ticket = new Ticket();
// Create form
if ($user->getCustomer()) {
$licenses = $entityManager->createQuery('SELECT l'
. ' FROM App\Entity\License l'
. ' WHERE l.customer = :customer')
->setParameter('customer', $user->getCustomer())
->getResult();
}
$form = $this->createForm(TicketEditType::class, $ticket, array(
'licenses' => $licenses,
'user' => $user,
'locale' => $locale,
'translator' => $translator,
'entityManager' => $entityManager,
'translation' => $translation,
'product' => $product
));
// If submitted
$form->handleRequest($request);
// If cancelled
if ($form->getClickedButton() && 'cancel' === $form->getClickedButton()->getName()) {
$session->getFlashBag()->add('warning', $translator->trans('app.General.SystemMessages.NotCreated'));
return $this->redirectToRoute('ticket_index');
}
if ($form->isSubmitted()) {
if ($form->isValid()) {
$tipoTicket = $this->getDoctrine()->getRepository(Tipoticket::class)->find($_POST['ticket_edit']['tipoincidencia']);
if ($tipoTicket->getId() == 1 && $user->getWholesaler()) {
if (!isset($_POST['ticket_edit']['idproductline']) || $_POST['ticket_edit']['idproductline'] == '') {
$session->getFlashBag()->add('danger', $translator->trans('app.Support.System.VendorNotSelected'));
return $this->redirectToRoute('ticket_new');
}
}
$this->createNewSupportCase($request, $_POST['ticket_edit'], $translator, $serviceNotification, $form);
// Redirect and show result
$session->getFlashBag()->add('success', $translator->trans('app.General.SystemMessages.Created'));
return $this->redirectToRoute('ticket_index');
} else {
//If form is not valid return flahsbag with errors
$string = $this->getErrorMessages($form);
foreach ($string as $clave => $valor) {
$session->getFlashBag()->add('danger', $valor[0]);
}
return $this->redirectToRoute('ticket_index');
}
}
return $this->render('ticket/new.html.twig', [
'form' => $form->createView(),
'treedata' => $jsonData,
'product' => $product
]);
}
/**
* @Route("/ticket/default/reply/{id}", name="ticket_reply", requirements={"id"="\d+"})
*/
public function reply(TrafficTracker $trafficTracker, TranslatorInterface $translator, ServiceNotification $serviceNotification, Translation $translation, Request $request, $id = 0)
{
$trafficTracker->registerTraffic();
$session = $this->get('session');
$entityManager = $this->getDoctrine()->getManager();
$locale = $request->getLocale();
$user = $this->getUser();
$userRepository = $entityManager->getRepository(\App\Entity\User::class);
$selfUserLevel = $userRepository->getUserLevel($request, $user);
// Find ticket
$supportCaseRepository = $entityManager->getRepository(\App\Entity\Supportcase::class);
$case = $supportCaseRepository->find($id);
$companiesData = ['partner' => 'N/A', 'customer' => 'N/A'];
$ticketRepository = $entityManager->getRepository(\App\Entity\Ticket::class);
$ticketQ = $ticketRepository->MyTicketQuery($user);
$ticketQ->andWhere('t.supportcase = :supportCase');
$ticketQ->setParameter('supportCase', $id);
$ticketQ->andwhere('t.level = :level');
$ticketQ->setParameter('level', $selfUserLevel);
$ticketR = $ticketQ->getQuery()->execute();
$myTicket = $ticketR[0];
if (!$myTicket) {
throw new AccessDeniedHttpException();
}
if (!$case) {
$session->getFlashBag()->add('danger', $translator->trans('app.General.SystemMessages.TicketNotFound'));
return $this->redirectToRoute('ticket_index');
}
$userlist = array();
// notificar user mayorista
if ($user->getWholesaler()) {
$userlist = $entityManager->createQuery('SELECT u'
. ' FROM App\Entity\User u'
. ' WHERE u.wholesaler = :wholesaler'
. ' AND u.id != :id')
->setParameter('wholesaler', $user->getWholesaler())
->setParameter('id', $user->getId())
->getResult();
}
if ($user->getPartner()) {
$userlist = $entityManager->createQuery('SELECT u'
. ' FROM App\Entity\User u'
. ' WHERE u.partner = :partner'
. ' AND u.id != :id')
->setParameter('partner', $user->getPartner())
->setParameter('id', $user->getId())
->getResult();
}
if ($user->getCustomer()) {
$userlist = $entityManager->createQuery('SELECT u'
. ' FROM App\Entity\User u'
. ' WHERE u.customer = :customer'
. ' AND u.id != :id')
->setParameter('customer', $user->getCustomer())
->setParameter('id', $user->getId())
->getResult();
}
$ticketTecnico = $entityManager->createQuery('SELECT tt'
. ' FROM App\Entity\Tickettecnico tt'
. ' WHERE tt.supportcase = :supportcase')
->setParameter('supportcase', $id)
->getOneOrNullResult();
$producto = $entityManager->createQuery('SELECT p'
. ' FROM App\Entity\Product p'
. ' JOIN App\Entity\License l'
. ' JOIN App\Entity\Tickettecnico tt'
. ' WITH p.id = l.product'
. ' AND l.id = tt.license'
. ' WHERE tt.supportcase = :supportcase')
->setParameter('supportcase', $id)
->getOneOrNullResult();
$ticketmessage2 = new \App\Entity\Ticketmessage();
$form2 = $this->get('form.factory')->createNamed('formLeft', MessageSupport::class, $ticketmessage2, array(
//'level' => $selfUserLevel,
'user' => $user,
//'myTicket' => $myTicket,
'listuser' => $userlist,
'translator' => $translator,
'em' => $entityManager,
));
$ticketmessage = new \App\Entity\Ticketmessage();
$form = $this->get('form.factory')->createNamed('formRight', MessageSupport::class, $ticketmessage, array(
//'level' => $selfUserLevel,
'user' => $user,
'listuser' => $userlist,
//'myTicket' => $myTicket,
'translator' => $translator,
'em' => $entityManager,
));
//Si se ha hecho submit en el formulario de la izquierda
if ($request->request->has('formLeft')) {
$form2->handleRequest($request);
if ($form2->isValid()) {
$this->createTicketMessage($translator, $serviceNotification, $request, $form2, $myTicket, $case);
// Redirect and show result
return $this->redirectToRoute('ticket_reply', array('id' => $id));
}
}
//Si se ha hecho submit en el formulario de la derecha
if ($request->request->has('formRight')) {
$form->handleRequest($this->getRequest());
if ($form->isValid()) {
$this->createTicketMessage($translator, $serviceNotification, $request, $form, $ticketRight, $case);
// Redirect and show result
return $this->redirectToRoute('ticket_reply', array('id' => $id));
}
}
if ($case->getCreatedBy()->getPartner()) {
$companiesData['partner'] = $case->getCreatedBy()->getPartner()->getName();
$companiesData['customer'] = 'N/A';
}
if ($case->getCreatedBy()->getCustomer()) {
$companiesData['partner'] = $case->getCreatedBy()->getCustomer()->getPartner()->getName();
$companiesData['customer'] = $case->getCreatedBy()->getCustomer()->getCompany();
}
if ($ticketTecnico) {
if ($ticketTecnico->getCustomer()) {
$companiesData['partner'] = $ticketTecnico->getCustomer()->getPartner()->getName();
$companiesData['customer'] = $ticketTecnico->getCustomer()->getCompany();
}
}
if ($ticketTecnico && $selfUserLevel == 2) {
$vendorData = $userRepository->getVendorByProduct($ticketTecnico, $user);
if ($vendorData) {
$vendorName = $vendorData->getName();
} else {
$vendorName = '';
}
} else {
$vendorName = '';
}
if (
$case->getTipoTicket()->getId() == 4 || $user->getVendor()
|| $case->getTipoTicket()->getId() == 5 || $case->getTipoTicket()->getId() == 6
) {
//platform tickets and administrative vendor tickets and bi tickets to katy user
$profileUp = 'KATY';
} else {
$profileUp = $selfUserLevel == 2 ? $vendorName : $userRepository->getLevelUpCompany($user)->getName();
}
return $this->render('ticket/reply.html.twig', [
'ticket' => $myTicket,
'case' => $case,
'caseId' => $supportCaseRepository->getSupportCaseId10Digits($case),
'tecnico' => $ticketTecnico ? $ticketTecnico : null,
'producto' => $producto ? $producto->getName() : null,
'files' => $this->getFiles($myTicket ? $myTicket->getId() : ''),
'messages' => $myTicket ? $ticketRepository->getTicketmessages($myTicket) : null,
'selfUserLevel' => $selfUserLevel,
'form' => $form->createView(),
'form2' => $form2->createView(),
'escalado' => false,
'escalable' => false,
'profileUp' => $profileUp,
'tipo' => $translation->getTranslationBy($case->getTipoTicket(), $locale, 'nombretipo'),
'isKatyUser' => false,
'companiesData' => $companiesData,
]);
}
/**
* @Route("/ticket/default/replyclient/{id}", name="ticket_replyclient", requirements={"id"="\d+"})
*/
public function replyclient(TrafficTracker $trafficTracker, TranslatorInterface $translator, ServiceNotification $serviceNotification, Translation $translation, Request $request, $id = 0)
{
$trafficTracker->registerTraffic();
$entityManager = $this->getDoctrine()->getManager();
$locale = $request->getLocale();
$user = $this->getUser();
$userRepository = $entityManager->getRepository(\App\Entity\User::class);
$ticketRepository = $this->getDoctrine()->getRepository(Ticket::class);
$supportcaseRepository = $entityManager->getRepository(\App\Entity\Supportcase::class);
$selfUserLevel = $userRepository->getUserLevel($request, $user);
$tecnico = null;
$session = $this->get('session');
$katy = false;
$companiesData = ['partner' => 'N/A', 'customer' => 'N/A'];
$case = $supportcaseRepository->find($id);
$ticketQ = $ticketRepository->MyTicketClientQuery($user);
$ticketQ->andWhere('t.supportcase = :supportcase');
$ticketQ->setParameter('supportcase', $id);
$ticketQ->andwhere('t.level = :level');
$ticketQ->setParameter('level', $selfUserLevel);
$ticketR = $ticketQ->getQuery()->execute();
$myTicket = $ticketR ? $ticketR[0] : null;
$ticketQ2 = $ticketRepository->MyTicketClientQuery($user);
$ticketQ2->andWhere('t.supportcase = :supportcase');
$ticketQ2->setParameter('supportcase', $id);
$ticketQ2->andwhere('t.level = :level');
$ticketQ2->setParameter('level', $selfUserLevel + 1);
$ticketR2 = $ticketQ2->getQuery()->execute();
$ticketToMe = $ticketR2 ? $ticketR2[0] : null;
if ($user->getVendor() && $user->getVendor()->getisMiniVendor()) {
$ticketQ3 = $ticketRepository->MyTicketClientQuery($user);
$ticketQ3->andWhere('t.supportcase = :supportcase');
$ticketQ3->setParameter('supportcase', $id);
$ticketR3 = $ticketQ3->getQuery()->execute();
$ticketToMe = $ticketR3[0];
}
if ($ticketToMe && $ticketToMe->getSupportcase()->getTipoTicket()->getId() == 3) {
if ($user->getMaster()) {
} elseif ($ticketToMe->getUser()->getPartner()) {
if ($ticketToMe->getUser()->getPartner()->getIdcommercialagent() != $user->getId()) {
$session->getFlashBag()->add('danger', $translator->trans('app.General.SystemMessages.TicketNotFound'));
return $this->redirectToRoute('ticket_index');
}
} elseif ($ticketToMe->getUser()->getCustomer()) {
if ($ticketToMe->getUser()->getCustomer()->getIdcommercialagent() != $user->getId()) {
$session->getFlashBag()->add('danger', $translator->trans('app.General.SystemMessages.TicketNotFound'));
return $this->redirectToRoute('ticket_index');
}
}
}
if (!$case) {
$session->getFlashBag()->add('danger', $translator->trans('app.General.SystemMessages.TicketNotFound'));
return $this->redirectToRoute('ticket_index');
}
if (
$case->getTipoTicket()->getId() == 4 || $case->getTipoTicket()->getId() == 5
|| $case->getTipoTicket()->getId() == 6
) { //platform ticket or bi ticket
$ticketQ3 = $ticketRepository->MyTicketClientQuery($user);
$ticketQ3->andWhere('t.supportcase = :supportcase');
$ticketQ3->setParameter('supportcase', $id);
$ticketR3 = $ticketQ3->getQuery()->execute();
$ticketToMe = $ticketR3[0];
$myTicket = null;
}
if ($user->getVendor()) {
if (!$ticketToMe)
throw new AccessDeniedHttpException();
} else {
if (!$myTicket && !$ticketToMe)
throw new AccessDeniedHttpException();
}
$userlist = array();
//TO DO
// notificar user mayorista
if ($user->getWholesaler()) {
$userlist = $entityManager->createQuery('SELECT u'
. ' FROM App\Entity\User u'
. ' WHERE u.wholesaler = :wholesaler'
. ' AND u.id != :id')
->setParameter('wholesaler', $user->getWholesaler())
->setParameter('id', $user->getId())
->getResult();
}
if ($user->getPartner()) {
$userlist = $entityManager->createQuery('SELECT u'
. ' FROM App\Entity\User u'
. ' WHERE u.partner = :partner'
. ' AND u.id != :id')
->setParameter('partner', $user->getPartner())
->setParameter('id', $user->getId())
->getResult();
}
if ($user->getCustomer()) {
$userlist = $entityManager->createQuery('SELECT u'
. ' FROM App\Entity\User u'
. ' WHERE u.customer = :customer'
. ' AND u.id != :id')
->setParameter('customer', $user->getCustomer())
->setParameter('id', $user->getId())
->getResult();
}
$ticketTecnico = $entityManager->createQuery('SELECT tt'
. ' FROM App\Entity\Tickettecnico tt'
. ' WHERE tt.supportcase = :supportcase')
->setParameter('supportcase', $id)
->setMaxResults(1)
->getOneOrNullResult();
$producto = $entityManager->createQuery('SELECT p'
. ' FROM App\Entity\Product p'
. ' JOIN App\Entity\License l'
. ' JOIN App\Entity\Tickettecnico tt'
. ' WITH p.id = l.product'
. ' AND l.id = tt.license'
. ' WHERE tt.supportcase = :supportcase')
->setParameter('supportcase', $id)
->setMaxResults(1)
->getOneOrNullResult();
$ticketmessage = new \App\Entity\Ticketmessage();
$form = $this->get('form.factory')->createNamed('formRight', MessageSupport::class, $ticketmessage, array(
//'level' => $selfUserLevel,
'user' => $user,
//'statusticket' => $ticketToMe->getStatus(),
'listuser' => $userlist,
//'myTicket' => $myTicket ? $myTicket : null,
//'ticketToMe' => $ticketToMe,
'translator' => $translator,
'em' => $entityManager,
));
$ticketmessage2 = new \App\Entity\Ticketmessage();
$form2 = $this->get('form.factory')->createNamed('formLeft', MessageSupport::class, $ticketmessage2, array(
//'level' => $selfUserLevel,
'user' => $user,
'listuser' => $userlist,
//'myTicket' => $myTicket ? $myTicket : null,
'translator' => $translator,
'em' => $entityManager,
));
// If submitted
if ($request->request->has('formLeft')) {
$form2->handleRequest($request);
if ($form2->isValid()) {
$this->createTicketMessage($translator, $serviceNotification, $request, $form2, $ticketToMe, $case);
// Redirect and show result
return $this->redirectToRoute('ticket_replyclient', array('id' => $id));
}
}
// If submitted
if ($request->request->has('formRight')) {
$form->handleRequest($request);
if ($form->isValid()) {
$this->createTicketMessage($translator, $serviceNotification, $request, $form, $myTicket, $case);
// Redirect and show result
return $this->redirectToRoute('ticket_replyclient', array('id' => $id));
}
}
if ($ticketToMe) {
$ticketTecnico = $entityManager->createQuery('SELECT tt'
. ' FROM App\Entity\Tickettecnico tt'
. ' WHERE tt.supportcase = :supportcase')
->setParameter('supportcase', $ticketToMe->getSupportcase())
->getOneOrNullResult();
} else {
$ticketTecnico = null;
}
$profileUp = null;
//Poner nombre de la compañia / vendor en el titulo del ticket escalado.
if ($selfUserLevel == 2 && $case->getTipoTicket()->getId() == 1) {
$vendor = $userRepository->getVendorByProduct($ticketTecnico, $user);
if (!is_null($vendor)) {
$profileUp = $vendor->getName();
}
} elseif (
$case->getTipoTicket()->getId() == 4 || $case->getTipoTicket()->getId() == 2
|| $case->getTipoTicket()->getId() == 5 || $case->getTipoTicket()->getId() == 6
) {
//platform tickets and administrative vendor tickets and bi tickets to katy user
$profileUp = 'KATY';
} else {
$profileUp = $userRepository->getLevelUpCompany($user)->getName();
}
if ($case->getCreatedBy()->getPartner()) {
$companiesData['partner'] = $case->getCreatedBy()->getPartner()->getName();
$companiesData['customer'] = 'N/A';
}
if ($case->getCreatedBy()->getCustomer()) {
$companiesData['partner'] = $case->getCreatedBy()->getCustomer()->getPartner()->getName();
$companiesData['customer'] = $case->getCreatedBy()->getCustomer()->getCompany();
}
//Return Ticket Commercial or Ticket Tecnico
$ticketComercial = $case->getTicketComercial();
if (!is_null($ticketTecnico) || !is_null($ticketComercial)) {
if (isset($ticketTecnico)) {
$tecnico = $ticketTecnico;
if ($ticketTecnico->getCustomer()) {
$companiesData['partner'] = $ticketTecnico->getCustomer()->getPartner()->getName();
$companiesData['customer'] = $ticketTecnico->getCustomer()->getCompany();
}
}
if (isset($ticketComercial)) {
$tecnico = $ticketComercial;
}
}
if (!$user->getVendor() && !$user->getWholesaler() && !$user->getPartner() && !$user->getCustomer()) {
$katy = true;
}
return $this->render('ticket/reply.html.twig', [
'replyclient' => true,
'ticketToMe' => $ticketToMe,
'myTicket' => $myTicket,
'userRepository' => $userRepository,
'case' => $case,
'caseId' => $case ? $supportcaseRepository->getSupportCaseId10Digits($case) : '',
'tecnico' => $tecnico ? $tecnico : null,
'producto' => $producto ? $producto->getName() : null,
'files' => $ticketToMe ? $this->getFiles($ticketToMe->getId()) : '',
'filesUp' => $myTicket ? $this->getFiles($myTicket->getId()) : '',
'messages' => $ticketToMe ? $ticketRepository->getTicketmessages($ticketToMe) : null,
'messagesScalated' => $myTicket ? $ticketRepository->getTicketmessages($myTicket) : null,
'selfUserLevel' => $selfUserLevel,
'form' => $form->createView(),
'form2' => $form2->createView(),
'level' => 1,
'profileUp' => $profileUp,
'profileDown' => $ticketToMe ? $userRepository->getCompanyName($ticketToMe->getUser()) : 'N/A',
'escalado' => $ticketToMe && $myTicket ? true : false,
'tipo' => $translation->getTranslationBy($case->getTipoTicket(), $locale, 'nombretipo'),
'isKatyUser' => $katy,
'companiesData' => $companiesData,
]);
}
/**
* @Route("/ticket/default/deletefile/{id}", name="ticket_deletefile")
*/
public function deletefile(TranslatorInterface $translator, $id)
{
$entityManager = $this->getDoctrine()->getManager();
$path = $this->getParameter('private_folder') . 'ticket/';
$file = $entityManager->createQuery('SELECT tmf'
. ' FROM App\Entity\Ticketmessagefile tmf'
. ' WHERE tmf.id = :id')
->setParameter('id', $id)
->getOneOrNullResult();
$fileInTickets = $entityManager->createQuery('SELECT count(t.id)'
. ' FROM App\Entity\Ticket t'
. ' JOIN App\Entity\Ticketmessage tm'
. ' JOIN App\Entity\Ticketmessagefile tmf'
. ' WITH t.id = tm.ticket'
. ' AND tm.id = tmf.message'
. ' WHERE tmf.deletedby is null'
. ' AND tmf.filename = :filename')
->setParameter('filename', $file->getFilename())
->getOneOrNullResult();
$ticket = $file->getMessage()->getTicket();
$ticketMessage = new \App\Entity\Ticketmessage();
$ticketMessage->setUser($this->getUser());
$ticketMessage->setTicket($ticket);
$ticketMessage->setDate(new \DateTime);
$ticketMessage->setMessage($translator->trans('app.Support.System.FileDeleted') . ' ' . $file->getOriginalfilename());
$ticketMessage->setLocale($this->getUser()->getLocale());
$ticketMessage->setLevel(0);
$ticketMessage->setAutomatic(1);
$entityManager->persist($ticketMessage);
$entityManager->flush();
//$ticket->addTicketmessage($ticketMessage);
if ($fileInTickets == 1) {
$file->setDeletedBy($this->getUser());
$entityManager->persist($file);
$entityManager->flush();
unlink($path . $file->getFilename());
} else {
$file->setDeletedBy($this->getUser());
$entityManager->persist($file);
$entityManager->flush();
}
return $this->redirect($_SERVER['HTTP_REFERER']);
}
/**
* @Route("/ticket/default/file/{name}", name="ticket_file", requirements={"name"="\S+"})
*/
public function ticketFile($name)
{
$entityManager = $this->getDoctrine()->getManager();
$fichero = $entityManager->createQuery('SELECT tmf'
. ' FROM App\Entity\Ticketmessagefile tmf'
. ' WHERE tmf.filename like :filename')
->setParameter('filename', $name . '%')
->setMaxResults(1)
->getOneOrNullResult();
$user = $this->getUser();
// Build internal full path
$path = $this->getParameter('private_folder') . 'ticket/';
$file = $path . $fichero->getFilename();
if ($fichero->getFilename() && file_exists($file)) {
$content = file_get_contents($file);
$response = new Response();
$response->headers->set('Content-Type', mime_content_type($file));
$response->headers->set('Content-Disposition', 'attachment;filename="' . $fichero->getOriginalfilename());
$response->setContent($content);
return $response;
}
}
/**
* @Route("/ticket/default/pasarfichero/{id}/{to}", name="ticket_pasarfichero")
*/
public function pasarfichero(TranslatorInterface $translator, Request $request, $id, $to)
{
$entityManager = $this->getDoctrine()->getManager();
$session = $this->get('session');
$isInArray = false;
$file = $entityManager->createQuery('SELECT tmf'
. ' FROM App\Entity\Ticketmessagefile tmf'
. ' WHERE tmf.id = :id')
->setParameter('id', $id)
->getOneOrNullResult();
$ticket = $file->getMessage()->getTicket();
$user = $this->getUser();
if ($to == 'up') {
$level = $ticket->getLevel() - 1;
} else {
$level = $ticket->getLevel() + 1;
}
$ticketReceptor = $entityManager->createQuery('SELECT t'
. ' FROM App\Entity\Ticket t'
. ' WHERE t.supportcase = :supportcase'
. ' AND t.level = :level')
->setParameter('supportcase', $ticket->getSupportCase())
->setParameter('level', $level)
->setMaxResults(1)
->getOneOrNullResult();
if ($ticketReceptor) {
$ficherosTicketReceptor = $entityManager->createQuery('SELECT tmf'
. ' FROM App\Entity\Ticketmessagefile tmf'
. ' JOIN tmf.message tm'
. ' JOIN tm.ticket t'
. ' WHERE t.supportcase = :supportcase'
. ' AND t.id = :id'
. ' AND tmf.deletedby is null')
->setParameter('supportcase', $ticketReceptor->getSupportcase())
->setParameter('id', $ticketReceptor->getId())
->getResult();
foreach ($ficherosTicketReceptor as $tmpfile) {
if ($tmpfile->getFilename() == $file->getFilename())
$isInArray = true;
}
if ($isInArray || $ticketReceptor->getStatus() == 'CLOSED') {
if ($isInArray)
$session->getFlashBag()->add('danger', $translator->trans('app.Support.System.ExistingFile'));
else
$session->getFlashBag()->add('danger', $translator->trans('app.Support.System.TicketClosed'));
} else {
$message = new \App\Entity\Ticketmessage();
$message->setUser($user);
$message->setMessage($translator->trans('app.Support.System.FileMoved') . ' ' . $file->getOriginalfilename());
$message->setLocale($request->getLocale());
$message->setAutomatic(1);
$message->setDate(new \DateTime);
$message->setStatus('PENDING');
$message->setTicket($ticketReceptor);
$entityManager->persist($message);
$entityManager->flush();
$newFile = new \App\Entity\Ticketmessagefile();
$newFile->setFilename($file->getFilename());
$newFile->setOriginalfilename($file->getOriginalfilename());
$newFile->setFilename($file->getFilename());
$newFile->setMessage($message);
$entityManager->persist($newFile);
$entityManager->flush();
}
} else {
$userRepository = $entityManager->getRepository(\App\Entity\User::class);
$selfUserLevel = $userRepository->getUserLevel($request, $user);
$newTicket = new Ticket();
$newTicket->setSupportcase($ticket->getSupportcase());
$newTicket->setUser($user);
$newTicket->setLevel($selfUserLevel);
$newTicket->setCreationdate(new \DateTime);
$newTicket->setLastmodification(new \DateTime);
$entityManager->persist($newTicket);
$entityManager->flush();
$ticketMessage = new \App\Entity\Ticketmessage();
$ticketMessage->setUser($user);
$ticketMessage->setMessage($translator->trans('app.Support.MoveFile') . ' ' . $file->getOriginalfilename());
$ticketMessage->setLocale($request->getLocale());
$ticketMessage->setAutomatic(1);
$ticketMessage->setDate(new \DateTime);
$ticketMessage->setStatus('PENDING');
$entityManager->persist($ticketMessage);
$entityManager->flush();
$nwFile = new \App\Entity\Ticketmessagefile();
$nwFile->setFilename($file->getFilename());
$nwFile->setOriginalfilename($file->getOriginalfilename());
$nwFile->setFilename($file->getFilename());
$nwFile->setMessage($ticketMessage);
$entityManager->persist($nwFile);
$entityManager->flush();
}
return $this->redirect($_SERVER['HTTP_REFERER']);
}
/**
* @Route("/ticket/default/getlicensesbyclient", name="ticket_getlicensesbyclient")
*/
public function getlicensesbyclient(TranslatorInterface $translator, Request $request)
{
$user = $this->getUser();
$arrayLicencias = array();
$id = $request->get('id');
$userRepository = $this->getDoctrine()->getRepository(\App\Entity\User::class)->findOneBy(['customer' => $id]);
if (is_null($userRepository)) {
return new JsonResponse();
}
$licenseRepository = $this->getDoctrine()->getRepository(\App\Entity\License::class);
$licenseQ = $licenseRepository->MyLicenseQuery($userRepository);
$licencias = $licenseQ->getQuery()->execute();
$arrayLicencias['0'] = $translator->trans('app.General.Others');
foreach ($licencias as $licencia) {
$arrayLicencias[$licencia->getId()] = $licencia->getProduct()->getDescriptiveName() . $licenseRepository->getLast4Digits($licencia);
}
return new JsonResponse($arrayLicencias);
}
public function SupportTicketByStatus(ReportingColors $reportingColors, $user)
{
$entityManager = $this->getDoctrine()->getManager();
$json_data = array();
$estadosticket = $entityManager->createQuery('SELECT t.status, COUNT(t.status) as count'
. ' FROM App\Entity\Ticket t'
. ' WHERE t.user = :user'
. ' GROUP BY t.status')
->setParameter('user', $user)
->getArrayResult();
$color = $reportingColors->EstadoColor();
foreach ($estadosticket as $estado) {
$estad['status'] = $estado['status'];
$estad['count'] = $estado['count'];
if ($estado['status'] == 'PENDING')
$estad['color'] = $color['PENDING'];
if ($estado['status'] == 'PROCESS')
$estad['color'] = $color['PROCESS'];
if ($estado['status'] == 'RESOLVED')
$estad['color'] = $color['RESOLVED'];
if ($estado['status'] == 'CLOSED')
$estad['color'] = $color['CLOSED'];
array_push($json_data, $estad);
}
return $json_data;
}
public function getUsersAndRolesToNotify($case, $ticket, $translator)
{
$entityManager = $this->getDoctrine()->getManager();
$userRepository = $entityManager->getRepository(\App\Entity\User::class);
$vendorRepository = $entityManager->getRepository(\App\Entity\Vendors::class);
$ticketTecnico = null;
switch ($case->getTipoTicket()->getId()) {
case 1:
//Técnico
$tipoticket = ($translator->trans('app.Support.DropDownTechnical'));
$ticketTecnico = $entityManager->createQuery('SELECT tt'
. ' FROM App\Entity\Tickettecnico tt'
. ' WHERE tt.supportcase = :id')
->setParameter('id', $case->getId())
->getOneOrNullResult();
break;
case 2:
//Administración
$tipoticket = ($translator->trans('app.Support.DropDownAdministration'));
break;
case 3:
//Comercial
$tipoticket = ($translator->trans('app.Support.DropDownCommercial'));
break;
case 4:
//Plataforma técnico
$tipoticket = ($translator->trans('app.Support.DropDownPlatform'));
break;
case 5:
//BI
$tipoticket = ($translator->trans('BI'));
break;
case 6:
//Plataforma gestión
$tipoticket = ($translator->trans('app.Support.DropDownPlatform'));
break;
}
if ($ticket->getUser()->getWholesaler() && $ticketTecnico && $ticketTecnico->getProductline()) {
$usersToNotify = $entityManager->createQuery('SELECT distinct u'
. ' FROM App\Entity\User u'
. ' WHERE u.vendor = :vendor'
. ' AND u.roles like :role_one')
->setParameter('vendor', $ticketTecnico->getProductline()->getVendor())
->setParameter('role_one', '%ROLE_SUPPORT_VENDOR%')
->getResult();
} else {
$levelUp = $userRepository->getLevelUpCompany($ticket->getUser());
$partner = $ticket->getUser()->getPartner();
if ($case->getTipoTicket()->getId() == 4) {
//tickets platform technical to user katy
$usersToNotify = $entityManager->createQuery('SELECT distinct u'
. ' FROM App\Entity\User u'
. ' WHERE u.roles like :role_one')
->setParameter('role_one', '%ROLE_SUPPORT_KATY%')
->getResult();
} elseif ($case->getTipoTicket()->getId() == 5) {
//tickets bi to user katy
$usersToNotify = $entityManager->createQuery('SELECT distinct u'
. ' FROM App\Entity\User u'
. ' WHERE u.roles like :role_one')
->setParameter('role_one', '%ROLE_BI_MANAGER%')
->getResult();
} elseif ($case->getTipoTicket()->getId() == 6) {
//tickets platform management to user katy
$usersToNotify = $entityManager->createQuery('SELECT distinct u'
. ' FROM App\Entity\User u'
. ' WHERE u.roles like :role_one')
->setParameter('role_one', '%ROLE_SUPPORT_MANAGEMENT_KATY%')
->getResult();
} elseif ($ticket->getUser()->getVendor()) {
//tickets administratives
$usersToNotify = $entityManager->createQuery('SELECT distinct u'
. ' FROM App\Entity\User u'
. ' WHERE u.roles like :role_one')
->setParameter('role_one', '%ROLE_SUPPORT_ADMIN_KATY%')
->getResult();
} elseif ($ticket->getUser()->getWholesaler()) {
if ($case->getTipoTicket()->getId() == 3) { //commercial
$usersToNotify = $entityManager->createQuery('SELECT distinct u'
. ' FROM App\Entity\User u'
. ' WHERE u.wholesaler = :wholesaler'
. ' AND u.roles like :role_one')
->setParameter('wholesaler', $levelUp)
->setParameter('role_one', '%ROLE_COMMERCIAL_AGENT_NEW%')
->getResult();
} else { //administrative
$usersToNotify = $entityManager->createQuery('SELECT distinct u'
. ' FROM App\Entity\User u'
. ' WHERE u.wholesaler = :wholesaler'
. ' AND u.roles like :role_one')
->setParameter('wholesaler', $levelUp)
->setParameter('role_one', '%ROLE_MANAGE_SUPPORT_TICKETS_NEW%')
->getResult();
}
} elseif ($ticket->getUser()->getPartner()) {
if ($case->getTipoTicket()->getId() == 3) { //commercial
$comercialAgent = $userRepository->find($partner->getIdcommercialagent());
$master = $userRepository->getMaster($partner->getWholesaler());
if ($comercialAgent->getEmail() != $master[0]->getEmail()) {
$usersToNotify = array_merge($master, array($comercialAgent));
} else {
$usersToNotify = $master;
}
} else {
$usersToNotify = $entityManager->createQuery('SELECT distinct u'
. ' FROM App\Entity\User u'
. ' WHERE u.wholesaler = :wholesaler'
. ' AND u.roles like :role_one')
->setParameter('wholesaler', $levelUp)
->setParameter('role_one', '%ROLE_MANAGE_SUPPORT_TICKETS_NEW%')
->getResult();
}
} elseif ($ticket->getUser()->getCustomer()) {
$usersToNotify = $entityManager->createQuery('SELECT distinct u'
. ' FROM App\Entity\User u'
. ' WHERE u.partner = :partner'
. ' AND u.roles like :role_one')
->setParameter('partner', $levelUp)
->setParameter('role_one', '%ROLE_SUPPORT_NEW%')
->getResult();
}
}
return array(
'usersToNotify' => $usersToNotify,
'tipoTicket' => $tipoticket
);
}
private function getLastMessageToNotify($tmpLast)
{
$entityManager = $this->getDoctrine()->getManager();
if ($tmpLast->getLevel() == 0 && $tmpLast->getAutomatic()) {
$tmpCount = $entityManager->createQuery('SELECT tm'
. ' FROM App\Entity\Ticketmessage tm'
. ' WHERE tm.date = :date')
->setParameter('date', $tmpLast->getDate())
->getResult();
if (count($tmpCount) == 2) {
$lastMessage = $tmpCount[0]->getMessage();
} else {
$lastMessage = '';
}
} else {
$ticketRepository = $entityManager->getRepository(\App\Entity\Ticket::class);
//$lastMessage = $ticketRepository->getTicketmessages($tmpLast->getTicket())->last()->getMessage();
$lastMessage = array_values(array_slice($ticketRepository->getTicketmessages($tmpLast->getTicket()), -1))[0]->getMessage();
}
return $lastMessage;
}
private function uploadFile($path, $tm, $form, $translator)
{
$entityManager = $this->getDoctrine()->getManager();
$session = $this->get('session');
$extensionFileService = new ExtensionFileService($session, $translator);
$files = $form->get('filename')->getData();
$ticket = $tm->getTicket();
foreach ($files as $file) {
$sanitize = $extensionFileService->getSanitize('docx+pdf+img+excel+txt+ppt', $file->getClientOriginalName());
if ($sanitize) {
if ((strlen($file->getClientOriginalName()) > 100)) {
$session->getFlashBag()->add('danger', $translator->trans('app.ManageUsers&Profiles.Max100Characters'));
} elseif (($file->getSize() > 26214400)) {
$session->getFlashBag()->add('danger', $translator->trans('app.General.Guidelines.FileSize'));
} else {
$tmFile = new \App\Entity\Ticketmessagefile();
$tmFile->setOriginalfilename($file->getClientOriginalName());
$extension = $file->guessExtension();
if (!$extension)
$extension = 'bin';
$newName = $ticket->getId() . '_' . time() . '_' . rand(1, 999) . '.' . $extension;
$tmFile->setFilename($newName);
// Try to save file
$file->move($path, $newName);
$tmFile->setMessage($tm);
$entityManager->persist($tmFile);
$entityManager->flush();
}
}
}
}
private function getErrorMessages(\Symfony\Component\Form\Form $form)
{
$errors = array();
foreach ($form->getErrors() as $key => $error) {
if ($form->isRoot()) {
$errors['#'][] = $error->getMessage();
} else {
$errors[] = $error->getMessage();
}
}
foreach ($form->all() as $child) {
if (!$child->isValid()) {
$errors[$child->getName()] = $this->getErrorMessages($child);
}
}
return $errors;
}
/**
* Create a ticket message from post data
*
* @param type $post
* @param type $ticket
*/
protected function createTicketMessage($translator, $serviceNotification, $request, $form, $ticket = null, $case)
{
$data = array();
$tm = new \App\Entity\Ticketmessage();
$bescalado = false;
$idevento = null;
$lastMessage = '';
$session = $this->get('session');
$entityManager = $this->getDoctrine()->getManager();
$user = $this->getUser();
$path = $this->getParameter('private_folder') . 'ticket/';
$serverName = $this->getParameter('server_name');
$userRepository = $entityManager->getRepository(\App\Entity\User::class);
$selfUserLevel = $userRepository->getUserLevel($request, $user);
$ticketRepository = $entityManager->getRepository(\App\Entity\Ticket::class);
$supportcaseRepository = $entityManager->getRepository(\App\Entity\Supportcase::class);
//Si existe el ticket creará el mensaje para ese ticket
if ($ticket) {
if ($form->get('send')->isClicked() && $form->get('message')->getData() == '') {
$session->getFlashBag()->add('danger', $translator->trans('app.Support.System.EmptyMessage'));
if ($user == $ticket->getUser()) {
return $this->redirectToRoute('ticket_reply', array('id' => $case->getId()));
} else {
return $this->redirectToRoute('ticket_replyclient', array('id' => $case->getId()));
}
}
// SI HA ELEGIDO CERRAR EL TICKET
if ($form->get('close')->isClicked()) {
if ($ticket->getStatus() == 'CLOSED') {
$ticket->setMessagerate($form->get('ratingMessage')->getData());
$ticket->setRate($form->get('score')->getData() == '' ? 0 : $form->get('score')->getData());
$entityManager->persist($ticket);
$entityManager->flush();
return;
}
//SI EL CREADOR DEL CASO CIERRA EL TICKET
if ($user == $ticket->getUser() && $user == $ticket->getSupportcase()->getCreatedby()) {
$idevento = 74;
$ticket->setRate($form->get('score')->getData() == '' ? 0 : $form->get('score')->getData());
$ticket->setStatus('CLOSED');
$ticket->setCloseddate(new \DateTime);
$entityManager->persist($ticket);
$entityManager->flush();
$automMessage = new \App\Entity\Ticketmessage();
$automMessage->setUser($user);
$automMessage->setMessage($translator->trans('app.Support.System.TicketClosed'));
$automMessage->setAutomatic(1);
$automMessage->setLocale($request->getLocale());
$automMessage->setDate(new \DateTime);
$automMessage->setStatus('CLOSED_BY_CASE_OWNER');
$automMessage->setTicket($ticket);
} else {
//SI EL CREADOR DEL TICKET LO CIERRA
if ($user == $ticket->getUser()) {
$idevento = 74;
$ticket->setCloseddate(new \DateTime);
$ticket->setStatus('CLOSED');
$ticket->setRate($form->get('score')->getData() == '' ? 0 : $form->get('score')->getData());
$entityManager->persist($ticket);
$entityManager->flush();
$automMessage = new \App\Entity\Ticketmessage();
$automMessage->setUser($user);
$automMessage->setMessage($translator->trans('app.Support.System.TicketClosed'));
$automMessage->setAutomatic(1);
$automMessage->setLocale($request->getLocale());
$automMessage->setDate(new \DateTime);
$automMessage->setStatus('CLOSED_BY_TICKET_OWNER');
$automMessage->setTicket($ticket);
}
//SI EL USUARIO CON ROL PARA GESTIONAR ESA INCIDENCIA CIERRA EL TICKET
else {
$idevento = 75;
$ticket->setCloseddate(new \DateTime);
$ticket->setStatus('CLOSED');
$entityManager->persist($ticket);
$entityManager->flush();
$automMessage = new \App\Entity\Ticketmessage();
$automMessage->setUser($user);
$automMessage->setMessage($translator->trans('app.Support.System.TicketClosed'));
$automMessage->setAutomatic(1);
$automMessage->setLocale($request->getLocale());
$automMessage->setDate(new \DateTime);
$automMessage->setStatus('CLOSED_BY_SUPPORT');
$automMessage->setTicket($ticket);
}
}
}
//SI HA ELEGIDO REABRIR EL TICKET
elseif ($ticket->getStatus() == 'CLOSED') {
$idevento = 73;
$ticket->setStatus('PENDING');
$entityManager->persist($ticket);
$entityManager->flush();
$tm->setStatus('REOPENED');
$automMessage = new \App\Entity\Ticketmessage();
$automMessage->setUser($user);
$automMessage->setMessage($translator->trans('app.Support.System.TicketReopened'));
$automMessage->setAutomatic(1);
$automMessage->setLocale($request->getLocale());
$automMessage->setDate(new \DateTime);
$automMessage->setStatus('REOPENED');
$automMessage->setTicket($ticket);
$entityManager->persist($automMessage);
$entityManager->flush();
}
if ($form->get('message')->getData() != '') {
$tm->setUser($user);
$tm->setDate(new \DateTime);
$tm->setMessage($form->get('message')->getData());
$tm->setLocale($request->getLocale());
$tm->setTicket($ticket);
$tm->setLevel($selfUserLevel);
$entityManager->persist($tm);
$entityManager->flush();
}
if ($idevento == 75 || $idevento == 74 && $automMessage) {
$entityManager->persist($automMessage);
$entityManager->flush();
}
if ($form->get('ratingMessage')->getData() != '') {
$ticket->setMessagerate($form->get('ratingMessage')->getData());
$entityManager->persist($ticket);
$entityManager->flush();
}
if (!empty($form->get('filename')) && $form->get('filename')->getData() != null) {
$this->uploadFile($path, $tm, $form, $translator);
}
} else {
$idevento = 14;
$bescalado = true;
//Si el usuario escala el caso, crea un nuevo ticket con el mensaje escrito.
$ticket = new Ticket();
$ticket->setUser($user);
$ticket->setSupportcase($case);
$ticket->setCreationdate(new \DateTime);
$ticket->setLastmodification(new \DateTime);
$ticket->setLevel($selfUserLevel);
$entityManager->persist($ticket);
$entityManager->flush();
$tm->setUser($user);
$tm->setDate(new \DateTime);
$tm->setMessage($form->get('message')->getData());
$tm->setLocale($request->getLocale());
$tm->setTicket($ticket);
$tm->setLevel($selfUserLevel);
$entityManager->persist($tm);
$entityManager->flush();
//Si hay ficheros adjuntos
if (!empty($form->get('filename')) && $form->get('filename')->getData() != null) {
$this->uploadFile($path, $tm, $form, $translator);
}
//Notifificaciones
$ticketTecnico = $entityManager->createQuery('SELECT tt'
. ' FROM App\Entity\Tickettecnico tt'
. ' WHERE tt.supportcase = :id')
->setParameter('id', $case->getId())
->getOneOrNullResult();
$arrayusersandroles = $this->getUsersAndRolesToNotify($case, $ticket, $translator);
$ticketuser = $ticket->getUser();
$serverName = $this->getParameter('server_name');
if ($ticketuser->getCustomer()) {
$company = $userRepository->getCompany($ticketuser);
$customer = $userRepository->getCompany($company);
} else {
$customer = $userRepository->getCompany($ticketuser)->getName();
}
//datos para envio email
$data = [
'ticket' => $ticket,
'tickettecnico' => isset($ticketTecnico) ? $ticketTecnico : null,
'tipoticket' => $arrayusersandroles['tipoTicket'],
'ticketLink' => "ticket/default/replyclient/" . $case->getId(),
'customerLevel' => $selfUserLevel,
'ticketmessage' => $tm->getMessage(),
'user' => $user,
'messageLevel' => $selfUserLevel,
'route' => 'ticket_replyclient',
'idview' => $case->getId(),
];
$serviceNotification->Notify($idevento, $arrayusersandroles['usersToNotify'], $data);
}
//Notifica al que recibela incidencia que tiene una respuesta
//eventos 16 - nuevo mensaje y 73 - reabrir ticket
$tmessageUsers = $entityManager->createQuery('SELECT distinct u'
. ' FROM App\Entity\User u'
. ' JOIN App\Entity\Ticketmessage tm'
. ' WITH u.id = tm.user'
. ' WHERE tm.ticket = :ticket'
. ' AND tm.user != :user')
->setParameter('ticket', $ticket)
->setParameter('user', $user)
->getResult();
//$tmpLast = $ticketRepository->getTicketmessages($ticket)->last();
$tmpLast = array_values(array_slice($ticketRepository->getTicketmessages($ticket), -1))[0];
if ($idevento == 75) {
$tmessageUsers = array($ticket->getUser());
}
if (!empty($tmessageUsers)) {
foreach ($tmessageUsers as $tmessage_user) {
$usersNotyfy_reply = $tmessage_user;
$caseId = $ticket->getSupportCase()->getId();
$escalado = $entityManager->createQuery('SELECT count(t.id)'
. ' FROM App\Entity\Ticket t'
. ' WHERE t.supportcase = :supportcase'
. ' AND (t.level = :level'
. ' OR t.level = :level2)')
->setParameter('supportcase', $ticket->getSupportcase())
->setParameter('level', $userRepository->getUserLevel($request, $tmessage_user))
->setParameter('level2', $userRepository->getUserLevel($request, $tmessage_user) + 1)
->getSingleScalarResult();
$data = [
'ticket' => $ticket,
'ticketLink' => $user != $ticket->getUser() && $escalado < 2 ? 'ticket/default/reply/' . $caseId : 'ticket/default/replyclient/' . $caseId,
'customerLevel' => $userRepository->getUserLevel($request, $usersNotyfy_reply),
'ticketmessage' => $this->getLastMessageToNotify($tmpLast),
'user' => $user,
'messageLevel' => $selfUserLevel,
'companyName' => $userRepository->getCompanyName($ticket->getUser()),
'route' => $user != $ticket->getUser() && $escalado < 2 ? "ticket_reply" : "ticket_replyclient",
'idview' => $ticket->getSupportCase()->getId(),
];
$serviceNotification->Notify($idevento ? $idevento : 16, array($usersNotyfy_reply), $data);
}
}
//Si nadie le ha contestado la incidencia todavia, notificará a los usuarios on rol que pertoque
else {
if ($ticket && !$bescalado) {
$arrayusersandroles = $this->getUsersAndRolesToNotify($ticket->getSupportCase(), $ticket, $translator);
$ticketTecnico = $entityManager->createQuery('SELECT tt'
. ' FROM App\Entity\Tickettecnico tt'
. ' WHERE tt.supportcase = :id')
->setParameter('id', $case->getId())
->getOneOrNullResult();
$escalado = $entityManager->createQuery('SELECT count(t.id)'
. ' FROM App\Entity\Ticket t'
. ' WHERE t.supportcase = :supportcase')
->setParameter('supportcase', $ticket->getSupportcase())
->getOneOrNullResult();
$usersToNotify = $arrayusersandroles['usersToNotify'];
//$tmpLast = $ticketRepository->getTicketmessages($ticket)->last();
$tmpLast = array_values(array_slice($ticketRepository->getTicketmessages($ticket), -1))[0];
$ticketuser = $ticket->getUser();
$serverName = $this->getParameter('server_name');
//datos para envio email
$data = [
'ticket' => $ticket,
'ticketLink' => $user != $ticket->getUser() && $escalado < 2 ? 'ticket/default/reply/' . $ticket->getSupportCase()->getId() : 'ticket/default/replyclient/' . $ticket->getSupportCase()->getId(),
'customer' => $usersToNotify,
'customerLevel' => '',
'ticketmessage' => $this->getLastMessageToNotify($tmpLast),
'user' => $user,
'messageLevel' => $selfUserLevel,
'companyName' => $userRepository->getCompanyName($ticket->getUser()),
'route' => $user != $ticket->getUser() && $escalado < 2 ? "ticket_reply" : "ticket_replyclient",
'idview' => $ticket->getSupportCase()->getId(),
];
$myticketTecnico = $entityManager->createQuery('SELECT tt'
. ' FROM App\Entity\Tickettecnico tt'
. ' WHERE tt.supportcase = :supportcase')
->setParameter('supportcase', $case)
->getOneOrNullResult();
if ($myticketTecnico && $myticketTecnico->getProductline() && $myticketTecnico->getProductline()->getVendor()->getisminivendor()) {
$vendor = $myticketTecnico->getProductline()->getVendor();
$usersToNotify = $entityManager->createQuery('SELECT distinct u'
. ' FROM App\Entity\User u'
. ' WHERE u.vendor = :vendor'
. ' AND u.roles like :role_one')
->setParameter('vendor', $vendor)
->setParameter('role_one', '%ROLE_SUPPORT_VENDOR%')
->getResult();
}
//if ($idevento) {
$serviceNotification->Notify($idevento ? $idevento : 16, $usersToNotify, $data);
//}
}
}
return;
}
protected function getFiles($id)
{
$entityManager = $this->getDoctrine()->getManager();
$files = $entityManager->createQuery('SELECT tmf'
. ' FROM App\Entity\Ticketmessagefile tmf'
. ' JOIN tmf.message tm'
. ' WHERE tmf.deletedby is null'
. ' AND tm.ticket = :ticket')
->setParameter('ticket', $id)
->getResult();
return $files;
}
/**
* @Route("/ticket/default/newticketajax", name="new_ticket_ajax")
*/
public function newTicketAjax(Request $request, TranslatorInterface $translator, ServiceNotification $serviceNotification)
{
$success = $this->createNewSupportCase($request, $_POST, $translator, $serviceNotification);
return new JsonResponse();
}
private function createNewSupportCase($request, $data, TranslatorInterface $translator, ServiceNotification $serviceNotification, $form = null)
{
$user = $this->getUser();
$entityManager = $this->getDoctrine()->getManager();
$userRepository = $this->getDoctrine()->getRepository(User::class);
$userwholesaler = $userRepository->getParentWholesaler($user);
$countryCode = $userwholesaler ? $userwholesaler->getCountry()->getAlpha2Code() : '';
$wholesalerid = $userwholesaler ? $userwholesaler->getId() : '';
$codenumber = $countryCode . $wholesalerid . date('y') . date('m') . date('d');
$path = $this->getParameter('private_folder') . 'ticket/';
$locale = $request->getLocale();
$ticketTecnico = new \App\Entity\Tickettecnico;
$case = new Supportcase();
$ticket = new Ticket();
$tipoTicket = $this->getDoctrine()->getRepository(Tipoticket::class)->find($data['tipoincidencia']);
// Crear un nuevo caso con los datos de la incidencia
$case->setSubject($data['subject']);
$case->setTipoTicket($tipoTicket);
$case->setCreatedBy($user);
$case->setCreationdate(new \DateTime);
$entityManager->persist($case);
$entityManager->flush();
// Crear nuevo ticket al caso creado anteriormente
$ticket->setSupportcase($case);
$ticket->setUser($user);
$ticket->setLevel($userRepository->getUserLevel($request, $user));
$ticket->setCreationdate(new \DateTime);
$ticket->setLastmodification(new \DateTime);
$ticket->setStatus('PENDING');
$entityManager->persist($ticket);
$entityManager->flush();
$requestLicense = $user->getPartner() ? 'licensesByclient' : 'lista';
if (isset($data['idproductline'])) {
$idproductline = $data['idproductline'];
} elseif ($data[$requestLicense]) {
$licencia = $entityManager->createQuery('SELECT l'
. ' FROM App\Entity\License l'
. ' WHERE l.id = :id')
->setParameter('id', $data[$requestLicense])
->getOneOrNullResult();
$idproductline = $licencia->getProduct()->getProductline()->getId();
}
// 2- Crear tipo de ticket
switch ($data['tipoincidencia']) {
case 1:
//Técnico
$tipoticket = ($translator->trans('app.Support.DropDownTechnical'));
$ticket_productline = null;
if (isset($idproductline)) {
$ticket_productline = $entityManager->createQuery('SELECT pl'
. ' FROM App\Entity\Productline pl'
. ' WHERE pl.id = :id')
->setParameter('id', $idproductline)
->getOneOrNullResult();
}
$ticketTecnico->setProductline($ticket_productline);
$licencia = null;
if ($form->get($requestLicense)->getData()) {
$licencia = $entityManager->createQuery('SELECT l'
. ' FROM App\Entity\License l'
. ' WHERE l.id = :id')
->setParameter('id', $form->get($requestLicense)->getData())
->getOneOrNullResult();
}
$ticketTecnico->setLicense($licencia);
$supportCase = $entityManager->createQuery('SELECT sc'
. ' FROM App\Entity\Supportcase sc'
. ' WHERE sc.id = :id')
->setParameter('id', $ticket->getSupportCase()->getId())
->getOneOrNullResult();
if ($user->getPartner()) {
// Por si la lista de clientes / licencnias está vacia
if (isset($form['lista']) && $form['lista']->getData()) {
$customer = $this->getDoctrine()->getRepository(\App\Entity\Customer::class)->find($form['lista']->getData());
$ticketTecnico->setCustomer($customer);
}
}
if ($user->getCustomer()) {
$ticketTecnico->setCustomer($user->getCustomer());
}
$ticketTecnico->setSupportCase($supportCase);
$entityManager->persist($ticketTecnico);
$entityManager->flush();
break;
case 2:
//Administración
$tipoticket = ($translator->trans('app.Support.DropDownAdministration'));
break;
case 3:
//Comercial
$productRepository = $entityManager->getRepository(Product::class);
$product = isset($data['product']) ? $productRepository->find($data['product']) : null;
$ticketComercial = new TicketComercial();
$ticketComercial->setSupportCase($case);
if (!is_null($product)) {
$ticketComercial->setProductline($product->getProductline());
$ticketComercial->setProduct($product);
}
$entityManager->persist($ticketComercial);
$entityManager->flush();
$tipoticket = ($translator->trans('app.Support.DropDownCommercial'));
break;
case 4:
//Plataforma
$tipoticket = ($translator->trans('app.Support.DropDownPlatform'));
break;
}
// 3- creo el mensaje del ticket
$tm = new \App\Entity\Ticketmessage;
$tm->setUser($user);
$tm->setDate(new \DateTime);
$tm->setMessage($data['message']);
$tm->setLocale($locale);
$tm->setStatus($ticket->getStatus());
$tm->setLevel($ticket->getLevel());
$tm->setTicket($ticket);
$entityManager->persist($tm);
$entityManager->flush();
//Si hay ficheros adjuntos
if (!is_null($form)) {
if (!empty($form->get('filename')) && $form->get('filename')->getData() != null) {
$this->uploadFile($path, $tm, $form, $translator);
}
}
$entityManager->persist($tm);
$entityManager->flush();
// Send email to support manager.
if ($ticket->getUser()->getWholesaler() && $ticketTecnico->getProductline()) {
$usersToNotify = $entityManager->createQuery('SELECT distinct u'
. ' FROM App\Entity\User u'
. ' WHERE u.vendor = :vendor'
. ' AND u.roles like :role_one'
. ' OR u.roles like :role2)')
->setParameter('vendor', $ticketTecnico->getProductline()->getVendor())
->setParameter('role_one', '%ROLE_SUPPORT_VENDOR%')
->setParameter('role2', '%ROLE_ADMIN_USER_VENDOR%')
->getResult();
} else {
$levelUp = $userRepository->getLevelUpCompany($ticket->getUser());
$partner = $ticket->getUser()->getPartner();
if ($case->getTipoTicket()->getId() == 4) {
//tickets platform technical to user katy
$usersToNotify = $entityManager->createQuery('SELECT distinct u'
. ' FROM App\Entity\User u'
. ' WHERE u.roles like :role_one')
->setParameter('role_one', '%ROLE_SUPPORT_KATY%')
->getResult();
} elseif ($case->getTipoTicket()->getId() == 5) {
//tickets bi to user katy
$usersToNotify = $entityManager->createQuery('SELECT distinct u'
. ' FROM App\Entity\User u'
. ' WHERE u.roles like :role_one')
->setParameter('role_one', '%ROLE_BI_MANAGER%')
->getResult();
} elseif ($case->getTipoTicket()->getId() == 6) {
//tickets platform management to user katy
$usersToNotify = $entityManager->createQuery('SELECT distinct u'
. ' FROM App\Entity\User u'
. ' WHERE u.roles like :role_one')
->setParameter('role_one', '%ROLE_SUPPORT_MANAGEMENT_KATY%')
->getResult();
} elseif ($ticket->getUser()->getVendor()) {
//tickets administratives
$usersToNotify = $entityManager->createQuery('SELECT distinct u'
. ' FROM App\Entity\User u'
. ' WHERE u.roles like :role_one')
->setParameter('role_one', '%ROLE_SUPPORT_ADMIN_KATY%')
->getResult();
} elseif ($ticket->getUser()->getWholesaler()) {
if ($case->getTipoTicket()->getId() == 3) { //commercial
$usersToNotify = $entityManager->createQuery('SELECT distinct u'
. ' FROM App\Entity\User u'
. ' WHERE u.wholesaler = :wholesaler'
. ' AND u.roles like :role_one'
. ' OR u.roles like :role2)')
->setParameter('wholesaler', $levelUp)
->setParameter('role_one', '%ROLE_COMMERCIAL_AGENT_NEW%')
->setParameter('role2', '%ROLE_ADMIN_USER_NEW%')
->getResult();
} else { //administrative
$usersToNotify = $entityManager->createQuery('SELECT distinct u'
. ' FROM App\Entity\User u'
. ' WHERE u.wholesaler = :wholesaler'
. ' AND u.roles like :role_one'
. ' OR u.roles like :role2)')
->setParameter('wholesaler', $levelUp)
->setParameter('role_one', '%ROLE_MANAGE_SUPPORT_TICKETS_NEW%')
->setParameter('role2', '%ROLE_ADMIN_USER_NEW%')
->getResult();
}
} elseif ($ticket->getUser()->getPartner()) {
if ($case->getTipoTicket()->getId() == 3) { //commercial
$comercialAgent = $userRepository->find($partner->getIdcommercialagent());
$master = $userRepository->getMaster($partner->getWholesaler());
if ($comercialAgent->getEmail() != $master[0]->getEmail()) {
$usersToNotify = array_merge($master, array($comercialAgent));
} else {
$usersToNotify = $master;
}
} else {
$usersToNotify = $entityManager->createQuery('SELECT distinct u'
. ' FROM App\Entity\User u'
. ' WHERE u.wholesaler = :wholesaler'
. ' AND (u.roles like :role_one'
. ' OR u.roles like :role2)')
->setParameter('wholesaler', $levelUp)
->setParameter('role_one', '%ROLE_MANAGE_SUPPORT_TICKETS_NEW%')
->setParameter('role2', '%ROLE_ADMIN_USER_NEW%')
->getResult();
}
} elseif ($ticket->getUser()->getCustomer()) {
$usersToNotify = $entityManager->createQuery('SELECT distinct u'
. ' FROM App\Entity\User u'
. ' WHERE u.partner = :partner'
. ' AND (u.roles like :role_one'
. ' OR u.roles like :role2)')
->setParameter('partner', $levelUp)
->setParameter('role_one', '%ROLE_SUPPORT_NEW%')
->setParameter('role2', '%ROLE_ADMIN_USER_NEW_PARTNER%')
->getResult();
}
}
$data = array();
$ticketuser = $ticket->getUser();
$serverName = $this->getParameter('server_name');
//datos para envio email
$data = [
'ticket' => $ticket,
'customerLevel' => $userRepository->getUserLevel($request, $user),
'ticketmessage' => $tm->getMessage(),
'user' => $user,
'messageLevel' => $userRepository->getUserLevel($request, $user),
'route' => 'ticket_replyclient',
'idview' => $case->getId(),
];
$existsticketTecnico = $entityManager->createQuery('SELECT tt'
. ' FROM App\Entity\Tickettecnico tt'
. ' WHERE tt.supportcase = :supportcase')
->setParameter('supportcase', $case)
->getOneOrNullResult();
if ($existsticketTecnico && $existsticketTecnico->getProductline() && $existsticketTecnico->getProductline()->getVendor()->getisMiniVendor()) {
$vendor = $existsticketTecnico->getProductline()->getVendor();
$usersToNotify = $entityManager->createQuery('SELECT distinct u'
. ' FROM App\Entity\User u'
. ' WHERE u.vendor = :vendor'
. ' AND (u.roles like :role_one'
. ' OR u.roles like :role2)')
->setParameter('role_one', '%ROLE_SUPPORT_VENDOR%')
->setParameter('role2', '%ROLE_ADMIN_USER_VENDOR%')
->setParameter('vendor', $vendor)
->getResult();
}
$serviceNotification->Notify(14, $usersToNotify, $data);
return true;
}
}