src/Controller/CommunicationController.php line 163

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.         $form->handleRequest($request);
  153.         if ($form->isSubmitted() && $form->isValid()) {
  154.             $campaign->setStatus("ON_CREATE");
  155.             $em->persist($campaign);
  156.             $em->flush();
  157.             return $this->redirectToRoute('communication_campagnes_create_filters', ['id' => $campaign->getId()]);
  158.         }
  159.         return $this->render('communication/create_campaign_name.html.twig', [
  160.             'form' => $form->createView()
  161.         ]);
  162.     }
  163.     #[Route(path'/communication/campagnes/create/filters/{id}'name'communication_campagnes_create_filters' )]
  164.     #[IsGranted('ROLE_ADMIN')]
  165.     public function campagnesCreateSelectFilters(Request $requestEntityManagerInterface $emint $idMailingCommunicationRepository $mailingCommunicationRepositoryModuleTypeRepository $moduleTypeRepository): Response
  166.     {
  167.         if ($id == null) {
  168.             $this->addFlash('error''Aucune campagne n\'a été trouvé.');
  169.             return $this->redirectToRoute("communication_campagnes");
  170.         }
  171.         $campaign $mailingCommunicationRepository->findOneBy(['id' => $id]);
  172.         if ($campaign == null) {
  173.             $this->addFlash('error''Aucune campagne n\'a été trouvé avec cet identifiant.');
  174.             return $this->redirectToRoute("communication_campagnes");
  175.         }
  176.         $widgets $moduleTypeRepository->findBy(['parentName' => "Widgets"]);
  177.         $modules $moduleTypeRepository->findBy(['parentName' => "Modules"]);
  178.         $services $moduleTypeRepository->findBy(['parentName' => "Services"]);
  179.         $cabinetAge $moduleTypeRepository->findBy(['parentName' => "L'âge du cabinet"]);
  180.         $partenariat $moduleTypeRepository->findBy(['parentName' => "Partenariats"]);
  181.         $acquisition $moduleTypeRepository->findBy(['parentName' => "Acquisition"]);
  182.         $others = [];
  183.         //Offre
  184.         $others[] = $moduleTypeRepository->findOneBy(['idSellsy' => 3858901]);
  185.         //Date de création
  186.         $others[] = $moduleTypeRepository->findOneBy(['idSellsy' => 125538]);
  187.         // tout les cabinets de lagence
  188.         $others[] = $moduleTypeRepository->findOneBy(['idSellsy' => 3412593]);
  189.         // sites interne
  190.         $others[] = $moduleTypeRepository->findOneBy(['idSellsy' => 4008187]);
  191.         // sites externe
  192.         $others[] = $moduleTypeRepository->findOneBy(['idSellsy' => 4008188]);
  193.         // tutoiement
  194.         $others[] = $moduleTypeRepository->findOneBy(['idSellsy' => 275413]);
  195.         $form $this->createForm(CommunicationCampaignFiltersType::class, $campaign);
  196.         $form->handleRequest($request);
  197.         if ($form->isSubmitted() && $form->isValid()) {
  198.             $filtersJson $form->get('filtersJson')->getData();
  199.             $filtersArray json_decode($filtersJsontrue);
  200.             $campaign->setFilters($filtersArray);
  201.             $em->persist($campaign);
  202.             $em->flush();
  203.             return $this->redirectToRoute('communication_campagnes_create_accounting_firm', ['id' => $campaign->getId()]);
  204.         }
  205.         return $this->render('communication/select.html.twig', [
  206.             'widgets' => $widgets,
  207.             'modules' => $modules,
  208.             'services' => $services,
  209.             'cabinetAge' => $cabinetAge,
  210.             'partenariats' => $partenariat,
  211.             'acquisitions' => $acquisition,
  212.             'others' => $others,
  213.             'form' => $form->createView(),
  214.             'campaign' => $campaign,
  215.         ]);
  216.     }
  217.     #[Route(path'/communication/campagnes/create/accounting-firms/{id}'name'communication_campagnes_create_accounting_firm' )]
  218.     #[IsGranted('ROLE_ADMIN')]
  219.     public function campagnesCreateSelectAccountingFirms(Request $requestEntityManagerInterface $emint $idMailingCommunicationRepository $mailingCommunicationRepositoryCommunicationDesabonnementRepository $communicationDesabonnementRepository): Response
  220.     {
  221.         if ($id == null) {
  222.             $this->addFlash('error''Aucune campagne n\'a été trouvé.');
  223.             return $this->redirectToRoute("communication_campagnes");
  224.         }
  225.         $campaign $mailingCommunicationRepository->findOneBy(['id' => $id]);
  226.         if ($campaign == null) {
  227.             $this->addFlash('error''Aucune campagne n\'a été trouvé avec cet identifiant.');
  228.             return $this->redirectToRoute("communication_campagnes");
  229.         }
  230.         //récupération des cabinets répondants aux critères
  231.         $accountingFirms $this->sellsyService->getAccountingFirmFromFilters($campaign->getFilters());
  232.         // on enlève les cabinets qui se sont désabonnées
  233.         $desabonnements $communicationDesabonnementRepository->findAll();
  234.         $desabonnementsEmails array_map(function($desabonnement) {
  235.             return $desabonnement->getEmail();
  236.         }, $desabonnements);
  237.         $form $this->createForm(CommunicationCampaignAccountingFirmsType::class, $campaign);
  238.         $form->handleRequest($request);
  239.         if ($form->isSubmitted() && $form->isValid()) {
  240.             $WithAccountingFirmJson $form->get('accountingFirmsSelectedJson')->getData();
  241.             $WithoutAccountingFirmJson $form->get('accountingFirmsUnselectedJson')->getData();
  242.             $WithAccountingFirmArray json_decode($WithAccountingFirmJsontrue);
  243.             $WithoutAccountingFirmArray json_decode($WithoutAccountingFirmJsontrue);
  244.             $campaign->setIdsAccountingFirmSelected($WithAccountingFirmArray);
  245.             $campaign->setIdsAccountingFirmUnselected($WithoutAccountingFirmArray);
  246.             $em->persist($campaign);
  247.             $em->flush();
  248.             return $this->redirectToRoute('communication_campagnes_create_mail_editor', ['id' => $campaign->getId()]);
  249.         }
  250.         return $this->render('communication/selectAccountingFirms.html.twig', [
  251.             'accountingFirms' => $accountingFirms,
  252.             'desabonnements' => $desabonnementsEmails,
  253.             'form' => $form->createView(),
  254.             'campaign' => $campaign
  255.         ]);
  256.     }
  257.     #[Route(path'/communication/campagnes/create/mail-editor/{id}'name'communication_campagnes_create_mail_editor' )]
  258.     #[IsGranted('ROLE_ADMIN')]
  259.     public function campagnesCreateMailEditor(Request $requestEntityManagerInterface $emint $idMailingCommunicationRepository $mailingCommunicationRepositoryKernelInterface $kernelStorageInterface $vichStorageAccountingFirmRepository $accountingFirmRepository): Response
  260.     {
  261.         if ($id == null) {
  262.             $this->addFlash('error''Aucune campagne n\'a été trouvé.');
  263.             return $this->redirectToRoute("communication_campagnes");
  264.         }
  265.         $campaign $mailingCommunicationRepository->findOneBy(['id' => $id]);
  266.         if ($campaign == null) {
  267.             $this->addFlash('error''Aucune campagne n\'a été trouvé avec cet identifiant.');
  268.             return $this->redirectToRoute("communication_campagnes");
  269.         }
  270.         if ($kernel->getEnvironment() == 'dev') {
  271.             $mediaViewerUrl "https://actucontent.loc:8000/";
  272.             // $mediaViewerUrl = "https://actucontent.lagence.expert/";
  273.         } else {
  274.             $mediaViewerUrl "https://actucontent.lagence.expert/";
  275.         }
  276.         $accountingFirm $this->getUser()->getAccountingFirm();
  277.         $filePath $vichStorage->resolvePath($accountingFirm'tmpMailingHeader');
  278.         $base64Img null;
  279.         if (file_exists($filePath)) {
  280.             $mimeType mime_content_type($filePath);
  281.             $fileContent file_get_contents($filePath);
  282.             $base64Img 'data:' $mimeType ';base64,' base64_encode($fileContent);
  283.         }
  284.         $accountingFirmJson null;
  285.         if ($accountingFirm) {
  286.             $accountingFirmTmp $accountingFirmRepository->findOneBy(['id' => $accountingFirm->getId()]);
  287.             // Nettoyage des valeurs pour éviter les problèmes de JSON
  288.             $address trim(preg_replace('/\s+/'' '$accountingFirmTmp->getAddress() . " " $accountingFirmTmp->getZipCode() . " " $accountingFirmTmp->getCity()));
  289.             $url trim($accountingFirmTmp->getUrl());
  290.             $phone trim(preg_replace('/\s+/'' '$accountingFirmTmp->getPhone()));
  291.             $accountingFirmArray = [
  292.                 'id' => $accountingFirmTmp->getId(),
  293.                 'name' => trim($accountingFirmTmp->getName()),
  294.                 'logo' => $base64Img,
  295.                 'address' => $address,
  296.                 'email' => trim($accountingFirmTmp->getEmail()),
  297.                 'phone' => $phone,
  298.                 'site' => $url,
  299.             ];
  300.             $accountingFirmJson json_encode($accountingFirmArrayJSON_HEX_QUOT JSON_HEX_TAG JSON_HEX_AMP JSON_HEX_APOS JSON_UNESCAPED_UNICODE);
  301.             $accountingFirmJson base64_encode($accountingFirmJson);
  302.         }
  303.         $form $this->createForm(CommunicationCampaignMailType::class, $campaign);
  304.         $form->handleRequest($request);
  305.         if ($form->isSubmitted() && $form->isValid()) {
  306.             $mjmlStructure json_decode($form->get('mjmlStructure')->getData(), true);
  307.             $tmpMjmlStructure $mjmlStructure;
  308.             foreach ($mjmlStructure as $key => $part) {
  309.                 if ($part['type'] == 'image' && strpos($part['data']['image'], 'data:image') === 0) {
  310.                     $base64Image $part['data']['image']; // Récupérer la partie base64 de l'image
  311.                     $imageData base64_decode(preg_replace('#^data:image/\w+;base64,#i'''$base64Image)); // Suppri mer le préfixe et décoder la base64
  312.                     $imageName uniqid() . '.png'// Générer un nom de fichier unique
  313.                     $destinationPath 'images/communication/' $imageName// Spécifier le chemin de destination pour sauvegarder l'image
  314.                     // Enregistrer les données binaires dans un fichier sur le serveur
  315.                     if (file_put_contents($destinationPath$imageData)) {
  316.                         $tmpMjmlStructure[$key]['data']['image'] = $destinationPath;
  317.                     }
  318.                 }
  319.             }
  320.             $mjmlStructure $tmpMjmlStructure;
  321.             $campaign->setmjmlStructure($mjmlStructure);
  322.             $em->persist($campaign);
  323.             $em->flush();
  324.             return $this->redirectToRoute('communication_campagnes_create_sending_options', ['id' => $campaign->getId()]);
  325.         }
  326.         return $this->render('communication/create_mail.html.twig', [
  327.             'form' => $form->createView(),
  328.             'campaign' => $campaign,
  329.             'mediaViewerUrl' => $mediaViewerUrl,
  330.             'accountingFirmJson' => $accountingFirmJson,
  331.         ]);
  332.     }
  333.     #[Route(path'/communication/campagnes/create/sending-options/{id}'name'communication_campagnes_create_sending_options' )]
  334.     #[IsGranted('ROLE_ADMIN')]
  335.     public function campagnesCreateSendingOptions(Request $requestEntityManagerInterface $emint $idMailingCommunicationRepository $mailingCommunicationRepositoryAccountingFirmRepository $accountingFirmRepository): Response
  336.     {
  337.         if ($id == null) {
  338.             $this->addFlash('error''Aucune campagne n\'a été trouvé.');
  339.             return $this->redirectToRoute("communication_campagnes");
  340.         }
  341.         $campaign $mailingCommunicationRepository->findOneBy(['id' => $id]);
  342.         if ($campaign == null) {
  343.             $this->addFlash('error''Aucune campagne n\'a été trouvé avec cet identifiant.');
  344.             return $this->redirectToRoute("communication_campagnes");
  345.         }
  346.         $accountingFirms $accountingFirmRepository->findBy(['id' => $campaign->getIdsAccountingFirmSelected()]);
  347.         $accountingFirmsArray = [];
  348.         foreach ($accountingFirms as $accountingFirm) {
  349.             $tmp = [];
  350.             $tmp['name'] = $accountingFirm->getName();
  351.             $admins   = [];
  352.             $partners = [];
  353.             foreach ($accountingFirm->getUsers() as $user) {
  354.                 $roles $user->getRoles();
  355.                 if (in_array('ROLE_ADMIN_FIRM'$rolestrue)) {
  356.                     $admins[] = $user;
  357.                 } elseif (in_array('ROLE_FIRM_PARTNER'$rolestrue)) {
  358.                     $partners[] = $user;
  359.                 }
  360.             }
  361.             // Priorité : admin cabinet, sinon associé, sinon null
  362.             $targetUser $admins[0] ?? $partners[0] ?? null;
  363.             $tmp['email'] = $targetUser $targetUser->getEmail() : null;
  364.             $accountingFirmsArray[] = $tmp;
  365.         }
  366.         $form $this->createForm(CommunicationCampaignDateType::class, $campaign);
  367.         $form->handleRequest($request);
  368.         if ($form->isSubmitted() && $form->isValid()) {
  369.             $campaign->setStatus("PROGRAMMED");
  370.             $em->persist($campaign);
  371.             $em->flush();
  372.             $dateDisplay $campaign->getSendDate()->format('d/m/Y');
  373.             $this->addFlash('successSendCommunication'"Votre campagne a bien été programmée, elle sera envoyée le "$dateDisplay .".");
  374.             return $this->redirectToRoute('communication_campagnes');
  375.         }
  376.         return $this->render('communication/finalisation.html.twig', [
  377.             'form' => $form->createView(),
  378.             'campaign' => $campaign,
  379.             'accountingFirms' => $accountingFirmsArray
  380.         ]);
  381.     }
  382.     #[Route(path'/communication/campagnes/create/sending-now/{id}'name'communication_campagnes_create_sending_now' )]
  383.     #[IsGranted('ROLE_ADMIN')]
  384.     public function campagnesCreateSendingNow(Request $requestEntityManagerInterface $emint $idMailingCommunicationRepository $mailingCommunicationRepositoryAccountingFirmRepository $accountingFirmRepositoryMailing $mailingService): Response
  385.     {
  386.         if ($id == null) {
  387.             $this->addFlash('error''Aucune campagne n\'a été trouvé.');
  388.             return $this->redirectToRoute("communication_campagnes");
  389.         }
  390.         $campaign $mailingCommunicationRepository->findOneBy(['id' => $id]);
  391.         if ($campaign == null) {
  392.             $this->addFlash('error''Aucune campagne n\'a été trouvé avec cet identifiant.');
  393.             return $this->redirectToRoute("communication_campagnes");
  394.         }
  395.         $dateSend = new \DateTime();
  396.         $dateSend->setTimezone(new DateTimeZone('Europe/Paris'));
  397.         $dateSend->setTime($dateSend->format('H') + 100);
  398.         $campaign->setSendDate($dateSend);
  399.         $campaign->setStatus("PROGRAMMED");
  400.         $em->persist($campaign);
  401.         $cabinet $accountingFirmRepository->findBy(['id' => 2])[0];
  402.         $task = new MailingTask();
  403.         $task->setAccountingFirm($cabinet);
  404.         $task->setType("COMMUNICATION");
  405.         $task->setStatus("PENDING");
  406.         $task->setMailingCommunication($campaign);
  407.         $em->persist($task);
  408.         $em->flush();
  409.         $mailingService->createMailingLog($task"Initialisation de l'envoi.""INIT");
  410.         $this->messageBus->dispatch(new MailingProcessMessage(intval($task->getId())));
  411.         $this->addFlash('successSendCommunication'"Votre campagne a bien été ajoutée à la file d'attente, elle sera envoyée dès que possible.");
  412.         return $this->redirectToRoute('communication_campagnes');
  413.     }
  414.     #[Route(path'/communication/campagnes/duplicate/{id}'name'communication_campagnes_duplicate' )]
  415.     #[IsGranted('ROLE_ADMIN')]
  416.     public function campagnesDuplicate(Request $requestEntityManagerInterface $emint $idMailingCommunicationRepository $mailingCommunicationRepository): Response
  417.     {
  418.         $campaign null;
  419.         if ($id != null) {
  420.             $campaign $mailingCommunicationRepository->findOneBy(['id' => $id]);
  421.         }
  422.         if ($campaign == null) {
  423.             $this->addFlash('error''Aucune campagne n\'a été trouvé avec cet identifiant.');
  424.             return $this->redirectToRoute("communication_campagnes");
  425.         }
  426.         $newCampain = new MailingCommunication;
  427.         $newCampain->setCampaignName($campaign->getCampaignName())
  428.                     ->setCategory($campaign->getCategory())
  429.                    ->setFilters($campaign->getFilters())
  430.                    ->setIdsAccountingFirmSelected($campaign->getIdsAccountingFirmSelected())
  431.                    ->setIdsAccountingFirmUnselected($campaign->getIdsAccountingFirmUnselected())
  432.                    ->setObjectMail($campaign->getObjectMail())
  433.                    ->setMjmlStructure($campaign->getMjmlStructure())
  434.                    ->setStatus("ON_CREATE");
  435.         $em->persist($newCampain);
  436.         $em->flush();
  437.        return $this->redirectToRoute('communication_campagnes_create_name', ['id' => $newCampain->getId()]);
  438.     }
  439.     #[Route(path'/communication/campagnes/continue/{id}'name'communication_campagnes_continue' )]
  440.     #[IsGranted('ROLE_ADMIN')]
  441.     public function campagnesContinue(Request $requestEntityManagerInterface $emint $idMailingCommunicationRepository $mailingCommunicationRepository): Response
  442.     {
  443.         $campaign null;
  444.         if ($id != null) {
  445.             $campaign $mailingCommunicationRepository->findOneBy(['id' => $id]);
  446.         }
  447.         if ($campaign == null) {
  448.             $this->addFlash('error''Aucune campagne n\'a été trouvé avec cet identifiant.');
  449.             return $this->redirectToRoute("communication_campagnes");
  450.         }
  451.         if ($campaign->getSendDate() == null && $campaign->getmjmlStructure() != null) {
  452.             return $this->redirectToRoute("communication_campagnes_create_sending_options", ['id' => $campaign->getId()]);
  453.         } elseif ($campaign->getmjmlStructure() == null && $campaign->getIdsAccountingFirmSelected() != null) {
  454.             return $this->redirectToRoute("communication_campagnes_create_mail_editor", ['id' => $campaign->getId()]);
  455.         } elseif ($campaign->getIdsAccountingFirmSelected() == null && $campaign->getFilters() != null) {
  456.             return $this->redirectToRoute("communication_campagnes_create_accounting_firm", ['id' => $campaign->getId()]);
  457.         } elseif ($campaign->getFilters() == null && $campaign->getCampaignName() != null) {
  458.             return $this->redirectToRoute("communication_campagnes_create_filters", ['id' => $campaign->getId()]);
  459.         }
  460.         return $this->redirectToRoute("communication_campagnes_create_name", ['id' => $campaign->getId()]);
  461.     }
  462.     #[Route(path'/communication/campagnes/preview/{id}'name'communication_campagnes_preview' )]
  463.     #[IsGranted('ROLE_ADMIN')]
  464.     public function campagnesPreview(int $idMailingCommunicationRepository $mailingCommunicationRepositoryMjmlExtension $mjmlRendererAccountingFirmRepository $accountingFirmRepository): Response
  465.     {
  466.         $campaign null;
  467.         if ($id != null) {
  468.             $campaign $mailingCommunicationRepository->findOneBy(['id' => $id]);
  469.         }
  470.         if ($campaign == null) {
  471.             $this->addFlash('error''Aucune campagne n\'a été trouvé avec cet identifiant.');
  472.             return $this->redirectToRoute("communication_campagnes");
  473.         }
  474.         $mjmlStructure $campaign->getmjmlStructure();
  475.         $mediaViewerUrl "https://actucontent.loc:8000/";
  476.         if ($this->getParameter('kernel.environment') === 'prod') {
  477.           $mediaViewerUrl "https://actucontent.lagence.expert/";
  478.         }
  479.         $render_data = [
  480.           'mjmlCode' => $mjmlStructure,
  481.           'cabinet' => $accountingFirmRepository->findBy(['id' => 2])[0],
  482.           'serverUrl' => $mediaViewerUrl
  483.         ];
  484.       return new Response($mjmlRenderer->render($this->render('mjml/communication/communication.mjml'$render_data)));
  485.     }
  486. }