<?php
namespace App\Controller;
use Symfony\Bundle\FrameworkBundle\Controller\AbstractController;
use Symfony\Component\HttpFoundation\Response;
use Symfony\Component\Routing\Annotation\Route;
use App\Form\TicketPortalFormType;
use App\Form\ReplysFormType;
use App\Entity\Tickets;
use App\Entity\Accounts;
use App\Entity\Replys;
use App\Entity\Emails;
use App\Repository\ReplysRepository;
use App\Repository\EntitiesRepository;
use App\Repository\UsersRepository;
use App\Repository\TicketsRepository;
use App\Repository\AccountsAreaRepository;
use App\Repository\DepartmentsRepository;
use App\Repository\CategoriesRepository;
use App\Repository\StatusRepository;
use App\Repository\PrioritiesRepository;
use App\Repository\AccountsTypeRepository;
use Symfony\Component\HttpFoundation\Request;
use Doctrine\ORM\EntityManagerInterface;
use Symfony\Component\Mailer\MailerInterface;
use Symfony\Component\Mime\Email;
use Symfony\Component\HttpFoundation\RedirectResponse;
use Symfony\Component\Routing\Generator\UrlGeneratorInterface;
use PHPMailer\PHPMailer\PHPMailer;
use PHPMailer\PHPMailer\Exception as MailException;
class PortalController extends AbstractController
{
private $em;
private $ticketsRepository;
private $entitiesRepository;
private $usersRepository;
private $areaRepository;
private $typeRepository;
private $departmentsRepository;
private $statusRepository;
private $prioritiesRepository;
private $categoriesRepository;
private $replysRepository;
public function __construct(EntityManagerInterface $em, ReplysRepository $replysRepository, PrioritiesRepository $prioritiesRepository, CategoriesRepository $categoriesRepository, StatusRepository $statusRepository, DepartmentsRepository $departmentsRepository, TicketsRepository $ticketsRepository, EntitiesRepository $entitiesRepository, UsersRepository $usersRepository, AccountsTypeRepository $typeRepository, AccountsAreaRepository $areaRepository)
{
$this->em = $em;
$this->ticketsRepository = $ticketsRepository;
$this->entitiesRepository = $entitiesRepository;
$this->usersRepository = $usersRepository;
$this->areaRepository = $areaRepository;
$this->typeRepository = $typeRepository;
$this->departmentsRepository = $departmentsRepository;
$this->statusRepository = $statusRepository;
$this->prioritiesRepository = $prioritiesRepository;
$this->categoriesRepository = $categoriesRepository;
$this->replysRepository = $replysRepository;
}
#[Route('/', name: 'app_home')]
public function index(): Response
{
return $this->render('portal/home.html.twig', [
]);
}
#[Route('/portal', name: 'app_portal')]
public function portal(Request $request): Response
{
$newTicket = new Tickets();
$newAccount = new Accounts();
$newEmail = new Emails();
$form = $this->createForm(TicketPortalFormType::class, $newTicket);
$message = $request->query->get('message') ?? "";
$form->handleRequest($request);
if ($form->isSubmitted() && $form->isValid()) {
$entityselected = $this->entitiesRepository->find(1);
$userdefault = $this->usersRepository->find(1);
$typedefault = $this->typeRepository->find(1);
$areadefault = $this->areaRepository->find(5);
$departmentdefault = $this->departmentsRepository->find(4);
$statusdefault = $this->statusRepository->find(1);
$prioritiesdefault = $this->prioritiesRepository->find(2);
$categoriesdefault = $this->categoriesRepository->find(1);
$now = new \DateTimeImmutable();
$newAccount->setUser($userdefault);
$newAccount->setName($_POST['email']);
$newAccount->setUpdatedAt($now);
$newAccount->setCreatedAt($now);
$newAccount->setCreatedBy($userdefault);
$newAccount->setUpdateBy($userdefault);
$newAccount->setDescription("Portal");
$newAccount->setType($typedefault);
$newAccount->setArea($areadefault);
$this->em->persist($newAccount);
$this->em->flush();
$newEmail->setEmail($_POST['email']);
$newEmail->setIdInRelation($newAccount->getId());
$newEmail->setEntity($entityselected);
$this->em->persist($newEmail);
$this->em->flush();
$newTicket = $form->getData();
$newTicket->setUser($userdefault);
$newTicket->setUpdatedAt($now);
$newTicket->setCreatedAt($now);
$newTicket->setCreatedBy($userdefault);
$newTicket->setUpdateBy($userdefault);
$newTicket->setDeleted(0);
$newTicket->setActive(0);
$newTicket->setDepartments($departmentdefault);
$newTicket->setStatus($statusdefault);
$newTicket->setPriorities($prioritiesdefault);
$newTicket->setCategories($categoriesdefault);
$newTicket->setAccount($newAccount);
$token = substr(md5(openssl_random_pseudo_bytes(20)), -10);
$newTicket->setToken($token);
$this->em->persist($newTicket);
$this->em->flush();
try {
$mail = new PHPMailer(true);
$mail->CharSet = 'UTF-8';
$mail->isSMTP();
$mail->Host = 'sosconsultoria.pt';
$mail->SMTPAuth = true;
$mail->Username = 'suporte@sosconsultoria.pt';
$mail->Password = $_SERVER['MAILER_PASSWORD'];
$mail->SMTPSecure = 'ssl';
$mail->Port = 465;
$mail->setFrom('suporte@sosconsultoria.pt', 'SOS Consultoria');
$mail->addAddress($_POST['email']);
$mail->addReplyTo('suporte@sosconsultoria.pt', 'SOS Consultoria');
$mail->isHTML(true);
$mail->Subject = 'Tickets Central';
$mail->Body = '<table style="font-family: Helvetica, Arial, sans-serif; font-size: 14px;">'
. '<tr><td><strong>Tickets Central</strong></td></tr>'
. '<tr><td>Por favor confirme o seu e-mail clicando no link abaixo:</td></tr>'
. '<tr><td><a href="https://helpdesk.sosadvanced.pt/portalconfirm/' . $token . '/' . $newTicket->getId() . '" style="color: #608E34; font-weight: bold;">Confirmar Email</a></td></tr>'
. '<tr><td>— <b>Tickets</b> - Admin Dashboard</td></tr>'
. '</table>';
$mail->send();
$message = "Email has been sent, please check your inbox.";
} catch (MailException $e) {
return new Response('Erro ao enviar e-mail: ' . $mail->ErrorInfo);
}
return $this->redirectToRoute('app_portal', ['message' => $message]);
}
return $this->render('portal/index.html.twig', [
'form' => $form->createView(),
'message' => $message
]);
}
#[Route('/portalconfirm/{token}/{ticketid}', name: 'app_portal_confirm')]
public function portalconfirm($token, $ticketid): Response
{
$tickets = $this->ticketsRepository->find($ticketid);
$tickets->setActive(1);
$this->em->persist($tickets);
$this->em->flush();
$emailtosend = $tickets->getAccount()->getName();
try {
$mail = new PHPMailer(true);
$mail->CharSet = 'UTF-8';
$mail->isSMTP();
$mail->Host = 'sosconsultoria.pt';
$mail->SMTPAuth = true;
$mail->Username = 'suporte@sosconsultoria.pt';
$mail->Password = $_SERVER['MAILER_PASSWORD'];
$mail->SMTPSecure = 'ssl';
$mail->Port = 465;
$mail->setFrom('suporte@sosconsultoria.pt', 'SOS Consultoria');
$mail->addAddress($emailtosend);
$mail->addReplyTo('suporte@sosconsultoria.pt', 'SOS Consultoria');
$mail->isHTML(true);
$mail->Subject = 'Tickets Central';
$mail->Body = '<table style="font-family: Helvetica, Arial, sans-serif; font-size: 14px;">'
. '<tr><td><strong>Tickets Central</strong></td></tr>'
. '<tr><td>Email confirmado, o seu ticket será iniciado em breve. Pode acompanhar o progresso clicando no link abaixo:</td></tr>'
. '<tr><td><a href="https://helpdesk.sosadvanced.pt/portalticket/' . $token . '" style="color: #608E34; font-weight: bold;">Abrir Ticket</a></td></tr>'
. '<tr><td>— <b>Tickets</b> - Admin Dashboard</td></tr>'
. '</table>';
$mail->send();
} catch (MailException $e) {
return new Response('Erro ao enviar e-mail: ' . $mail->ErrorInfo);
}
return $this->redirectToRoute('app_ticket_confirmed', [
'token' => $token
]);
}
#[Route('/ticket-created/{token}', name: 'app_ticket_confirmed')]
public function ticketcreated($token): Response
{
return $this->render('portal/confirmedemail.html.twig', [
'token' => $token
]);
}
#[Route('/portalticket/{token}', name: 'app_portal_ticket')]
public function portalticket($token, Request $request,UrlGeneratorInterface $urlGenerator): Response
{
$reply = new Replys();
$form = $this->createForm(ReplysFormType::class, $reply);
$ticket = $this->ticketsRepository->findbyToken($token);
$allReplys = $this->replysRepository->findByTicket($ticket[0]->getId());
$form->handleRequest($request);
if ($form->isSubmitted() && $form->isValid())
{
$loggedinUser = $this->usersRepository->find(1);
$now = date('Y-m-d H:m:s');
$newReply = $form->getData();
$newReply->setNoNotification(1);
$newReply->setTicket($ticket[0]);
$newReply->setUpdatedAt(new \DateTimeImmutable($now));
$newReply->setCreatedAt(new \DateTimeImmutable($now));
$newReply->setCreatedBy($loggedinUser);
$newReply->setUpdateBy($loggedinUser);
$newReply->setDeleted(0);
$this->em->persist($newReply);
$this->em->flush();
$url = $urlGenerator->generate('app_portal_ticket', ['token' => $token]);
return new RedirectResponse($url);
}
return $this->render('portal/tickets.html.twig', [
'ticket' => $ticket[0],
'allReplys' => $allReplys,
'form' => $form->createView()
]);
}
}