src/Controller/CommunicationController.php line 164

Open in your IDE?
  1. <?php
  2. namespace App\Controller;
  3. use App\Datatable\CommunicationDesabonnementTable;
  4. use App\Datatable\MailingCommunicationTable;
  5. use App\Entity\AccountingFirm;
  6. use App\Entity\CommunicationDesabonnement;
  7. use App\Entity\CommunicationImage;
  8. use App\Entity\MailingCommunication;
  9. use App\Entity\MailingTask;
  10. use App\Form\CommunicationCampaignAccountingFirmsType;
  11. use App\Form\CommunicationCampaignDateType;
  12. use App\Form\CommunicationCampaignFiltersType;
  13. use App\Form\CommunicationCampaignMailType;
  14. use App\Form\CommunicationCampaignNameType;
  15. use App\Message\MailingProcessMessage;
  16. use App\Repository\AccountingFirmRepository;
  17. use App\Repository\CommunicationDesabonnementRepository;
  18. use App\Repository\MailingCommunicationRepository;
  19. use App\Repository\ModuleTypeRepository;
  20. use App\Repository\ModuleTypeValueRepository;
  21. use App\Services\Mailing;
  22. use App\Services\SellsyService;
  23. use DateTimeZone;
  24. use Doctrine\ORM\EntityManagerInterface;
  25. use Psr\Cache\CacheItemPoolInterface;
  26. use Qferrer\Mjml\Twig\MjmlExtension;
  27. use Sensio\Bundle\FrameworkExtraBundle\Configuration\IsGranted;
  28. use Symfony\Bundle\FrameworkBundle\Controller\AbstractController;
  29. use Symfony\Component\DependencyInjection\ParameterBag\ParameterBagInterface;
  30. use Symfony\Component\HttpFoundation\File\UploadedFile;
  31. use Symfony\Component\HttpFoundation\Request;
  32. use Symfony\Component\HttpFoundation\RequestStack;
  33. use Symfony\Component\HttpFoundation\Response;
  34. use Symfony\Component\HttpKernel\KernelInterface;
  35. use Symfony\Component\Messenger\MessageBusInterface;
  36. use Symfony\Component\Routing\Annotation\Route;
  37. use Symfony\Component\Routing\Generator\UrlGeneratorInterface;
  38. use Symfony\Component\Serializer\SerializerInterface;
  39. use Vich\UploaderBundle\Storage\StorageInterface;
  40. use Vich\UploaderBundle\Templating\Helper\UploaderHelper;
  41. class CommunicationController extends AbstractController
  42. {
  43.     protected $sellsyService;
  44.     protected $messageBus;
  45.     public function __construct(ParameterBagInterface $parameterBagEntityManagerInterface $emMessageBusInterface $messageBusSellsyService $sellsyService)
  46.     {
  47.         $this->sellsyService $sellsyService;
  48.         $this->messageBus $messageBus;
  49.     }
  50.     #[Route('/communication/update-types'name'app_communication_update_types')]
  51.     #[IsGranted('ROLE_ADMIN')]
  52.     public function updateTypes()
  53.     {
  54.         $this->sellsyService->getCustomFields();
  55.         $this->addFlash('success''Les filtres ont été mis à jour depuis Sellsy');
  56.         return $this->redirectToRoute("communication_campagnes");
  57.     }
  58.     #[Route('/communication/update-all-accountingfirm/{id}'name'app_communication_update_all_accoutingfirm'defaults: ['id' => null])]
  59.     #[IsGranted('ROLE_ADMIN')]
  60.     public function updateAllAccountingFirm(int $id): \Symfony\Component\HttpFoundation\RedirectResponse
  61.     {
  62.         $this->sellsyService->synchroModuleSellsyAllAccountingFirm();
  63.         $this->addFlash('success''Les modules des cabinets ont été mis à jour depuis Sellsy');
  64.         if ($id != null) {
  65.             return $this->redirectToRoute("communication_campagnes_create_filters", ['id' => $id]);
  66.         }
  67.         return $this->redirectToRoute("communication_campagnes");
  68.     }
  69.     #[Route('/communication/update-one-accountingfirm/{id}'name'app_communication_update_one_accoutingfirm')]
  70.     #[IsGranted('ROLE_ADMIN')]
  71.     public function updateOneAccountingFirm(AccountingFirm $accountingFirm)
  72.     {
  73.         $this->sellsyService->synchroModuleSellsyOneAccountingFirm($accountingFirm);
  74.         $this->addFlash('success''Les modules du cabinet '$accountingFirm->getName() .' ont été mis à jour depuis Sellsy');
  75.         return $this->redirectToRoute("communication_campagnes");
  76.     }
  77.     #[Route('/communication/search/{idSellsy}'name'app_communication_search')]
  78.     #[IsGranted('ROLE_ADMIN')]
  79.     public function searchAccountingFirm(Int $idSellsyModuleTypeRepository $moduleTypeRepository): Response
  80.     {
  81.         $moduleType $moduleTypeRepository->findBy(['idSellsy' => $idSellsy])[0];
  82.         $this->sellsyService->searchAccountingFirmByCustomField([['id' => $moduleType->getId()]]);
  83.         return $this->render('communication/index.html.twig', [
  84.             'controller_name' => 'CommunicationController',
  85.         ]);
  86.     }
  87.     #[Route(path'/communication/desabonnement/listing'name'communication_desabonnement_list'methods: ['GET''POST'])]
  88.     #[IsGranted('ROLE_ADMIN')]
  89.     public function desabonnementList(Request $requestCommunicationDesabonnementTable $datatable): Response
  90.     {
  91.         $table $datatable->buildTable();
  92.         $table->handleRequest($request);
  93.         if ($table->isCallback()) {
  94.             return $table->getResponse();
  95.         }
  96.         return $this->render('communication_desabonnement/index.html.twig', [
  97.             'datatable' => $table
  98.         ]);
  99.     }
  100.     #[Route(path'/communication/desabonnement/delete/{id}'name'communication_desabonnement_delete'methods: ['POST'])]
  101.     #[IsGranted('ROLE_ADMIN')]
  102.     public function delete(Request $requestCommunicationDesabonnement $communicationDesabonnement): Response
  103.     {
  104.         if ($this->isCsrfTokenValid('delete' $communicationDesabonnement->getId(), $request->request->get('_token'))) {
  105.             $entityManager $this->getDoctrine()->getManager();
  106.             $entityManager->remove($communicationDesabonnement);
  107.             $entityManager->flush();
  108.         }
  109.         return $this->redirectToRoute('communication_desabonnement_list');
  110.     }
  111.     #[Route(path'/communication/campagnes/'name'communication_campagnes')]
  112.     #[IsGranted('ROLE_ADMIN')]
  113.     public function campagnes(Request $requestMailingCommunicationTable $mailingCommunicationTable): Response
  114.     {
  115.         $table $mailingCommunicationTable->buildTable();
  116.         $table->handleRequest($request);
  117.         if ($table->isCallback()) {
  118.             return $table->getResponse();
  119.         }
  120.         return $this->render('communication/index.html.twig', [
  121.             'datatable' => $table
  122.         ]);
  123.     }
  124.     #[Route(path'/communication/delete/{id}'name'communication_delete'methods: ['POST'])]
  125.     #[IsGranted('ROLE_ADMIN')]
  126.     public function deleteCampaign(Request $requestMailingCommunication $mailingCommunication): Response
  127.     {
  128.         if ($this->isCsrfTokenValid('delete' $mailingCommunication->getId(), $request->request->get('_token'))) {
  129.             $entityManager $this->getDoctrine()->getManager();
  130.             $tasks $mailingCommunication->getMailingTasks();
  131.             foreach ($tasks as $task) {
  132.                 $task->setMailingCommunication(null);
  133.                 $entityManager->persist($task);
  134.             }
  135.             $entityManager->remove($mailingCommunication);
  136.             $entityManager->flush();
  137.         }
  138.         return $this->redirectToRoute('communication_campagnes');
  139.     }
  140.     #[Route(path'/communication/campagnes/create/name/{id}'name'communication_campagnes_create_name'defaults: ['id' => null] )]
  141.     #[IsGranted('ROLE_ADMIN')]
  142.     public function campagnesCreateName(Request $requestEntityManagerInterface $em, ?int $id nullMailingCommunicationRepository $mailingCommunicationRepository): Response
  143.     {
  144.         $campaign null;
  145.         if ($id != null) {
  146.             $campaign $mailingCommunicationRepository->findOneBy(['id' => $id]);
  147.         }
  148.         if (!$campaign) {
  149.             $campaign = new MailingCommunication;
  150.         }
  151.         $form $this->createForm(CommunicationCampaignNameType::class, $campaign, [
  152.             'user' => $this->getUser()
  153.         ]);
  154.         $form->handleRequest($request);
  155.         if ($form->isSubmitted() && $form->isValid()) {
  156.             $campaign->setStatus("ON_CREATE");
  157.             $em->persist($campaign);
  158.             $em->flush();
  159.             return $this->redirectToRoute('communication_campagnes_create_filters', ['id' => $campaign->getId()]);
  160.         }
  161.         return $this->render('communication/create_campaign_name.html.twig', [
  162.             'form' => $form->createView()
  163.         ]);
  164.     }
  165.     #[Route(path'/communication/campagnes/create/filters/{id}'name'communication_campagnes_create_filters' )]
  166.     #[IsGranted('ROLE_ADMIN')]
  167.     public function campagnesCreateSelectFilters(Request $requestEntityManagerInterface $emint $idMailingCommunicationRepository $mailingCommunicationRepositoryModuleTypeRepository $moduleTypeRepository): Response
  168.     {
  169.         if ($id == null) {
  170.             $this->addFlash('error''Aucune campagne n\'a été trouvé.');
  171.             return $this->redirectToRoute("communication_campagnes");
  172.         }
  173.         $campaign $mailingCommunicationRepository->findOneBy(['id' => $id]);
  174.         if ($campaign == null) {
  175.             $this->addFlash('error''Aucune campagne n\'a été trouvé avec cet identifiant.');
  176.             return $this->redirectToRoute("communication_campagnes");
  177.         }
  178.         $widgets $moduleTypeRepository->findBy(['parentName' => "Widgets"]);
  179.         $modules $moduleTypeRepository->findBy(['parentName' => "Modules"]);
  180.         $services $moduleTypeRepository->findBy(['parentName' => "Services"]);
  181.         $cabinetAge $moduleTypeRepository->findBy(['parentName' => "L'âge du cabinet"]);
  182.         $partenariat $moduleTypeRepository->findBy(['parentName' => "Partenariats"]);
  183.         $acquisition $moduleTypeRepository->findBy(['parentName' => "Acquisition"]);
  184.         $others = [];
  185.         //Offre
  186.         $others[] = $moduleTypeRepository->findOneBy(['idSellsy' => 3858901]);
  187.         //Date de création
  188.         $others[] = $moduleTypeRepository->findOneBy(['idSellsy' => 125538]);
  189.         // tout les cabinets de lagence
  190.         $others[] = $moduleTypeRepository->findOneBy(['idSellsy' => 3412593]);
  191.         // sites interne
  192.         $others[] = $moduleTypeRepository->findOneBy(['idSellsy' => 4008187]);
  193.         // sites externe
  194.         $others[] = $moduleTypeRepository->findOneBy(['idSellsy' => 4008188]);
  195.         // tutoiement
  196.         $others[] = $moduleTypeRepository->findOneBy(['idSellsy' => 275413]);
  197.         $form $this->createForm(CommunicationCampaignFiltersType::class, $campaign);
  198.         $form->handleRequest($request);
  199.         if ($form->isSubmitted() && $form->isValid()) {
  200.             $filtersJson $form->get('filtersJson')->getData();
  201.             $filtersArray json_decode($filtersJsontrue);
  202.             $campaign->setFilters($filtersArray);
  203.             $em->persist($campaign);
  204.             $em->flush();
  205.             return $this->redirectToRoute('communication_campagnes_create_accounting_firm', ['id' => $campaign->getId()]);
  206.         }
  207.         return $this->render('communication/select.html.twig', [
  208.             'widgets' => $widgets,
  209.             'modules' => $modules,
  210.             'services' => $services,
  211.             'cabinetAge' => $cabinetAge,
  212.             'partenariats' => $partenariat,
  213.             'acquisitions' => $acquisition,
  214.             'others' => $others,
  215.             'form' => $form->createView(),
  216.             'campaign' => $campaign,
  217.         ]);
  218.     }
  219.     #[Route(path'/communication/campagnes/create/accounting-firms/{id}'name'communication_campagnes_create_accounting_firm' )]
  220.     #[IsGranted('ROLE_ADMIN')]
  221.     public function campagnesCreateSelectAccountingFirms(Request $requestEntityManagerInterface $emint $idMailingCommunicationRepository $mailingCommunicationRepositoryCommunicationDesabonnementRepository $communicationDesabonnementRepository): Response
  222.     {
  223.         if ($id == null) {
  224.             $this->addFlash('error''Aucune campagne n\'a été trouvé.');
  225.             return $this->redirectToRoute("communication_campagnes");
  226.         }
  227.         $campaign $mailingCommunicationRepository->findOneBy(['id' => $id]);
  228.         if ($campaign == null) {
  229.             $this->addFlash('error''Aucune campagne n\'a été trouvé avec cet identifiant.');
  230.             return $this->redirectToRoute("communication_campagnes");
  231.         }
  232.         //récupération des cabinets répondants aux critères
  233.         $accountingFirms $this->sellsyService->getAccountingFirmFromFilters($campaign->getFilters());
  234.         // on enlève les cabinets qui se sont désabonnées
  235.         $desabonnements $communicationDesabonnementRepository->findAll();
  236.         $desabonnementsEmails array_map(function($desabonnement) {
  237.             return $desabonnement->getEmail();
  238.         }, $desabonnements);
  239.         $form $this->createForm(CommunicationCampaignAccountingFirmsType::class, $campaign);
  240.         $form->handleRequest($request);
  241.         if ($form->isSubmitted() && $form->isValid()) {
  242.             $WithAccountingFirmJson $form->get('accountingFirmsSelectedJson')->getData();
  243.             $WithoutAccountingFirmJson $form->get('accountingFirmsUnselectedJson')->getData();
  244.             $WithAccountingFirmArray json_decode($WithAccountingFirmJsontrue);
  245.             $WithoutAccountingFirmArray json_decode($WithoutAccountingFirmJsontrue);
  246.             $campaign->setIdsAccountingFirmSelected($WithAccountingFirmArray);
  247.             $campaign->setIdsAccountingFirmUnselected($WithoutAccountingFirmArray);
  248.             $em->persist($campaign);
  249.             $em->flush();
  250.             return $this->redirectToRoute('communication_campagnes_create_mail_editor', ['id' => $campaign->getId()]);
  251.         }
  252.         return $this->render('communication/selectAccountingFirms.html.twig', [
  253.             'accountingFirms' => $accountingFirms,
  254.             'desabonnements' => $desabonnementsEmails,
  255.             'form' => $form->createView(),
  256.             'campaign' => $campaign
  257.         ]);
  258.     }
  259.     #[Route(path'/communication/campagnes/create/mail-editor/{id}'name'communication_campagnes_create_mail_editor' )]
  260.     #[IsGranted('ROLE_ADMIN')]
  261.     public function campagnesCreateMailEditor(Request $requestEntityManagerInterface $emint $idMailingCommunicationRepository $mailingCommunicationRepositoryKernelInterface $kernelStorageInterface $vichStorageAccountingFirmRepository $accountingFirmRepository): Response
  262.     {
  263.         if ($id == null) {
  264.             $this->addFlash('error''Aucune campagne n\'a été trouvé.');
  265.             return $this->redirectToRoute("communication_campagnes");
  266.         }
  267.         $campaign $mailingCommunicationRepository->findOneBy(['id' => $id]);
  268.         if ($campaign == null) {
  269.             $this->addFlash('error''Aucune campagne n\'a été trouvé avec cet identifiant.');
  270.             return $this->redirectToRoute("communication_campagnes");
  271.         }
  272.         if ($kernel->getEnvironment() == 'dev') {
  273.             $mediaViewerUrl "https://actucontent.loc:8000/";
  274.             // $mediaViewerUrl = "https://actucontent.lagence.expert/";
  275.         } else {
  276.             $mediaViewerUrl "https://actucontent.lagence.expert/";
  277.         }
  278.         $accountingFirm $this->getUser()->getAccountingFirm();
  279.         $filePath $vichStorage->resolvePath($accountingFirm'tmpMailingHeader');
  280.         $base64Img null;
  281.         if (file_exists($filePath)) {
  282.             $mimeType mime_content_type($filePath);
  283.             $fileContent file_get_contents($filePath);
  284.             $base64Img 'data:' $mimeType ';base64,' base64_encode($fileContent);
  285.         }
  286.         $accountingFirmJson null;
  287.         if ($accountingFirm) {
  288.             $accountingFirmTmp $accountingFirmRepository->findOneBy(['id' => $accountingFirm->getId()]);
  289.             // Nettoyage des valeurs pour éviter les problèmes de JSON
  290.             $address trim(preg_replace('/\s+/'' '$accountingFirmTmp->getAddress() . " " $accountingFirmTmp->getZipCode() . " " $accountingFirmTmp->getCity()));
  291.             $url trim($accountingFirmTmp->getUrl());
  292.             $phone trim(preg_replace('/\s+/'' '$accountingFirmTmp->getPhone()));
  293.             $accountingFirmArray = [
  294.                 'id' => $accountingFirmTmp->getId(),
  295.                 'name' => trim($accountingFirmTmp->getName()),
  296.                 'logo' => $base64Img,
  297.                 'address' => $address,
  298.                 'email' => trim($accountingFirmTmp->getEmail()),
  299.                 'phone' => $phone,
  300.                 'site' => $url,
  301.             ];
  302.             $accountingFirmJson json_encode($accountingFirmArrayJSON_HEX_QUOT JSON_HEX_TAG JSON_HEX_AMP JSON_HEX_APOS JSON_UNESCAPED_UNICODE);
  303.             $accountingFirmJson base64_encode($accountingFirmJson);
  304.         }
  305.         $form $this->createForm(CommunicationCampaignMailType::class, $campaign);
  306.         $form->handleRequest($request);
  307.         if ($form->isSubmitted() && $form->isValid()) {
  308.             $mjmlStructure json_decode($form->get('mjmlStructure')->getData(), true);
  309.             $tmpMjmlStructure $mjmlStructure;
  310.             foreach ($mjmlStructure as $key => $part) {
  311.                 if ($part['type'] == 'image' && strpos($part['data']['image'], 'data:image') === 0) {
  312.                     $base64Image $part['data']['image']; // Récupérer la partie base64 de l'image
  313.                     $imageData base64_decode(preg_replace('#^data:image/\w+;base64,#i'''$base64Image)); // Suppri mer le préfixe et décoder la base64
  314.                     $imageName uniqid() . '.png'// Générer un nom de fichier unique
  315.                     $destinationPath 'images/communication/' $imageName// Spécifier le chemin de destination pour sauvegarder l'image
  316.                     // Enregistrer les données binaires dans un fichier sur le serveur
  317.                     if (file_put_contents($destinationPath$imageData)) {
  318.                         $tmpMjmlStructure[$key]['data']['image'] = $destinationPath;
  319.                     }
  320.                 }
  321.             }
  322.             $mjmlStructure $tmpMjmlStructure;
  323.             $campaign->setmjmlStructure($mjmlStructure);
  324.             $em->persist($campaign);
  325.             $em->flush();
  326.             return $this->redirectToRoute('communication_campagnes_create_sending_options', ['id' => $campaign->getId()]);
  327.         }
  328.         return $this->render('communication/create_mail.html.twig', [
  329.             'form' => $form->createView(),
  330.             'campaign' => $campaign,
  331.             'mediaViewerUrl' => $mediaViewerUrl,
  332.             'accountingFirmJson' => $accountingFirmJson,
  333.         ]);
  334.     }
  335.     #[Route(path'/communication/campagnes/create/sending-options/{id}'name'communication_campagnes_create_sending_options' )]
  336.     #[IsGranted('ROLE_ADMIN')]
  337.     public function campagnesCreateSendingOptions(Request $requestEntityManagerInterface $emint $idMailingCommunicationRepository $mailingCommunicationRepositoryAccountingFirmRepository $accountingFirmRepository): Response
  338.     {
  339.         if ($id == null) {
  340.             $this->addFlash('error''Aucune campagne n\'a été trouvé.');
  341.             return $this->redirectToRoute("communication_campagnes");
  342.         }
  343.         $campaign $mailingCommunicationRepository->findOneBy(['id' => $id]);
  344.         if ($campaign == null) {
  345.             $this->addFlash('error''Aucune campagne n\'a été trouvé avec cet identifiant.');
  346.             return $this->redirectToRoute("communication_campagnes");
  347.         }
  348.         $accountingFirms $accountingFirmRepository->findBy(['id' => $campaign->getIdsAccountingFirmSelected()]);
  349.         $accountingFirmsArray = [];
  350.         foreach ($accountingFirms as $accountingFirm) {
  351.             $tmp = [];
  352.             $tmp['name'] = $accountingFirm->getName();
  353.             $admins   = [];
  354.             $partners = [];
  355.             foreach ($accountingFirm->getUsers() as $user) {
  356.                 $roles $user->getRoles();
  357.                 if (in_array('ROLE_ADMIN_FIRM'$rolestrue)) {
  358.                     $admins[] = $user;
  359.                 } elseif (in_array('ROLE_FIRM_PARTNER'$rolestrue)) {
  360.                     $partners[] = $user;
  361.                 }
  362.             }
  363.             // Priorité : admin cabinet, sinon associé, sinon null
  364.             $targetUser $admins[0] ?? $partners[0] ?? null;
  365.             $tmp['email'] = $targetUser $targetUser->getEmail() : null;
  366.             $accountingFirmsArray[] = $tmp;
  367.         }
  368.         $form $this->createForm(CommunicationCampaignDateType::class, $campaign);
  369.         $form->handleRequest($request);
  370.         if ($form->isSubmitted() && $form->isValid()) {
  371.             $campaign->setStatus("PROGRAMMED");
  372.             $em->persist($campaign);
  373.             $em->flush();
  374.             $dateDisplay $campaign->getSendDate()->format('d/m/Y');
  375.             $this->addFlash('successSendCommunication'"Votre campagne a bien été programmée, elle sera envoyée le "$dateDisplay .".");
  376.             return $this->redirectToRoute('communication_campagnes');
  377.         }
  378.         return $this->render('communication/finalisation.html.twig', [
  379.             'form' => $form->createView(),
  380.             'campaign' => $campaign,
  381.             'accountingFirms' => $accountingFirmsArray
  382.         ]);
  383.     }
  384.     #[Route(path'/communication/campagnes/create/sending-now/{id}'name'communication_campagnes_create_sending_now' )]
  385.     #[IsGranted('ROLE_ADMIN')]
  386.     public function campagnesCreateSendingNow(Request $requestEntityManagerInterface $emint $idMailingCommunicationRepository $mailingCommunicationRepositoryAccountingFirmRepository $accountingFirmRepositoryMailing $mailingService): Response
  387.     {
  388.         if ($id == null) {
  389.             $this->addFlash('error''Aucune campagne n\'a été trouvé.');
  390.             return $this->redirectToRoute("communication_campagnes");
  391.         }
  392.         $campaign $mailingCommunicationRepository->findOneBy(['id' => $id]);
  393.         if ($campaign == null) {
  394.             $this->addFlash('error''Aucune campagne n\'a été trouvé avec cet identifiant.');
  395.             return $this->redirectToRoute("communication_campagnes");
  396.         }
  397.         $dateSend = new \DateTime();
  398.         $dateSend->setTimezone(new DateTimeZone('Europe/Paris'));
  399.         $dateSend->setTime($dateSend->format('H') + 100);
  400.         $campaign->setSendDate($dateSend);
  401.         $campaign->setStatus("PROGRAMMED");
  402.         $em->persist($campaign);
  403.         $cabinet $accountingFirmRepository->findBy(['id' => 2])[0];
  404.         $task = new MailingTask();
  405.         $task->setAccountingFirm($cabinet);
  406.         $task->setType("COMMUNICATION");
  407.         $task->setStatus("PENDING");
  408.         $task->setMailingCommunication($campaign);
  409.         $em->persist($task);
  410.         $em->flush();
  411.         $mailingService->createMailingLog($task"Initialisation de l'envoi.""INIT");
  412.         $this->messageBus->dispatch(new MailingProcessMessage(intval($task->getId())));
  413.         $this->addFlash('successSendCommunication'"Votre campagne a bien été ajoutée à la file d'attente, elle sera envoyée dès que possible.");
  414.         return $this->redirectToRoute('communication_campagnes');
  415.     }
  416.     #[Route(path'/communication/campagnes/duplicate/{id}'name'communication_campagnes_duplicate' )]
  417.     #[IsGranted('ROLE_ADMIN')]
  418.     public function campagnesDuplicate(Request $requestEntityManagerInterface $emint $idMailingCommunicationRepository $mailingCommunicationRepository): Response
  419.     {
  420.         $campaign null;
  421.         if ($id != null) {
  422.             $campaign $mailingCommunicationRepository->findOneBy(['id' => $id]);
  423.         }
  424.         if ($campaign == null) {
  425.             $this->addFlash('error''Aucune campagne n\'a été trouvé avec cet identifiant.');
  426.             return $this->redirectToRoute("communication_campagnes");
  427.         }
  428.         $newCampain = new MailingCommunication;
  429.         $newCampain->setCampaignName($campaign->getCampaignName())
  430.                     ->setCategory($campaign->getCategory())
  431.                    ->setFilters($campaign->getFilters())
  432.                    ->setIdsAccountingFirmSelected($campaign->getIdsAccountingFirmSelected())
  433.                    ->setIdsAccountingFirmUnselected($campaign->getIdsAccountingFirmUnselected())
  434.                    ->setObjectMail($campaign->getObjectMail())
  435.                    ->setMjmlStructure($campaign->getMjmlStructure())
  436.                    ->setStatus("ON_CREATE");
  437.         $em->persist($newCampain);
  438.         $em->flush();
  439.        return $this->redirectToRoute('communication_campagnes_create_name', ['id' => $newCampain->getId()]);
  440.     }
  441.     #[Route(path'/communication/campagnes/continue/{id}'name'communication_campagnes_continue' )]
  442.     #[IsGranted('ROLE_ADMIN')]
  443.     public function campagnesContinue(Request $requestEntityManagerInterface $emint $idMailingCommunicationRepository $mailingCommunicationRepository): Response
  444.     {
  445.         $campaign null;
  446.         if ($id != null) {
  447.             $campaign $mailingCommunicationRepository->findOneBy(['id' => $id]);
  448.         }
  449.         if ($campaign == null) {
  450.             $this->addFlash('error''Aucune campagne n\'a été trouvé avec cet identifiant.');
  451.             return $this->redirectToRoute("communication_campagnes");
  452.         }
  453.         if ($campaign->getSendDate() == null && $campaign->getmjmlStructure() != null) {
  454.             return $this->redirectToRoute("communication_campagnes_create_sending_options", ['id' => $campaign->getId()]);
  455.         } elseif ($campaign->getmjmlStructure() == null && $campaign->getIdsAccountingFirmSelected() != null) {
  456.             return $this->redirectToRoute("communication_campagnes_create_mail_editor", ['id' => $campaign->getId()]);
  457.         } elseif ($campaign->getIdsAccountingFirmSelected() == null && $campaign->getFilters() != null) {
  458.             return $this->redirectToRoute("communication_campagnes_create_accounting_firm", ['id' => $campaign->getId()]);
  459.         } elseif ($campaign->getFilters() == null && $campaign->getCampaignName() != null) {
  460.             return $this->redirectToRoute("communication_campagnes_create_filters", ['id' => $campaign->getId()]);
  461.         }
  462.         return $this->redirectToRoute("communication_campagnes_create_name", ['id' => $campaign->getId()]);
  463.     }
  464.     #[Route(path'/communication/campagnes/preview/{id}'name'communication_campagnes_preview' )]
  465.     #[IsGranted('ROLE_ADMIN')]
  466.     public function campagnesPreview(int $idMailingCommunicationRepository $mailingCommunicationRepositoryMjmlExtension $mjmlRendererAccountingFirmRepository $accountingFirmRepository): Response
  467.     {
  468.         $campaign null;
  469.         if ($id != null) {
  470.             $campaign $mailingCommunicationRepository->findOneBy(['id' => $id]);
  471.         }
  472.         if ($campaign == null) {
  473.             $this->addFlash('error''Aucune campagne n\'a été trouvé avec cet identifiant.');
  474.             return $this->redirectToRoute("communication_campagnes");
  475.         }
  476.         $mjmlStructure $campaign->getmjmlStructure();
  477.         $mediaViewerUrl "https://actucontent.loc:8000/";
  478.         if ($this->getParameter('kernel.environment') === 'prod') {
  479.           $mediaViewerUrl "https://actucontent.lagence.expert/";
  480.         }
  481.         $render_data = [
  482.           'mjmlCode' => $mjmlStructure,
  483.           'cabinet' => $accountingFirmRepository->findBy(['id' => 2])[0],
  484.           'serverUrl' => $mediaViewerUrl
  485.         ];
  486.       return new Response($mjmlRenderer->render($this->render('mjml/communication/communication.mjml'$render_data)));
  487.     }
  488. }