<?php
namespace App\Controller;
use App\Entity\Category;
use App\Entity\Comment;
use App\Entity\Contact;
use App\Entity\Customer;
use App\Entity\Status;
use App\Entity\Ticket;
use App\Entity\TypeTicket;
use App\Entity\Urgency;
use App\Entity\User;
use App\Form\TicketType;
use App\Services\Calculate;
use Symfony\Bundle\FrameworkBundle\Controller\AbstractController;
use Symfony\Component\Form\Extension\Core\Type\DateType;
use Symfony\Component\Form\Extension\Core\Type\TimeType;
use Symfony\Component\HttpFoundation\JsonResponse;
use Symfony\Component\HttpFoundation\Request;
use Symfony\Component\HttpFoundation\Response;
use Symfony\Component\Routing\Annotation\Route;
use Symfony\Component\Mailer\MailerInterface;
use Symfony\Component\Mime\Email;
use Symfony\Component\Routing\Generator\UrlGeneratorInterface;
class TicketController extends AbstractController
{
#[Route('/tickets', name: 'app_list_ticket', options: ["expose" => true])]
public function index(): Response
{
$em = $this->getDoctrine()->getManager();
$listTickets = $em->getRepository(Ticket::class)->getListTickets()->getQuery()->getResult();
$listStatus = $em->getRepository(Status::class)->getListStatus()->getQuery()->getArrayResult();
return $this->render('ticket/index.html.twig', [
"listTickets" => $listTickets,
"listStatus" => $listStatus
]);
}
#[Route('/tickets/ajouter', name: 'app_add_ticket', options: ["expose" => true])]
public function add(Request $request, Calculate $calculate, MailerInterface $mailer): Response
{
$em = $this->getDoctrine()->getManager();
$ticket = new Ticket();
$ticket->setCreator($this->getUser());
$ticket->setUrgency($em->getRepository(Urgency::class)->find(1)); // NORMAL
$ticket->setStatus($em->getRepository(Status::class)->find(4)); // EN ATTENTE / IN PROGRESS
if(isset($_GET['id'])){
$customer = $em->getRepository(Customer::class)->find($_GET['id']);
$ticket->setCustomer($customer);
}
$form = $this->createForm(TicketType::class, $ticket);
if ($request->isMethod('POST')
&& $form->handleRequest($request)->isValid()) {
$ticket = $form->getData();
$ticket->setTime($calculate->transformTimerToTimeFunction($ticket->getTimer()->format('H:i:s')));
$ticket->setTimeRecipient($calculate->transformTimerToTimeFunction($ticket->getTimerRecipient()->format('H:i:s')));
$em->persist($ticket);
$em->flush();
$request->getSession()->getFlashBag()->add('success', 'Le ticket a été ajouté avec succès.');
$this->sendTicketCreatedEmail($this->getUser(), $ticket, $mailer, 'Création du ticket', "Un nouveau ticket a été créé.");
return $this->redirectToRoute('app_list_ticket');
}
return $this->render('ticket/add.html.twig', [
"form" => $form->createView(),
"idCustomer" => $_GET['id'] ?? 0
]);
}
#[Route('/tickets/{id}/modifier', name: 'app_edit_ticket')]
public function edit(Request $request, Ticket $ticket, Calculate $calculate, MailerInterface $mailer): Response
{
$em = $this->getDoctrine()->getManager();
$form = $this->createForm(TicketType::class, $ticket);
// ADD INFORMATION EDITION
$form->add('updatedAtTimeRecipient', DateType::class, array(
'label' => 'Date de mise à jour du temps',
'widget' => 'single_text',
'required' => false,
))->add('timerRecipient', TimeType::class, array(
'label' => 'Temps (H:m:s)',
'attr' => array(
'class' => 'timer-call',
'step' => 1,
),
'widget' => 'single_text',
'with_seconds' => true,
'required' => false,
));
if ($request->isMethod('POST')
&& $form->handleRequest($request)->isValid()) {
$ticket = $form->getData();
$ticket->setTime($calculate->transformTimerToTimeFunction($ticket->getTimer()->format('H:i:s')));
$ticket->setTimeRecipient($calculate->transformTimerToTimeFunction($ticket->getTimerRecipient()->format('H:i:s')));
$em->flush();
$request->getSession()->getFlashBag()->add('success', 'Le ticket a été modifié avec succès.');
$this->sendTicketCreatedEmail($this->getUser(), $ticket, $mailer, 'Modification du ticket', "Un ticket a été modifié.");
return $this->redirectToRoute('app_list_ticket');
}
return $this->render('ticket/edit.html.twig', [
"form" => $form->createView(),
"ticket" => $ticket
]);
}
#[Route('/tickets/{id}/informations', name: 'app_view_ticket', options: ["expose" => true])]
public function view(Ticket $ticket): Response
{
$em = $this->getDoctrine()->getManager();
$listComments = $em->getRepository(Comment::class)->findBy(
array(
"ticket" => $ticket
),
array(
"id" => "DESC"
)
);
$response = new JsonResponse ();
return $response->setData($this->render('ticket/view.html.twig', array(
"ticket" => $ticket,
"listComments" => $listComments
))->getContent());
}
#[Route('/tickets/ajax', name: 'app_list_ajax_ticket', options: ["expose" => true])]
public function listAjax(): Response
{
$em = $this->getDoctrine()->getManager();
switch ($_POST['type']){
/* case 'status3': // EN COURS
$listTickets = $em->getRepository(Ticket::class)->getListTicketsByRecipientAndStatus($this->getUser()->getId(), [3])->getQuery()->getResult();
break;
case 'status4': // ATTENTE
$listTickets = $em->getRepository(Ticket::class)->getListTicketsByRecipientAndStatus($this->getUser()->getId(), [4])->getQuery()->getResult();
break;*/
case 'ticketOpened':
$listTickets = $em->getRepository(Ticket::class)->findOpened([3,4])->getQuery()->getArrayResult();
break;
case 'ticketForMe':
$listTickets = $em->getRepository(Ticket::class)->findByMe($this->getUser()->getId(), [3,4])->getQuery()->getArrayResult();
break;
case 'ticketForGroup':
$listTickets = $em->getRepository(Ticket::class)->findByGroup($this->getUser()->getCategory()->getId(), [3,4])->getQuery()->getArrayResult();
break;
case 'ticketOfCustomer':
$listTickets = $em->getRepository(Ticket::class)->getListTicketsByCustomer($_POST['idCustomer'])->getQuery()->getResult();
break;
case 'allTickets':
$listTickets = $em->getRepository(Ticket::class)->getListTickets()->getQuery()->getResult();
break;
}
$response = new JsonResponse ();
return $response->setData($this->render('ticket/ajaxTable.html.twig', array(
"listTickets" => $listTickets,
"fullTable" => $_POST['fullTable'] ?? "true"
))->getContent());
}
#[Route('/tickets/data/mode-call/ajax', name: 'app_mode_call_data_list_ajax', options: ["expose" => true])]
public function listDatasAjax(): JsonResponse
{
$em = $this->getDoctrine()->getManager();
$listCustomers = $em->getRepository(Customer::class)->getListCustomers()->getQuery()->getArrayResult();
$listUsers = $em->getRepository(User::class)->getListUsers()->getQuery()->getArrayResult();
$listCategories = $em->getRepository(Category::class)->getListCategories()->getQuery()->getArrayResult();
$listTypesTicket = $em->getRepository(TypeTicket::class)-> getListTypesTicket()->getQuery()->getArrayResult();
$response = new JsonResponse ();
return $response->setData(
array(
"customers" => $listCustomers,
"users" => $listUsers,
"categories" => $listCategories,
"typesTicket" => $listTypesTicket
)
);
}
#[Route('/tickets/ajouter/ajax', name: 'app_add_ticket_ajax', options: ["expose" => true])]
public function addAjax(Request $request, Calculate $calculate, MailerInterface $mailer): Response
{
$em = $this->getDoctrine()->getManager();
$ticket = new Ticket();
$ticket->setCreator($this->getUser());
$ticket->setUrgency($em->getRepository(Urgency::class)->find(1)); // NORMAL
$ticket->setStatus($em->getRepository(Status::class)->find(4)); // EN ATTENTE / IN PROGRESS
$ticket->setTimer(new \DateTime($_POST['timer']));
$ticket->setTime($calculate->transformTimerToTimeFunction($ticket->getTimer()->format('H:i:s')));
$ticket->setCustomer($em->getRepository(Customer::class)->find($_POST['idCustomer']));
$ticket->setContact($em->getRepository(Contact::class)->find($_POST['idContact']));
$ticket->setRecipient($em->getRepository(User::class)->find($_POST['idRecipient']));
$ticket->setCategory($em->getRepository(Category::class)->find($_POST['idCategory']));
foreach ($_POST['idsTypesTicket'] as $idType) {
$ticket->addTypesTicket($em->getRepository(TypeTicket::class)->find($idType));
}
$ticket->setObject($_POST['object']);
$em->persist($ticket);
$em->flush();
$request->getSession()->getFlashBag()->add('success', 'Le ticket a été ajouté avec succès.');
$this->sendTicketCreatedEmail($this->getUser(), $ticket, $mailer, 'Création du ticket', "Un nouveau ticket a été créé.");
$response = new JsonResponse ();
return $response->setData('true');
}
#[Route('/tickets/archive/{id}', name: 'app_archive_ticket_ajax', options: ["expose" => true])]
public function archive(Ticket $ticket): Response
{
$em = $this->getDoctrine()->getManager();
$ticket->setArchived(1);
$ticket->setNumFacture($_POST['numArchive']);
$em->flush();
$response = new JsonResponse ();
return $response->setData('true');
}
#[Route('/tickets/unarchive/{id}', name: 'app_unarchive_ticket_ajax', options: ["expose" => true])]
public function unarchive(Ticket $ticket): Response
{
$em = $this->getDoctrine()->getManager();
$ticket->setArchived(0);
$ticket->setNumFacture('');
$em->flush();
$response = new JsonResponse ();
return $response->setData('true');
}
private function sendTicketCreatedEmail(User $user, Ticket $ticket, MailerInterface $mailer, string $subject, string $text): void
{
if($_ENV['APP_MAIL'] === 'false') return;
if (in_array('ROLE_CUSTOMER', $user->getRoles())) {
$email = (new Email())
->from($_ENV['APP_MAIL_FROM'])
->to($_ENV['APP_MAIL_TO'])
->subject($subject . ' #' . $ticket->getId())
->text(
$text . "\n" .
($ticket->getObject() ? "Objet : " . $ticket->getObject() : '') . "\n" .
"Créé par : " . $user->getUsername() . "\n" .
"Lien : " . $this->generateUrl('app_view_ticket', ['id' => $ticket->getId()], UrlGeneratorInterface::ABSOLUTE_URL)
);
$mailer->send($email);
}
}
/* #[Route('/tickets/regeneration', name: 'app_list_regenerate_ticket')]
public function regenerate(Calculate $calculate): Response
{
$em = $this->getDoctrine()->getManager();
$listTickets = $em->getRepository(Ticket::class)->findBy(array());
foreach ($listTickets as $ticket){
}
$em->flush();
$response = new JsonResponse ();
return $response->setData('true');
}*/
}