src/Controller/EmailController.php line 466

Open in your IDE?
  1. <?php
  2. namespace App\Controller;
  3. use App\Entity\Candidat;
  4. use App\Entity\Correspondant;
  5. use App\Entity\CorrespondantEmail;
  6. use App\Entity\Document;
  7. use App\Entity\Email;
  8. use App\Entity\EmailModele;
  9. use App\Entity\Folder;
  10. use App\Entity\Jeu;
  11. use App\Form\EmailType;
  12. use App\Form\FolderType;
  13. use App\Repository\CandidatRepository;
  14. use App\Repository\CorrespondantEmailModeleRepository;
  15. use App\Repository\CorrespondantEmailRepository;
  16. use App\Repository\CorrespondantRepository;
  17. use App\Repository\DocumentRepository;
  18. use App\Repository\EmailModeleRepository;
  19. use App\Repository\EmailRepository;
  20. use App\Repository\FolderRepository;
  21. use App\Service\Commun\EmailerService;
  22. use App\Service\Commun\FileUploader;
  23. use App\Service\Entity\CandidatService;
  24. use App\Service\Entity\CorrespondantService;
  25. use App\Service\Entity\EmailService;
  26. use Doctrine\ORM\EntityManagerInterface;
  27. use Symfony\Bundle\FrameworkBundle\Controller\AbstractController;
  28. use Symfony\Component\DependencyInjection\ParameterBag\ParameterBagInterface;
  29. use Symfony\Component\HttpFoundation\File\UploadedFile;
  30. use Symfony\Component\HttpFoundation\JsonResponse;
  31. use Symfony\Component\HttpFoundation\Request;
  32. use Symfony\Component\HttpFoundation\Response;
  33. use Symfony\Component\Routing\Annotation\Route;
  34. use Faker;
  35. use Symfony\Component\Security\Core\User\User;
  36. use Symfony\Component\Translation\Translator;
  37. use Symfony\Contracts\Translation\TranslatorInterface;
  38. /**
  39.  * @Route("/mail")
  40.  */
  41. class EmailController extends AbstractController
  42. {
  43.     private $manager;
  44.     private $candidatRepository;
  45.     private $correspondantService;
  46.     private $folderRepository;
  47.     private $correspondantEmailRepository;
  48.     private $emailService;
  49.     private $emailModeleRepository;
  50.     private $candidatService;
  51.     public static $deletedMsgOk 'Suppression effectuée.';
  52.     public static $endLineAndStrongTag '<br/><strong>';
  53.     public static $closeStringTag ':</strong> ';
  54.     public function __construct(
  55.         EntityManagerInterface       $manager,
  56.         CandidatRepository           $candidatRepository,
  57.         CorrespondantService         $correspondantService,
  58.         FolderRepository             $folderRepository,
  59.         CorrespondantEmailRepository $correspondantEmailRepository,
  60.         EmailService                 $emailService,
  61.         EmailModeleRepository        $emailModeleRepository,
  62.         CandidatService              $candidatService,
  63.         EmailRepository              $emailRepository
  64.     )
  65.     {
  66.         $this->manager $manager;
  67.         $this->candidatRepository $candidatRepository;
  68.         $this->correspondantService $correspondantService;
  69.         $this->folderRepository $folderRepository;
  70.         $this->correspondantEmailRepository $correspondantEmailRepository;
  71.         $this->emailService $emailService;
  72.         $this->emailModeleRepository $emailModeleRepository;
  73.         $this->emailRepository $emailRepository;
  74.         $this->candidatService $candidatService;
  75.     }
  76.     /**
  77.      * @Route("/recover/{email}", name="mail_recover")
  78.      * @param Email $email
  79.      * @param CorrespondantRepository $correspondantRepository
  80.      * @param CorrespondantEmailRepository $correspondantEmailRepository
  81.      * @return Response
  82.      */
  83.     public function recover(
  84.         Email                        $email,
  85.         CorrespondantEmailRepository $correspondantEmailRepository
  86.     ): Response
  87.     {
  88.         $correspondant $email->getCandidat()->getCorrespondant();
  89.         $correspondantEmail =
  90.             $correspondantEmailRepository->findOneBy(['correspondant' => $correspondant'email' => $email]);
  91.         if ($correspondantEmail->getRole() == 'a') {
  92.             $email->setStatus('INBOX');
  93.         } else {
  94.             $email->setStatus('SENT');
  95.         }
  96.         $currentDateTime = new \DateTime();
  97.         $email->setLastStatusAt($currentDateTime);
  98.         $this->manager->flush();
  99.         $in 'TRASH';
  100.         return $this->redirectToRoute('mail_inbox', ['in' => $in]);
  101.     }
  102.     /**
  103.      * @Route("/archive/{email}", name="mail_archive")
  104.      * @param Email $email
  105.      * @return Response
  106.      */
  107.     public function archive(Email $email): Response
  108.     {
  109.         $currentDateTime = new \DateTime();
  110.         $email->setLastStatusAt($currentDateTime);
  111.         $email->setStatus('ARCHIVED');
  112.         $this->manager->flush();
  113.         return $this->redirectToRoute('mail_inbox');
  114.     }
  115.     /**
  116.      * @Route("/trash/{email}", name="mail_trash")
  117.      * @param Email $email
  118.      * @return Response
  119.      */
  120.     public function trash(Email $email): Response
  121.     {
  122.         $currentDateTime = new \DateTime();
  123.         $email->setLastStatusAt($currentDateTime);
  124.         $email->setStatus('TRASH');
  125.         $this->manager->flush();
  126.         return $this->redirectToRoute('mail_inbox');
  127.     }
  128.     /**
  129.      * @Route("/delete/{email}", name="mail_delete")
  130.      * @param Email $email
  131.      * @return Response
  132.      */
  133.     public function delete(Email $email): Response
  134.     {
  135.         $currentDateTime = new \DateTime();
  136.         $email->setLastStatusAt($currentDateTime);
  137.         $email->setStatus('DELETE');
  138.         $this->manager->flush();
  139.         return $this->redirectToRoute('mail_inbox');
  140.     }
  141.     /**
  142.      * @Route("/trashs", name="mail_trashs")
  143.      * @param Request $request
  144.      * @param EmailRepository $emailRepository
  145.      * @return Response
  146.      */
  147.     public function trashs(Request $requestEmailRepository $emailRepository): Response
  148.     {
  149.         $currentDateTime = new \DateTime();
  150.         $emailIds $request->request->get('emailIds');
  151.         $emails $emailRepository->findByIds($emailIds);
  152.         foreach ($emails as $email) {
  153.             $email->setLastStatusAt($currentDateTime);
  154.             $email->setStatus('TRASH');
  155.         }
  156.         $this->manager->flush();
  157.         return $this->json(['code' => 200'message' => EmailController::$deletedMsgOk], 200);
  158.     }
  159.     /**
  160.      * @Route("/deletes", name="mail_deletes")
  161.      * @param Request $request
  162.      * @param ObjectManager $manager
  163.      * @param EmailRepository $emailRepository
  164.      * @return Response
  165.      */
  166.     public function deletes(Request $requestEmailRepository $emailRepository): Response
  167.     {
  168.         $currentDateTime = new \DateTime();
  169.         $emailIds $request->request->get('emailIds');
  170.         $emails $emailRepository->findByIds($emailIds);
  171.         foreach ($emails as $email) {
  172.             $email->setLastStatusAt($currentDateTime);
  173.             $email->setStatus('DELETE');
  174.         }
  175.         $this->manager->flush();
  176.         return $this->json(['code' => 200'message' => EmailController::$deletedMsgOk], 200);
  177.     }
  178.     /**
  179.      * @Route("/removes", name="mail_removes")
  180.      * @param Request $request
  181.      * @param ObjectManager $manager
  182.      * @param EmailRepository $emailRepository
  183.      * @param DocumentRepository $documentRepository
  184.      * @param CorrespondantEmailRepository $correspondantEmailRepository
  185.      * @param FileUploader $fileUploader
  186.      * @return Response
  187.      *
  188.      */
  189.     public function removes(
  190.         Request                      $request,
  191.         EmailRepository              $emailRepository,
  192.         DocumentRepository           $documentRepository,
  193.         CorrespondantEmailRepository $correspondantEmailRepository,
  194.         FileUploader                 $fileUploader
  195.     ): Response
  196.     {
  197.         $emailIds $request->request->get('emailIds');
  198.         $emails $emailRepository->findByIds($emailIds);
  199.         foreach ($emails as $email) {
  200.             // Suppression de documents liés au mail
  201.             $fileUploader->remove(
  202.                 $email,
  203.                 $this->manager,
  204.                 $documentRepository,
  205.                 $correspondantEmailRepository,
  206.                 $fileUploader
  207.             );
  208.         }
  209.         $this->manager->flush();
  210.         return $this->json(['code' => 200'message' => EmailController::$deletedMsgOk], 200);
  211.     }
  212.     public function removeRelationship(
  213.         Email                        $email,
  214.         DocumentRepository           $documentRepository,
  215.         CorrespondantEmailRepository $correspondantEmailRepository,
  216.         FileUploader                 $fileUploader
  217.     ): bool
  218.     {
  219.         $documents $documentRepository->findByEmail($email);
  220.         foreach ($documents as $document) {
  221.             // TODO
  222.             $pathName $document->getPath() . '/' $document->getName();
  223.             $fileUploader->remove([$pathName]);
  224.             $this->manager->remove($document);
  225.         }
  226.         // Suppression de liens correspondants liés au mail
  227.         $correspondantEmails $correspondantEmailRepository->findByEmail($email);
  228.         foreach ($correspondantEmails as $correspondantEmail) {
  229.             $this->manager->remove($correspondantEmail);
  230.         }
  231.         $this->manager->flush();
  232.         return true;
  233.     }
  234.     /**
  235.      * @Route("/show/{email}", name="email_show")
  236.      * @param Email $email
  237.      * @return Response
  238.      */
  239.     public function show(
  240.         Email                 $email,
  241.         ParameterBagInterface $params,
  242.         FolderRepository      $folderRepository,
  243.         EmailService          $emailService
  244.     ): Response
  245.     {
  246.         $user $this->getUser();
  247.         $candidat $this->candidatRepository->find($user->getId());
  248.         $uploadedDocumentsPath $params->get('uploaded_documents_path');
  249.         $email->setIsLu(true);
  250.         // TODO manager *********************
  251.         $this->manager->persist($email);
  252.         $this->manager->flush();
  253.         $folder = new Folder();
  254.         $formFolder $this->createForm(FolderType::class, $folder);
  255.         $folders $folderRepository->findBy(['candidat' => $candidat], ['name' => 'asc']);
  256.         $allCounters $emailService->getCounters();
  257.         return $this->render('email/show.html.twig', [
  258.             'email' => $email,
  259.             'uploadedDocumentsPath' => $uploadedDocumentsPath,
  260.             'formfolder' => $formFolder->createView(),
  261.             'folders' => $folders,
  262.             'allCounters' => $allCounters,
  263.             'active_menu' => strtolower($email->getStatus())
  264.         ]);
  265.     }
  266.     /**
  267.      * @Route("/reply/{email}", name="email_reply")
  268.      * @param Request $request
  269.      * @param Email $email
  270.      * @param TranslatorInterface $translator
  271.      * @param string $source
  272.      * @return Response
  273.      */
  274.     public function reply(
  275.         Request             $request,
  276.         Email               $email,
  277.         TranslatorInterface $translator,
  278.         string              $source 'REPLY'
  279.     ): Response
  280.     {
  281.         $user $this->getUser();
  282.         $currentDateTime = new \DateTime();
  283.         $copyEmail = clone $email;
  284.         $candidat $this->candidatRepository->find($user->getId());
  285.         $destinatairesPotentiels =
  286.             $this->correspondantService->getDestinatairesPotentiels($candidat->getCorrespondant());
  287.         $originalContenu '<br/><br/>------------------------------------';
  288.         $expediteur $copyEmail->getExpediteur() ? $copyEmail->getExpediteur()->getFullname() : '';
  289.         $originalContenu .= EmailController::$endLineAndStrongTag $translator->trans('label.de') .
  290.             EmailController::$closeStringTag $expediteur;
  291.         $originalContenu .= EmailController::$endLineAndStrongTag $translator->trans('label.envoye') .
  292.             EmailController::$closeStringTag $copyEmail->getCreatedAt()->format($translator->trans('label.dmY_Hi'));
  293.         $originalContenu .= EmailController::$endLineAndStrongTag $translator->trans('label.priorite') .
  294.             EmailController::$closeStringTag $copyEmail->getPriorite();
  295.         $originalContenu .= EmailController::$endLineAndStrongTag $translator->trans('label.a') .
  296.             EmailController::$closeStringTag;
  297.         $destinatairesA '';
  298.         if ($copyEmail->getDestinatairesA()) {
  299.             foreach ($copyEmail->getDestinatairesA() as $destinataire) {
  300.                 if ($destinatairesA != '') {
  301.                     $destinatairesA .= '; ';
  302.                 }
  303.                 $destinatairesA .= $destinataire->getFullname();
  304.             }
  305.             $originalContenu .= $destinatairesA;
  306.         } else {
  307.             $originalContenu .= $translator->trans('label.inconnu');
  308.         }
  309.         if ($copyEmail->getDestinatairesCc()) {
  310.             $originalContenu .= EmailController::$endLineAndStrongTag $translator->trans('label.cc') .
  311.                 EmailController::$closeStringTag;
  312.             $destinatairesCc '';
  313.             foreach ($copyEmail->getDestinatairesCc() as $destinataire) {
  314.                 if ($destinatairesCc != '') {
  315.                     $destinatairesCc .= '; ';
  316.                 }
  317.                 $destinatairesCc .= $destinataire->getFullname();
  318.             }
  319.             $originalContenu .= $destinatairesCc;
  320.         }
  321.         if ($copyEmail->getDestinatairesCci()) {
  322.             $originalContenu .= EmailController::$endLineAndStrongTag $translator->trans('label.cci') .
  323.                 EmailController::$closeStringTag;
  324.             $destinatairesCci '';
  325.             foreach ($copyEmail->getDestinatairesCci() as $destinataire) {
  326.                 if ($destinatairesCci != '') {
  327.                     $destinatairesCci .= '; ';
  328.                 }
  329.                 $destinatairesCci .= $destinataire->getFullname();
  330.             }
  331.             $originalContenu .= $destinatairesCci;
  332.         }
  333.         $originalContenu .= EmailController::$endLineAndStrongTag $translator->trans('label.objet') .
  334.             EmailController::$closeStringTag $copyEmail->getObjet();
  335.         $originalContenu .= '<br/>' $copyEmail->getContenu();
  336.         $copyEmail->setContenu($originalContenu);
  337.         $prefixeObjet '';
  338.         if ($source == 'REPLY' || $source == 'REPLYALL') {
  339.             $prefixeObjet 'RE: ';
  340.         }
  341.         if ($source == 'TRANSFER') {
  342.             $prefixeObjet 'TR: ';
  343.         }
  344.         $copyEmail->setObjet($prefixeObjet $copyEmail->getObjet());
  345.         $copyEmail->setLastStatusAt($currentDateTime);
  346.         $form $this->createForm(EmailType::class, null, [
  347.             'data' => [
  348.                 'destinatairesPotentiels' => $destinatairesPotentiels,
  349.                 'email' => $copyEmail,
  350.                 'correspondant' => $candidat->getCorrespondant(),
  351.                 'action' => $source,
  352.             ],
  353.             'data_class' => null,
  354.         ]);
  355.         $action $request->request->get('action');
  356.         // On supprime les fichiers attachés pour les replay
  357.         if ((!$form->isSubmitted() && ($source == 'REPLY' || $source == 'REPLYALL')) || ($action == 'save')) {
  358.             foreach ($copyEmail->getDocuments() as $document) {
  359.                 $copyEmail->removeDocument($document);
  360.             }
  361.         }
  362.         $form->handleRequest($request);
  363.         if ($form->isSubmitted() && $form->isValid()) {
  364.             $response $this->emailService->editOrSendEmail($source$form$currentDateTime$email$request$user);
  365.             return is_string($response) ? $this->redirect($response) : $response;
  366.         }
  367.         $folder = new Folder();
  368.         $formFolder $this->createForm(FolderType::class, $folder);
  369.         $folders $this->folderRepository->findBy(['candidat' => $candidat], ['name' => 'asc']);
  370.         $allCounters $this->emailService->getCounters();
  371.         $drafts $this->emailService->getAutomaticDraftEmailByParent($candidat$email->getId());
  372.         $emailReponse = empty($drafts) ? null $drafts[0]->getId();
  373.         return $this->render('email/edit.html.twig', [
  374.             'destinatairesPotentiels' => $destinatairesPotentiels,
  375.             'form' => $form->createView(),
  376.             'formfolder' => $formFolder->createView(),
  377.             'folders' => $folders,
  378.             'email' => $email,
  379.             'allCounters' => $allCounters,
  380.             'automaticDraftId' => $emailReponse,
  381.             'active_menu' => strtolower($email->getStatus() || "INBOX")
  382.         ]);
  383.     }
  384.     /**
  385.      * @Route("/transfer/{email}", name="email_transfer")
  386.      * @param Request $request
  387.      * @param Email $email
  388.      * @return Response
  389.      * @throws \Exception
  390.      */
  391.     public function transfer(Request $requestEmail $emailTranslatorInterface $translator): Response
  392.     {
  393.         return $this->reply($request$email$translator'TRANSFER');
  394.     }
  395.     /**
  396.      * @Route("/replyall/{email}", name="email_replyall")
  397.      * @param Request $request
  398.      * @param Email $email
  399.      * @return Response
  400.      * @throws \Exception
  401.      */
  402.     public function replyall(Request $requestEmail $emailTranslatorInterface $translator): Response
  403.     {
  404.         return $this->reply($request$email$translator'REPLYALL');
  405.     }
  406.     /**
  407.      * @Route("/edit/{email}", defaults={"email" = null}, name="email_edit")
  408.      * @param Request $request
  409.      * @param CandidatRepository $candidatRepository
  410.      * @param CorrespondantService $correspondantService
  411.      * @param EmailService $emailService
  412.      * @param Email|null $email
  413.      * @return Response
  414.      */
  415.     public function edit(
  416.         Request              $request,
  417.         CandidatRepository   $candidatRepository,
  418.         CorrespondantService $correspondantService,
  419.         EmailService         $emailService,
  420.         Email                $email null
  421.     ): Response
  422.     {
  423.         $user $this->getUser();
  424.         $currentDateTime = new \DateTime();
  425.         $candidat $candidatRepository->find($user->getId());
  426.         $destinatairesPotentiels $correspondantService->getDestinatairesPotentiels($candidat->getCorrespondant());
  427.         if ($email) {
  428.             $email->setLastStatusAt($currentDateTime);
  429.         }
  430.         $form $this->createForm(
  431.             EmailType::class,
  432.             $email,
  433.             ['data' =>
  434.                 ['destinatairesPotentiels' => $destinatairesPotentiels'email' => $email'action' => 'EDIT',],
  435.                 'data_class' => null]
  436.         );
  437.         $form->handleRequest($request);
  438.         if ($form->isSubmitted() && $form->isValid()) {
  439.             if (!$email) {
  440.                 $email = new Email();
  441.             }
  442.             $response $this->emailService->editEmail($email$form$currentDateTime$request$candidat$user);
  443.             return is_string($response) ? $this->redirect($response) : $response;
  444.         }
  445.         $folder = new Folder();
  446.         $formFolder $this->createForm(FolderType::class, $folder);
  447.         $folders $this->folderRepository->findBy(['candidat' => $candidat], ['name' => 'asc']);
  448.         $allCounters $emailService->getCounters();
  449.         return $this->render('email/edit.html.twig', [
  450.             'destinatairesPotentiels' => $destinatairesPotentiels,
  451.             'form' => $form->createView(),
  452.             'formfolder' => $formFolder->createView(),
  453.             'folders' => $folders,
  454.             'email' => $email,
  455.             'allCounters' => $allCounters,
  456.             'automaticDraftId' => null,
  457.             'active_menu' => strtolower(($email === null || $email->getStatus() === null) ? "INBOX" $email->getStatus())
  458.         ]);
  459.     }
  460.     /**
  461.      * @Route("/add/{emailModele}", name="email_add")
  462.      * @param Request $request
  463.      * @param EmailModele $emailModele
  464.      * @return JsonResponse
  465.      */
  466.     public function addEmail(Request $requestEmailModele $emailModele)
  467.     {
  468.         $user $this->getUser();
  469.         $candidat $this->candidatRepository->find($user->getId());
  470.         $email $this->emailRepository->findBy(['candidat' => $candidat'emailModele' => $emailModele]);
  471.         // on ne rajoute le mail que si il n'existe pas dans le cas où on essaaie de l'ajouter
  472.         // pour une raison ou une autre. Application ouverte dans 2 fenêtres différentes ou
  473.         // onglets différents.
  474.         if (!$email) {
  475.             $email $this->candidatService->addEmailToCandidat($candidat$emailModele);
  476.         } else {
  477.             $email null;
  478.         }
  479.         return new JsonResponse(['status' => '200''data' => $email], 200);
  480.     }
  481.     /**
  482.      * @Route("/{in}", name="mail_inbox", defaults={"in"="inbox"})
  483.      * @param string $in
  484.      * @param EmailService $emailService
  485.      * @param FolderRepository $folderRepository
  486.      * @return Response
  487.      */
  488.     public function inbox(
  489.         string              $in,
  490.         EmailService        $emailService,
  491.         TranslatorInterface $translator
  492.     ): Response
  493.     {
  494.         $user $this->getUser();
  495.         $in strtoupper($in);
  496.         $candidat $this->candidatRepository->find($user->getId());
  497.         $jeu $candidat->getProject()->getJeu();
  498.         if ($jeu->getSocietes()->count() === || $jeu->getCorrespondantsCounter() === || $jeu->isValid() === false || $jeu->getEmailModeles()->count() === 0) {
  499.             return $this->redirectToRoute('saml_logout');
  500.         }
  501.         $emailsIn $emailService->getEmails($in);
  502.         $allCounters $emailService->getCounters();
  503.         switch ($in) {
  504.             case 'INBOX':
  505.                 $title $translator->trans('title.inbox');
  506.                 break;
  507.             case 'SENT':
  508.                 $title $translator->trans('title.sent');
  509.                 break;
  510.             case 'DRAFTS':
  511.                 $title $translator->trans('title.drafts');
  512.                 break;
  513.             case 'ARCHIVED':
  514.                 $title $translator->trans('title.archived');
  515.                 break;
  516.             case 'TRASH':
  517.                 $title $translator->trans('title.trash');
  518.                 break;
  519.             case 'DELETE':
  520.                 $title $translator->trans('title.delete');
  521.                 break;
  522.             default:
  523.                 $title 'Not implemented';
  524.                 break;
  525.         }
  526.         $folder = new Folder();
  527.         $formFolder $this->createForm(FolderType::class, $folder);
  528.         $folders $this->folderRepository->findBy(['candidat' => $candidat], ['name' => 'asc']);
  529.         return $this->render('email/in.html.twig', [
  530.             'in' => $in,
  531.             'emailsIn' => $emailsIn,
  532.             'allCounters' => $allCounters,
  533.             'formfolder' => $formFolder->createView(),
  534.             'folders' => $folders,
  535.             'title' => $title,
  536.             'active_menu' => strtolower($in),
  537.         ]);
  538.     }
  539.     /**
  540.      * @Route("/{in}", name="ajx_mail_inbox", defaults={"in"="inbox"})
  541.      * @param string $in
  542.      * @param EmailService $emailService
  543.      * @param CandidatRepository $candidatRepository
  544.      * @return Response
  545.      */
  546.     public function ajxInbox(string $inEmailService $emailServiceCandidatRepository $candidatRepository): Response
  547.     {
  548.         $in strtoupper($in);
  549.         $user $this->getUser();
  550.         $candidat $candidatRepository->find($user);
  551.         $emailsIn $emailService->getEmails($candidat$in);
  552.         return $this->json($emailsIn);
  553.     }
  554. }