<?php
namespace App\Controller;
use App\Entity\Candidat;
use App\Entity\Correspondant;
use App\Entity\CorrespondantEmail;
use App\Entity\Document;
use App\Entity\Email;
use App\Entity\EmailModele;
use App\Entity\Folder;
use App\Entity\Jeu;
use App\Form\EmailType;
use App\Form\FolderType;
use App\Repository\CandidatRepository;
use App\Repository\CorrespondantEmailModeleRepository;
use App\Repository\CorrespondantEmailRepository;
use App\Repository\CorrespondantRepository;
use App\Repository\DocumentRepository;
use App\Repository\EmailModeleRepository;
use App\Repository\EmailRepository;
use App\Repository\FolderRepository;
use App\Service\Commun\EmailerService;
use App\Service\Commun\FileUploader;
use App\Service\Entity\CandidatService;
use App\Service\Entity\CorrespondantService;
use App\Service\Entity\EmailService;
use Doctrine\ORM\EntityManagerInterface;
use Symfony\Bundle\FrameworkBundle\Controller\AbstractController;
use Symfony\Component\DependencyInjection\ParameterBag\ParameterBagInterface;
use Symfony\Component\HttpFoundation\File\UploadedFile;
use Symfony\Component\HttpFoundation\JsonResponse;
use Symfony\Component\HttpFoundation\Request;
use Symfony\Component\HttpFoundation\Response;
use Symfony\Component\Routing\Annotation\Route;
use Faker;
use Symfony\Component\Security\Core\User\User;
use Symfony\Component\Translation\Translator;
use Symfony\Contracts\Translation\TranslatorInterface;
/**
* @Route("/mail")
*/
class EmailController extends AbstractController
{
private $manager;
private $candidatRepository;
private $correspondantService;
private $folderRepository;
private $correspondantEmailRepository;
private $emailService;
private $emailModeleRepository;
private $candidatService;
public static $deletedMsgOk = 'Suppression effectuée.';
public static $endLineAndStrongTag = '<br/><strong>';
public static $closeStringTag = ':</strong> ';
public function __construct(
EntityManagerInterface $manager,
CandidatRepository $candidatRepository,
CorrespondantService $correspondantService,
FolderRepository $folderRepository,
CorrespondantEmailRepository $correspondantEmailRepository,
EmailService $emailService,
EmailModeleRepository $emailModeleRepository,
CandidatService $candidatService,
EmailRepository $emailRepository
)
{
$this->manager = $manager;
$this->candidatRepository = $candidatRepository;
$this->correspondantService = $correspondantService;
$this->folderRepository = $folderRepository;
$this->correspondantEmailRepository = $correspondantEmailRepository;
$this->emailService = $emailService;
$this->emailModeleRepository = $emailModeleRepository;
$this->emailRepository = $emailRepository;
$this->candidatService = $candidatService;
}
/**
* @Route("/recover/{email}", name="mail_recover")
* @param Email $email
* @param CorrespondantRepository $correspondantRepository
* @param CorrespondantEmailRepository $correspondantEmailRepository
* @return Response
*/
public function recover(
Email $email,
CorrespondantEmailRepository $correspondantEmailRepository
): Response
{
$correspondant = $email->getCandidat()->getCorrespondant();
$correspondantEmail =
$correspondantEmailRepository->findOneBy(['correspondant' => $correspondant, 'email' => $email]);
if ($correspondantEmail->getRole() == 'a') {
$email->setStatus('INBOX');
} else {
$email->setStatus('SENT');
}
$currentDateTime = new \DateTime();
$email->setLastStatusAt($currentDateTime);
$this->manager->flush();
$in = 'TRASH';
return $this->redirectToRoute('mail_inbox', ['in' => $in]);
}
/**
* @Route("/archive/{email}", name="mail_archive")
* @param Email $email
* @return Response
*/
public function archive(Email $email): Response
{
$currentDateTime = new \DateTime();
$email->setLastStatusAt($currentDateTime);
$email->setStatus('ARCHIVED');
$this->manager->flush();
return $this->redirectToRoute('mail_inbox');
}
/**
* @Route("/trash/{email}", name="mail_trash")
* @param Email $email
* @return Response
*/
public function trash(Email $email): Response
{
$currentDateTime = new \DateTime();
$email->setLastStatusAt($currentDateTime);
$email->setStatus('TRASH');
$this->manager->flush();
return $this->redirectToRoute('mail_inbox');
}
/**
* @Route("/delete/{email}", name="mail_delete")
* @param Email $email
* @return Response
*/
public function delete(Email $email): Response
{
$currentDateTime = new \DateTime();
$email->setLastStatusAt($currentDateTime);
$email->setStatus('DELETE');
$this->manager->flush();
return $this->redirectToRoute('mail_inbox');
}
/**
* @Route("/trashs", name="mail_trashs")
* @param Request $request
* @param EmailRepository $emailRepository
* @return Response
*/
public function trashs(Request $request, EmailRepository $emailRepository): Response
{
$currentDateTime = new \DateTime();
$emailIds = $request->request->get('emailIds');
$emails = $emailRepository->findByIds($emailIds);
foreach ($emails as $email) {
$email->setLastStatusAt($currentDateTime);
$email->setStatus('TRASH');
}
$this->manager->flush();
return $this->json(['code' => 200, 'message' => EmailController::$deletedMsgOk], 200);
}
/**
* @Route("/deletes", name="mail_deletes")
* @param Request $request
* @param ObjectManager $manager
* @param EmailRepository $emailRepository
* @return Response
*/
public function deletes(Request $request, EmailRepository $emailRepository): Response
{
$currentDateTime = new \DateTime();
$emailIds = $request->request->get('emailIds');
$emails = $emailRepository->findByIds($emailIds);
foreach ($emails as $email) {
$email->setLastStatusAt($currentDateTime);
$email->setStatus('DELETE');
}
$this->manager->flush();
return $this->json(['code' => 200, 'message' => EmailController::$deletedMsgOk], 200);
}
/**
* @Route("/removes", name="mail_removes")
* @param Request $request
* @param ObjectManager $manager
* @param EmailRepository $emailRepository
* @param DocumentRepository $documentRepository
* @param CorrespondantEmailRepository $correspondantEmailRepository
* @param FileUploader $fileUploader
* @return Response
*
*/
public function removes(
Request $request,
EmailRepository $emailRepository,
DocumentRepository $documentRepository,
CorrespondantEmailRepository $correspondantEmailRepository,
FileUploader $fileUploader
): Response
{
$emailIds = $request->request->get('emailIds');
$emails = $emailRepository->findByIds($emailIds);
foreach ($emails as $email) {
// Suppression de documents liés au mail
$fileUploader->remove(
$email,
$this->manager,
$documentRepository,
$correspondantEmailRepository,
$fileUploader
);
}
$this->manager->flush();
return $this->json(['code' => 200, 'message' => EmailController::$deletedMsgOk], 200);
}
public function removeRelationship(
Email $email,
DocumentRepository $documentRepository,
CorrespondantEmailRepository $correspondantEmailRepository,
FileUploader $fileUploader
): bool
{
$documents = $documentRepository->findByEmail($email);
foreach ($documents as $document) {
// TODO
$pathName = $document->getPath() . '/' . $document->getName();
$fileUploader->remove([$pathName]);
$this->manager->remove($document);
}
// Suppression de liens correspondants liés au mail
$correspondantEmails = $correspondantEmailRepository->findByEmail($email);
foreach ($correspondantEmails as $correspondantEmail) {
$this->manager->remove($correspondantEmail);
}
$this->manager->flush();
return true;
}
/**
* @Route("/show/{email}", name="email_show")
* @param Email $email
* @return Response
*/
public function show(
Email $email,
ParameterBagInterface $params,
FolderRepository $folderRepository,
EmailService $emailService
): Response
{
$user = $this->getUser();
$candidat = $this->candidatRepository->find($user->getId());
$uploadedDocumentsPath = $params->get('uploaded_documents_path');
$email->setIsLu(true);
// TODO manager *********************
$this->manager->persist($email);
$this->manager->flush();
$folder = new Folder();
$formFolder = $this->createForm(FolderType::class, $folder);
$folders = $folderRepository->findBy(['candidat' => $candidat], ['name' => 'asc']);
$allCounters = $emailService->getCounters();
return $this->render('email/show.html.twig', [
'email' => $email,
'uploadedDocumentsPath' => $uploadedDocumentsPath,
'formfolder' => $formFolder->createView(),
'folders' => $folders,
'allCounters' => $allCounters,
'active_menu' => strtolower($email->getStatus())
]);
}
/**
* @Route("/reply/{email}", name="email_reply")
* @param Request $request
* @param Email $email
* @param TranslatorInterface $translator
* @param string $source
* @return Response
*/
public function reply(
Request $request,
Email $email,
TranslatorInterface $translator,
string $source = 'REPLY'
): Response
{
$user = $this->getUser();
$currentDateTime = new \DateTime();
$copyEmail = clone $email;
$candidat = $this->candidatRepository->find($user->getId());
$destinatairesPotentiels =
$this->correspondantService->getDestinatairesPotentiels($candidat->getCorrespondant());
$originalContenu = '<br/><br/>------------------------------------';
$expediteur = $copyEmail->getExpediteur() ? $copyEmail->getExpediteur()->getFullname() : '';
$originalContenu .= EmailController::$endLineAndStrongTag . $translator->trans('label.de') .
EmailController::$closeStringTag . $expediteur;
$originalContenu .= EmailController::$endLineAndStrongTag . $translator->trans('label.envoye') .
EmailController::$closeStringTag . $copyEmail->getCreatedAt()->format($translator->trans('label.dmY_Hi'));
$originalContenu .= EmailController::$endLineAndStrongTag . $translator->trans('label.priorite') .
EmailController::$closeStringTag . $copyEmail->getPriorite();
$originalContenu .= EmailController::$endLineAndStrongTag . $translator->trans('label.a') .
EmailController::$closeStringTag;
$destinatairesA = '';
if ($copyEmail->getDestinatairesA()) {
foreach ($copyEmail->getDestinatairesA() as $destinataire) {
if ($destinatairesA != '') {
$destinatairesA .= '; ';
}
$destinatairesA .= $destinataire->getFullname();
}
$originalContenu .= $destinatairesA;
} else {
$originalContenu .= $translator->trans('label.inconnu');
}
if ($copyEmail->getDestinatairesCc()) {
$originalContenu .= EmailController::$endLineAndStrongTag . $translator->trans('label.cc') .
EmailController::$closeStringTag;
$destinatairesCc = '';
foreach ($copyEmail->getDestinatairesCc() as $destinataire) {
if ($destinatairesCc != '') {
$destinatairesCc .= '; ';
}
$destinatairesCc .= $destinataire->getFullname();
}
$originalContenu .= $destinatairesCc;
}
if ($copyEmail->getDestinatairesCci()) {
$originalContenu .= EmailController::$endLineAndStrongTag . $translator->trans('label.cci') .
EmailController::$closeStringTag;
$destinatairesCci = '';
foreach ($copyEmail->getDestinatairesCci() as $destinataire) {
if ($destinatairesCci != '') {
$destinatairesCci .= '; ';
}
$destinatairesCci .= $destinataire->getFullname();
}
$originalContenu .= $destinatairesCci;
}
$originalContenu .= EmailController::$endLineAndStrongTag . $translator->trans('label.objet') .
EmailController::$closeStringTag . $copyEmail->getObjet();
$originalContenu .= '<br/>' . $copyEmail->getContenu();
$copyEmail->setContenu($originalContenu);
$prefixeObjet = '';
if ($source == 'REPLY' || $source == 'REPLYALL') {
$prefixeObjet = 'RE: ';
}
if ($source == 'TRANSFER') {
$prefixeObjet = 'TR: ';
}
$copyEmail->setObjet($prefixeObjet . $copyEmail->getObjet());
$copyEmail->setLastStatusAt($currentDateTime);
$form = $this->createForm(EmailType::class, null, [
'data' => [
'destinatairesPotentiels' => $destinatairesPotentiels,
'email' => $copyEmail,
'correspondant' => $candidat->getCorrespondant(),
'action' => $source,
],
'data_class' => null,
]);
$action = $request->request->get('action');
// On supprime les fichiers attachés pour les replay
if ((!$form->isSubmitted() && ($source == 'REPLY' || $source == 'REPLYALL')) || ($action == 'save')) {
foreach ($copyEmail->getDocuments() as $document) {
$copyEmail->removeDocument($document);
}
}
$form->handleRequest($request);
if ($form->isSubmitted() && $form->isValid()) {
$response = $this->emailService->editOrSendEmail($source, $form, $currentDateTime, $email, $request, $user);
return is_string($response) ? $this->redirect($response) : $response;
}
$folder = new Folder();
$formFolder = $this->createForm(FolderType::class, $folder);
$folders = $this->folderRepository->findBy(['candidat' => $candidat], ['name' => 'asc']);
$allCounters = $this->emailService->getCounters();
$drafts = $this->emailService->getAutomaticDraftEmailByParent($candidat, $email->getId());
$emailReponse = empty($drafts) ? null : $drafts[0]->getId();
return $this->render('email/edit.html.twig', [
'destinatairesPotentiels' => $destinatairesPotentiels,
'form' => $form->createView(),
'formfolder' => $formFolder->createView(),
'folders' => $folders,
'email' => $email,
'allCounters' => $allCounters,
'automaticDraftId' => $emailReponse,
'active_menu' => strtolower($email->getStatus() || "INBOX")
]);
}
/**
* @Route("/transfer/{email}", name="email_transfer")
* @param Request $request
* @param Email $email
* @return Response
* @throws \Exception
*/
public function transfer(Request $request, Email $email, TranslatorInterface $translator): Response
{
return $this->reply($request, $email, $translator, 'TRANSFER');
}
/**
* @Route("/replyall/{email}", name="email_replyall")
* @param Request $request
* @param Email $email
* @return Response
* @throws \Exception
*/
public function replyall(Request $request, Email $email, TranslatorInterface $translator): Response
{
return $this->reply($request, $email, $translator, 'REPLYALL');
}
/**
* @Route("/edit/{email}", defaults={"email" = null}, name="email_edit")
* @param Request $request
* @param CandidatRepository $candidatRepository
* @param CorrespondantService $correspondantService
* @param EmailService $emailService
* @param Email|null $email
* @return Response
*/
public function edit(
Request $request,
CandidatRepository $candidatRepository,
CorrespondantService $correspondantService,
EmailService $emailService,
Email $email = null
): Response
{
$user = $this->getUser();
$currentDateTime = new \DateTime();
$candidat = $candidatRepository->find($user->getId());
$destinatairesPotentiels = $correspondantService->getDestinatairesPotentiels($candidat->getCorrespondant());
if ($email) {
$email->setLastStatusAt($currentDateTime);
}
$form = $this->createForm(
EmailType::class,
$email,
['data' =>
['destinatairesPotentiels' => $destinatairesPotentiels, 'email' => $email, 'action' => 'EDIT',],
'data_class' => null]
);
$form->handleRequest($request);
if ($form->isSubmitted() && $form->isValid()) {
if (!$email) {
$email = new Email();
}
$response = $this->emailService->editEmail($email, $form, $currentDateTime, $request, $candidat, $user);
return is_string($response) ? $this->redirect($response) : $response;
}
$folder = new Folder();
$formFolder = $this->createForm(FolderType::class, $folder);
$folders = $this->folderRepository->findBy(['candidat' => $candidat], ['name' => 'asc']);
$allCounters = $emailService->getCounters();
return $this->render('email/edit.html.twig', [
'destinatairesPotentiels' => $destinatairesPotentiels,
'form' => $form->createView(),
'formfolder' => $formFolder->createView(),
'folders' => $folders,
'email' => $email,
'allCounters' => $allCounters,
'automaticDraftId' => null,
'active_menu' => strtolower(($email === null || $email->getStatus() === null) ? "INBOX" : $email->getStatus())
]);
}
/**
* @Route("/add/{emailModele}", name="email_add")
* @param Request $request
* @param EmailModele $emailModele
* @return JsonResponse
*/
public function addEmail(Request $request, EmailModele $emailModele)
{
$user = $this->getUser();
$candidat = $this->candidatRepository->find($user->getId());
$email = $this->emailRepository->findBy(['candidat' => $candidat, 'emailModele' => $emailModele]);
// on ne rajoute le mail que si il n'existe pas dans le cas où on essaaie de l'ajouter
// pour une raison ou une autre. Application ouverte dans 2 fenêtres différentes ou
// onglets différents.
if (!$email) {
$email = $this->candidatService->addEmailToCandidat($candidat, $emailModele);
} else {
$email = null;
}
return new JsonResponse(['status' => '200', 'data' => $email], 200);
}
/**
* @Route("/{in}", name="mail_inbox", defaults={"in"="inbox"})
* @param string $in
* @param EmailService $emailService
* @param FolderRepository $folderRepository
* @return Response
*/
public function inbox(
string $in,
EmailService $emailService,
TranslatorInterface $translator
): Response
{
$user = $this->getUser();
$in = strtoupper($in);
$candidat = $this->candidatRepository->find($user->getId());
$jeu = $candidat->getProject()->getJeu();
if ($jeu->getSocietes()->count() === 0 || $jeu->getCorrespondantsCounter() === 0 || $jeu->isValid() === false || $jeu->getEmailModeles()->count() === 0) {
return $this->redirectToRoute('saml_logout');
}
$emailsIn = $emailService->getEmails($in);
$allCounters = $emailService->getCounters();
switch ($in) {
case 'INBOX':
$title = $translator->trans('title.inbox');
break;
case 'SENT':
$title = $translator->trans('title.sent');
break;
case 'DRAFTS':
$title = $translator->trans('title.drafts');
break;
case 'ARCHIVED':
$title = $translator->trans('title.archived');
break;
case 'TRASH':
$title = $translator->trans('title.trash');
break;
case 'DELETE':
$title = $translator->trans('title.delete');
break;
default:
$title = 'Not implemented';
break;
}
$folder = new Folder();
$formFolder = $this->createForm(FolderType::class, $folder);
$folders = $this->folderRepository->findBy(['candidat' => $candidat], ['name' => 'asc']);
return $this->render('email/in.html.twig', [
'in' => $in,
'emailsIn' => $emailsIn,
'allCounters' => $allCounters,
'formfolder' => $formFolder->createView(),
'folders' => $folders,
'title' => $title,
'active_menu' => strtolower($in),
]);
}
/**
* @Route("/{in}", name="ajx_mail_inbox", defaults={"in"="inbox"})
* @param string $in
* @param EmailService $emailService
* @param CandidatRepository $candidatRepository
* @return Response
*/
public function ajxInbox(string $in, EmailService $emailService, CandidatRepository $candidatRepository): Response
{
$in = strtoupper($in);
$user = $this->getUser();
$candidat = $candidatRepository->find($user);
$emailsIn = $emailService->getEmails($candidat, $in);
return $this->json($emailsIn);
}
}