src/Controller/PortalController.php line 64

Open in your IDE?
  1. <?php
  2. namespace App\Controller;
  3. use Symfony\Bundle\FrameworkBundle\Controller\AbstractController;
  4. use Symfony\Component\HttpFoundation\Response;
  5. use Symfony\Component\Routing\Annotation\Route;
  6. use App\Form\TicketPortalFormType;
  7. use App\Form\ReplysFormType;
  8. use App\Entity\Tickets;
  9. use App\Entity\Accounts;
  10. use App\Entity\Replys;
  11. use App\Entity\Emails;
  12. use App\Repository\ReplysRepository;
  13. use App\Repository\EntitiesRepository;
  14. use App\Repository\UsersRepository;
  15. use App\Repository\TicketsRepository;
  16. use App\Repository\AccountsAreaRepository;
  17. use App\Repository\DepartmentsRepository;
  18. use App\Repository\CategoriesRepository;
  19. use App\Repository\StatusRepository;
  20. use App\Repository\PrioritiesRepository;
  21. use App\Repository\AccountsTypeRepository;
  22. use Symfony\Component\HttpFoundation\Request;
  23. use Doctrine\ORM\EntityManagerInterface;
  24. use Symfony\Component\Mailer\MailerInterface;
  25. use Symfony\Component\Mime\Email;
  26. use Symfony\Component\HttpFoundation\RedirectResponse;
  27. use Symfony\Component\Routing\Generator\UrlGeneratorInterface;
  28. use PHPMailer\PHPMailer\PHPMailer;
  29. use PHPMailer\PHPMailer\Exception as MailException;
  30. class PortalController extends AbstractController
  31. {
  32.     private $em;
  33.     private $ticketsRepository;
  34.     private $entitiesRepository;
  35.     private $usersRepository;
  36.     private $areaRepository;
  37.     private $typeRepository;
  38.     private $departmentsRepository;
  39.     private $statusRepository;
  40.     private $prioritiesRepository;
  41.     private $categoriesRepository;
  42.     private $replysRepository;
  43.     public function __construct(EntityManagerInterface $emReplysRepository $replysRepositoryPrioritiesRepository $prioritiesRepositoryCategoriesRepository $categoriesRepositoryStatusRepository $statusRepositoryDepartmentsRepository $departmentsRepositoryTicketsRepository $ticketsRepositoryEntitiesRepository $entitiesRepositoryUsersRepository $usersRepositoryAccountsTypeRepository $typeRepositoryAccountsAreaRepository $areaRepository)
  44.     {
  45.         $this->em $em;
  46.         $this->ticketsRepository $ticketsRepository;
  47.         $this->entitiesRepository $entitiesRepository;
  48.         $this->usersRepository $usersRepository;
  49.         $this->areaRepository $areaRepository;
  50.         $this->typeRepository $typeRepository;
  51.         $this->departmentsRepository $departmentsRepository;
  52.         $this->statusRepository $statusRepository;
  53.         $this->prioritiesRepository $prioritiesRepository;
  54.         $this->categoriesRepository $categoriesRepository;
  55.         $this->replysRepository $replysRepository;
  56.     }
  57.     #[Route('/'name'app_home')]
  58.     public function index(): Response
  59.     {
  60.         return $this->render('portal/home.html.twig', [
  61.         ]);
  62.     }
  63.     #[Route('/portal'name'app_portal')]
  64.     public function portal(Request $request): Response
  65.     {
  66.         $newTicket = new Tickets();
  67.         $newAccount = new Accounts();
  68.         $newEmail = new Emails();
  69.         $form $this->createForm(TicketPortalFormType::class, $newTicket);
  70.         $message $request->query->get('message') ?? "";
  71.         $form->handleRequest($request);
  72.         if ($form->isSubmitted() && $form->isValid()) {
  73.             $entityselected $this->entitiesRepository->find(1);
  74.             $userdefault $this->usersRepository->find(1);
  75.             $typedefault $this->typeRepository->find(1);
  76.             $areadefault $this->areaRepository->find(5);
  77.             $departmentdefault $this->departmentsRepository->find(4);
  78.             $statusdefault $this->statusRepository->find(1);
  79.             $prioritiesdefault $this->prioritiesRepository->find(2);
  80.             $categoriesdefault $this->categoriesRepository->find(1);
  81.             $now = new \DateTimeImmutable();
  82.             $newAccount->setUser($userdefault);
  83.             $newAccount->setName($_POST['email']);
  84.             $newAccount->setUpdatedAt($now);
  85.             $newAccount->setCreatedAt($now);
  86.             $newAccount->setCreatedBy($userdefault);
  87.             $newAccount->setUpdateBy($userdefault);
  88.             $newAccount->setDescription("Portal");
  89.             $newAccount->setType($typedefault);
  90.             $newAccount->setArea($areadefault);
  91.             $this->em->persist($newAccount);
  92.             $this->em->flush();
  93.             $newEmail->setEmail($_POST['email']);
  94.             $newEmail->setIdInRelation($newAccount->getId());
  95.             $newEmail->setEntity($entityselected);
  96.             $this->em->persist($newEmail);
  97.             $this->em->flush();
  98.             $newTicket $form->getData();
  99.             $newTicket->setUser($userdefault);
  100.             $newTicket->setUpdatedAt($now);
  101.             $newTicket->setCreatedAt($now);
  102.             $newTicket->setCreatedBy($userdefault);
  103.             $newTicket->setUpdateBy($userdefault);
  104.             $newTicket->setDeleted(0);
  105.             $newTicket->setActive(0);
  106.             $newTicket->setDepartments($departmentdefault);
  107.             $newTicket->setStatus($statusdefault);
  108.             $newTicket->setPriorities($prioritiesdefault);
  109.             $newTicket->setCategories($categoriesdefault);
  110.             $newTicket->setAccount($newAccount);
  111.             $token substr(md5(openssl_random_pseudo_bytes(20)), -10);
  112.             $newTicket->setToken($token);
  113.             $this->em->persist($newTicket);
  114.             $this->em->flush();
  115.             try {
  116.                 $mail = new PHPMailer(true);
  117.                 $mail->CharSet 'UTF-8';
  118.                 $mail->isSMTP();
  119.                 $mail->Host 'sosconsultoria.pt';
  120.                 $mail->SMTPAuth true;
  121.                 $mail->Username 'suporte@sosconsultoria.pt';
  122.                 $mail->Password $_SERVER['MAILER_PASSWORD'];
  123.                 $mail->SMTPSecure 'ssl';
  124.                 $mail->Port 465;
  125.                 $mail->setFrom('suporte@sosconsultoria.pt''SOS Consultoria');
  126.                 $mail->addAddress($_POST['email']);
  127.                 $mail->addReplyTo('suporte@sosconsultoria.pt''SOS Consultoria');
  128.                 $mail->isHTML(true);
  129.                 $mail->Subject 'Tickets Central';
  130.                 $mail->Body '<table style="font-family: Helvetica, Arial, sans-serif; font-size: 14px;">'
  131.                     '<tr><td><strong>Tickets Central</strong></td></tr>'
  132.                     '<tr><td>Por favor confirme o seu e-mail clicando no link abaixo:</td></tr>'
  133.                     '<tr><td><a href="https://helpdesk.sosadvanced.pt/portalconfirm/' $token '/' $newTicket->getId() . '" style="color: #608E34; font-weight: bold;">Confirmar Email</a></td></tr>'
  134.                     '<tr><td>— <b>Tickets</b> - Admin Dashboard</td></tr>'
  135.                     '</table>';
  136.                 $mail->send();
  137.                 $message "Email has been sent, please check your inbox.";
  138.             } catch (MailException $e) {
  139.                 return new Response('Erro ao enviar e-mail: ' $mail->ErrorInfo);
  140.             }
  141.             return $this->redirectToRoute('app_portal', ['message' => $message]);
  142.         }
  143.         return $this->render('portal/index.html.twig', [
  144.             'form' => $form->createView(),
  145.             'message' => $message
  146.         ]);
  147.     }
  148.     #[Route('/portalconfirm/{token}/{ticketid}'name'app_portal_confirm')]
  149.     public function portalconfirm($token$ticketid): Response
  150.     {
  151.         $tickets $this->ticketsRepository->find($ticketid);
  152.         $tickets->setActive(1);
  153.         $this->em->persist($tickets);
  154.         $this->em->flush();
  155.         $emailtosend $tickets->getAccount()->getName();
  156.         try {
  157.             $mail = new PHPMailer(true);
  158.             $mail->CharSet 'UTF-8';
  159.             $mail->isSMTP();
  160.             $mail->Host 'sosconsultoria.pt';
  161.             $mail->SMTPAuth true;
  162.             $mail->Username 'suporte@sosconsultoria.pt';
  163.             $mail->Password $_SERVER['MAILER_PASSWORD'];
  164.             $mail->SMTPSecure 'ssl';
  165.             $mail->Port 465;
  166.             $mail->setFrom('suporte@sosconsultoria.pt''SOS Consultoria');
  167.             $mail->addAddress($emailtosend);
  168.             $mail->addReplyTo('suporte@sosconsultoria.pt''SOS Consultoria');
  169.             $mail->isHTML(true);
  170.             $mail->Subject 'Tickets Central';
  171.             $mail->Body '<table style="font-family: Helvetica, Arial, sans-serif; font-size: 14px;">'
  172.                 '<tr><td><strong>Tickets Central</strong></td></tr>'
  173.                 '<tr><td>Email confirmado, o seu ticket será iniciado em breve. Pode acompanhar o progresso clicando no link abaixo:</td></tr>'
  174.                 '<tr><td><a href="https://helpdesk.sosadvanced.pt/portalticket/' $token '" style="color: #608E34; font-weight: bold;">Abrir Ticket</a></td></tr>'
  175.                 '<tr><td>— <b>Tickets</b> - Admin Dashboard</td></tr>'
  176.                 '</table>';
  177.             $mail->send();
  178.         } catch (MailException $e) {
  179.             return new Response('Erro ao enviar e-mail: ' $mail->ErrorInfo);
  180.         }
  181.         return $this->redirectToRoute('app_ticket_confirmed', [
  182.             'token' => $token
  183.         ]);
  184.     }
  185.     #[Route('/ticket-created/{token}'name'app_ticket_confirmed')]
  186.     public function ticketcreated($token): Response
  187.     {
  188.         return $this->render('portal/confirmedemail.html.twig', [
  189.             'token' => $token
  190.         ]);
  191.     }
  192.     #[Route('/portalticket/{token}'name'app_portal_ticket')]
  193.     public function portalticket($tokenRequest $request,UrlGeneratorInterface $urlGenerator): Response
  194.     {
  195.         $reply = new Replys();
  196.         $form $this->createForm(ReplysFormType::class, $reply);
  197.         $ticket $this->ticketsRepository->findbyToken($token);
  198.         $allReplys $this->replysRepository->findByTicket($ticket[0]->getId());
  199.         $form->handleRequest($request);
  200.         if ($form->isSubmitted() && $form->isValid())
  201.         {
  202.             $loggedinUser $this->usersRepository->find(1);
  203.             $now date('Y-m-d H:m:s');
  204.          
  205.             $newReply $form->getData();
  206.             $newReply->setNoNotification(1);
  207.             $newReply->setTicket($ticket[0]);
  208.             $newReply->setUpdatedAt(new \DateTimeImmutable($now));
  209.             $newReply->setCreatedAt(new \DateTimeImmutable($now));
  210.             $newReply->setCreatedBy($loggedinUser);
  211.             $newReply->setUpdateBy($loggedinUser);
  212.             $newReply->setDeleted(0);
  213.             
  214.             $this->em->persist($newReply);
  215.             $this->em->flush();
  216.             $url $urlGenerator->generate('app_portal_ticket', ['token' => $token]);
  217.             return new RedirectResponse($url);
  218.         }
  219.         return $this->render('portal/tickets.html.twig', [
  220.             'ticket' => $ticket[0],
  221.             'allReplys' => $allReplys,
  222.             'form' => $form->createView()
  223.         ]);
  224.     }
  225. }