src/Controller/CossBundle/ClientAdminController.php line 240

Open in your IDE?
  1. <?php
  2. /**
  3.  * Created by PhpStorm.
  4.  * User: grego
  5.  * Date: 02/12/2024
  6.  * Time: 11:17
  7.  */
  8. namespace App\Controller\CossBundle;
  9. use App\Entity\Campaign;
  10. use App\Entity\Participation;
  11. use App\Entity\Program;
  12. use App\Entity\User;
  13. use App\Form\CampaignType;
  14. use App\Form\ParticipationType;
  15. use App\Form\ReportType;
  16. use App\Manager\CossManager;
  17. use App\Manager\MistralManager;
  18. use App\Manager\ReportManager;
  19. use App\Repository\CampaignRepository;
  20. use App\Repository\ParticipationRepository;
  21. use DateTime;
  22. use Doctrine\ORM\EntityManagerInterface;
  23. use Sonata\MediaBundle\Provider\Pool;
  24. use Symfony\Bundle\FrameworkBundle\Controller\AbstractController;
  25. use Symfony\Component\HttpFoundation\BinaryFileResponse;
  26. use Symfony\Component\HttpFoundation\Request;
  27. use Symfony\Component\HttpFoundation\Response;
  28. use Symfony\Component\HttpFoundation\ResponseHeaderBag;
  29. use Symfony\Component\HttpFoundation\StreamedResponse;
  30. use Symfony\Component\Routing\Annotation\Route;
  31. use Symfony\Component\Routing\Generator\UrlGeneratorInterface;
  32. use Symfony\Contracts\Translation\TranslatorInterface;
  33. class ClientAdminController extends AbstractController
  34. {
  35.     /**
  36.      * @Route("/client/programs", name="client_admin_list_programs")
  37.      */
  38.     public function listProgramsAction(Request $requestCossManager $cossManager)
  39.     {
  40.         $user $this->getUser();
  41.         $request->setLocale($user->getLocale());
  42.         $programs $cossManager->getClientAdminPrograms($user);
  43.         return $this->render('CossBundle/ClientAdmin/list_programs.html.twig', array(
  44.             'programs' => $programs,
  45.         ));
  46.     }
  47.     /**
  48.      * @Route("/client/campaigns/create/{id}", name="client_admin_create_campaign")
  49.      */
  50.     public function createCampaignAction(Request $requestEntityManagerInterface $entityManagerCossManager $cossManagerTranslatorInterface $translator$id)
  51.     {
  52.         $user $this->getUser();
  53.         $request->setLocale($user->getLocale());
  54.         $programs $cossManager->getClientAdminPrograms($user);
  55.         $program $entityManager->getRepository(Program::class)->find($id);
  56.         $ids array_map(function ($val) {
  57.             return $val->getId();
  58.         }, $programs);
  59.         if (!in_array($program->getId(), $ids)) {
  60.             $msg $translator->trans(
  61.                 "Vous n'êtes pas rattaché à ce programme",
  62.                 array(), 'coss'
  63.             );
  64.             $this->addFlash("error"$msg);
  65.             return $this->redirectToRoute('client_admin_list_programs');
  66.         } else {
  67.             $createCampaignForm $this->createCampaignForm(null);
  68.             $createCampaignForm->handleRequest($request);
  69.             if ($createCampaignForm->isSubmitted() && $createCampaignForm->isValid()) {
  70.                 $newCampaign = new Campaign();
  71.                 $newCampaign->setProgram($program);
  72.                 $newCampaign->setQuiz($program->getQuiz());
  73.                 $newCampaign->setStatus(CampaignRepository::STATUS_ACTIVE);
  74.                 $newCampaign->setStartDate($createCampaignForm->get('startDate')->getData());
  75.                 $newCampaign->setEndDate($createCampaignForm->get('endDate')->getData());
  76.                 $entityManager->persist($newCampaign);
  77.                 $entityManager->flush();
  78.                 $url $this->generateUrl(
  79.                     'list_recipients',
  80.                     ['token' => $newCampaign->getToken()],
  81.                     UrlGeneratorInterface::ABSOLUTE_URL
  82.                 );
  83.                 $msg $translator->trans(
  84.                     "Campagne créée avec succès",
  85.                     array(), 'coss'
  86.                 );
  87.                 $this->addFlash("success"$msg);
  88.                 $campaigns $cossManager->getClientAdminCampaigns($usernull);
  89.                 return $this->render('CossBundle/ClientAdmin/list_campaigns.html.twig', array(
  90.                     'campaigns' => $campaigns,
  91.                     'listType' => null,
  92.                     'show_modal_url' => true,
  93.                     'modal_program_link' => $url,
  94.                     'modal_program_name' => $program->getName(),
  95.                     'modal_program_start' => $newCampaign->getStartDate(),
  96.                     'modal_program_end' => $newCampaign->getEndDate(),
  97.                 ));
  98.             }
  99.             return $this->render('CossBundle/ClientAdmin/create_edit_campaign.html.twig', array(
  100.                 'program' => $program,
  101.                 'campaignForm' => $createCampaignForm->createView(),
  102.                 'mode' => "create"
  103.             ));
  104.         }
  105.     }
  106.     /**
  107.      * @Route("/client/campaigns/{listType}", name="client_admin_list_campaigns")
  108.      */
  109.     public function listCampaignsAction(Request $requestCossManager $cossManager$listType 0)
  110.     {
  111.         $user $this->getUser();
  112.         $request->setLocale($user->getLocale());
  113.         $campaigns $cossManager->getClientAdminCampaigns($user$listType);
  114.         return $this->render('CossBundle/ClientAdmin/list_campaigns.html.twig', array(
  115.             'campaigns' => $campaigns,
  116.             'listType' => $listType,
  117.             'show_modal_url' => false,
  118.             'modal_program_link' => null,
  119.             'modal_program_name' => null,
  120.             'modal_program_start' => null,
  121.             'modal_program_end' => null,
  122.         ));
  123.     }
  124.     /**
  125.      * @Route("/client/campaigns/edit/{id}", name="client_admin_edit_campaign")
  126.      */
  127.     public function editCampaignAction(Request $requestEntityManagerInterface $entityManagerCossManager $cossManagerTranslatorInterface $translator$id)
  128.     {
  129.         $user $this->getUser();
  130.         $request->setLocale($user->getLocale());
  131.         $campaign $entityManager->getRepository(Campaign::class)->find($id);
  132.         if (!$campaign) {
  133.             $msg $translator->trans(
  134.                 "Cette campagne n'existe pas",
  135.                 array(), 'coss'
  136.             );
  137.             $this->addFlash("error"$msg);
  138.             return $this->redirectToRoute('client_admin_list_campaigns');
  139.         } else {
  140.             $users $cossManager->getClientAdminCampaigns($usernull);
  141.             $ids array_map(function ($val) {
  142.                 return $val->getId();
  143.             }, $users);
  144.             if (!in_array($campaign->getId(), $ids)) {
  145.                 $msg $translator->trans(
  146.                     "Vous n'êtes pas rattaché à cette campagne",
  147.                     array(), 'coss'
  148.                 );
  149.                 $this->addFlash("error"$msg);
  150.                 return $this->redirectToRoute('client_admin_list_campaigns');
  151.             } else {
  152.                 $editCampaignForm $this->createCampaignForm($campaign);
  153.                 $editCampaignForm->handleRequest($request);
  154.                 if ($editCampaignForm->isSubmitted() && $editCampaignForm->isValid()) {
  155.                     $campaign->setStartDate($editCampaignForm->get('startDate')->getData());
  156.                     $campaign->setEndDate($editCampaignForm->get('endDate')->getData());
  157.                     $entityManager->persist($campaign);
  158.                     $entityManager->flush();
  159.                     $msg $translator->trans(
  160.                         "Campagne modifiée avec succès",
  161.                         array(), 'coss'
  162.                     );
  163.                     $this->addFlash("success"$msg);
  164.                     return $this->redirectToRoute('client_admin_list_campaigns');
  165.                 }
  166.                 return $this->render('CossBundle/ClientAdmin/create_edit_campaign.html.twig', array(
  167.                     'program' => $campaign->getProgram(),
  168.                     'campaignForm' => $editCampaignForm->createView(),
  169.                     'mode' => 'edit',
  170.                 ));
  171.             }
  172.         }
  173.     }
  174.     /**
  175.      * @Route("/client/campaigns/download/csv", name="client_admin_download_campaigns")
  176.      */
  177.     public function downloadCampaignsAction(Request $requestCossManager $cossManager)
  178.     {
  179.         $user $this->getUser();
  180.         $request->setLocale($user->getLocale());
  181.         $campaigns $cossManager->getClientAdminCampaigns($usernull);
  182.         $today = new Datetime();
  183.         $fileName "export_campaigns_".$today->format('d_m_Y').".csv";
  184.         $response = new StreamedResponse();
  185.         $response->setCallback(function() use ($campaigns) {
  186.             $handle fopen('php://output''w+');
  187.             fputcsv($handle, ['company''program''quiz''startDate''endDate''status'], ';');
  188.             foreach ($campaigns as $campaign) {
  189.                 fputcsv(
  190.                     $handle,
  191.                     [$campaign->getProgram()->getCompany()->getName(), $campaign->getProgram()->getName(), $campaign->getQuiz()->getTitle(), $campaign->getStartDate()->format('d/m/Y'), $campaign->getEndDate()->format('d/m/Y'), $campaign->getStatusFormatted()],
  192.                     ';'
  193.                 );
  194.             }
  195.             fclose($handle);
  196.         });
  197.         $response->setStatusCode(200);
  198.         $response->headers->set('Content-Type''text/csv; charset=utf-8');
  199.         $response->headers->set('Content-Disposition','attachment; filename='.$fileName.'');
  200.         return $response;
  201.     }
  202.     /*___________only for SUPER_ADMIN___________*/
  203.     /**
  204.      * @Route("/client/participations/{listType}", name="client_admin_list_participations")
  205.      */
  206.     public function listParticipationsAction($listType = -1Request $requestCossManager $cossManager)
  207.     {
  208.         $user $this->getUser();
  209.         $request->setLocale($user->getLocale());
  210.         $participations $cossManager->getClientAdminParticipations($listType);
  211.         return $this->render('CossBundle/ClientAdmin/list_participations.html.twig', array(
  212.             'participations' => $participations,
  213.             'listType' => $listType,
  214.         ));
  215.     }
  216.     /**
  217.      * @Route("/client/participations/edit/{id}", name="client_admin_edit_participation")
  218.      */
  219.     public function editParticipationAction(Request $requestEntityManagerInterface $entityManagerCossManager $cossManagerTranslatorInterface $translator$id)
  220.     {
  221.         $user $this->getUser();
  222.         $request->setLocale($user->getLocale());
  223.         $participation $entityManager->getRepository(Participation::class)->find($id);
  224.         if (!$participation) {
  225.             $msg $translator->trans(
  226.                 "Cette participation n'existe pas",
  227.                 array(), 'coss'
  228.             );
  229.             $this->addFlash("error"$msg);
  230.             return $this->redirectToRoute('client_admin_list_participations');
  231.         } else {
  232.             $editParticipationForm $this->createParticipationForm($participation);
  233.             $editParticipationForm->handleRequest($request);
  234.             if ($editParticipationForm->isSubmitted() && $editParticipationForm->isValid()) {
  235.                 $participation->setStartDate($editParticipationForm->get('startDate')->getData());
  236.                 $participation->setEndDate($editParticipationForm->get('endDate')->getData());
  237.                 $participation->setStatus($editParticipationForm->get('status')->getData());
  238.                 $entityManager->persist($participation);
  239.                 $entityManager->flush();
  240.                 $msg $translator->trans(
  241.                     "Participation modifiée avec succès",
  242.                     array(), 'coss'
  243.                 );
  244.                 $this->addFlash("success"$msg);
  245.                 return $this->redirectToRoute('client_admin_list_participations');
  246.             }
  247.             return $this->render('CossBundle/ClientAdmin/edit_participation.html.twig', array(
  248.                 'participation' => $participation,
  249.                 'participationForm' => $editParticipationForm->createView(),
  250.                 'mode' => 'edit',
  251.             ));
  252.         }
  253.     }
  254.     /**
  255.      * @Route("/client/participations/report/edit/{id}", name="client_admin_edit_participation_report")
  256.      */
  257.     public function editParticipationReportAction(Request $requestEntityManagerInterface $entityManagerReportManager $reportManagerTranslatorInterface $translator$id)
  258.     {
  259.         $user $this->getUser();
  260.         $request->setLocale($user->getLocale());
  261.         $participation $entityManager->getRepository(Participation::class)->find($id);
  262.         if (!$participation) {
  263.             $msg $translator->trans(
  264.                 "Cette participation n'existe pas",
  265.                 array(), 'coss'
  266.             );
  267.             $this->addFlash("error"$msg);
  268.             return $this->redirectToRoute('client_admin_list_participations');
  269.         } else {
  270.             $reportForm $this->createReportForm($participation);
  271.             $reportForm->handleRequest($request);
  272.             if ($reportForm->isSubmitted() && $reportForm->isValid()) {
  273.                 $participation->setReportDate($reportForm->get('reportDate')->getData());
  274.                 $participation->setReportAnswersCount($reportForm->get('answersCount')->getData());
  275.                 $data $request->request->get('reportData');
  276.                 $strengthsImage $request->request->get('strengths_image');
  277.                 $weaknessesImage $request->request->get('weaknesses_image');
  278.                 $strengthsPath $this->saveBase64Image($strengthsImage);
  279.                 $weaknessesPath $this->saveBase64Image($weaknessesImage);
  280.                 $participation->setReportData($data);
  281.                 $html $reportManager->generate($participation$strengthsPath$weaknessesPath);
  282.                 $participation->setStatus(ParticipationRepository::STATUS_CLOSED);
  283.                 $entityManager->persist($participation);
  284.                 $entityManager->flush();
  285.                 if($html){
  286.                     $this->addFlash('success''Rapport généré avec succès.');
  287.                     return $this->redirectToRoute('client_admin_participation_report_success', [
  288.                         'id' => $participation->getId()
  289.                     ]);
  290.                 } else {
  291.                     $this->addFlash('error''Une erreur est survenue lors de la génération du rapport.');
  292.                     return $this->redirectToRoute('client_admin_list_participations');
  293.                 }
  294.             }
  295.             return $this->render('CossBundle/ClientAdmin/edit_report.html.twig', [
  296.                 'participation' => $participation,
  297.                 'reportData' => $participation->getReportData(),
  298.                 'reportForm' => $reportForm->createView(),
  299.             ]);
  300.         }
  301.     }
  302.     /**
  303.      * @Route("/client/participations/report/success/{id}", name="client_admin_participation_report_success")
  304.      */
  305.     public function participationReportSuccessAction(Request $requestEntityManagerInterface $entityManagerTranslatorInterface $translator$id)
  306.     {
  307.         $user $this->getUser();
  308.         $request->setLocale($user->getLocale());
  309.         $participation $entityManager->getRepository(Participation::class)->find($id);
  310.         if (!$participation) {
  311.             $msg $translator->trans(
  312.                 "Cette participation n'existe pas",
  313.                 array(), 'coss'
  314.             );
  315.             $this->addFlash("error"$msg);
  316.             return $this->redirectToRoute('client_admin_list_participations');
  317.         } else {
  318.             if(!$participation->getReport()){
  319.                 $msg $translator->trans(
  320.                     "Cette participation n'a pas encore de rapport généré",
  321.                     array(), 'coss'
  322.                 );
  323.                 $this->addFlash("error"$msg);
  324.                 return $this->redirectToRoute('client_admin_list_participations');
  325.             } else {
  326.                 return $this->render('CossBundle/ClientAdmin/download_report.html.twig', [
  327.                     'participation' => $participation
  328.                 ]);
  329.             }
  330.         }
  331.     }
  332.     /**
  333.      * @Route("/client/participations/download/csv", name="client_admin_download_participations")
  334.      */
  335.     public function downloadParticipationsAction(Request $requestCossManager $cossManager)
  336.     {
  337.         $user $this->getUser();
  338.         $request->setLocale($user->getLocale());
  339.         $participations $cossManager->getClientAdminParticipations(-1);
  340.         $today = new Datetime();
  341.         $fileName "export_participations_".$today->format('d_m_Y').".csv";
  342.         $response = new StreamedResponse();
  343.         $response->setCallback(function() use ($participations) {
  344.             $handle fopen('php://output''w+');
  345.             fputcsv($handle, ['participant''company''program''quiz''startDate''endDate''status'], ';');
  346.             foreach ($participations as $participation) {
  347.                 fputcsv(
  348.                     $handle,
  349.                     [
  350.                         $participation->getParticipant()->getFullname(),
  351.                         $participation->getCampaign()->getProgram()->getCompany()->getName(),
  352.                         $participation->getCampaign()->getProgram()->getName(),
  353.                         $participation->getCampaign()->getQuiz()->getTitle(),
  354.                         $participation->getStartDate()->format('d/m/Y'),
  355.                         $participation->getEndDate()->format('d/m/Y'),
  356.                         $participation->getStatusFormatted()
  357.                     ],
  358.                     ';'
  359.                 );
  360.             }
  361.             fclose($handle);
  362.         });
  363.         $response->setStatusCode(200);
  364.         $response->headers->set('Content-Type''text/csv; charset=utf-8');
  365.         $response->headers->set('Content-Disposition','attachment; filename='.$fileName.'');
  366.         return $response;
  367.     }
  368.     private function createCampaignForm($campaign)
  369.     {
  370.         $form $this->createForm(CampaignType::class, new CampaignType(), array(
  371.             'campaign' => $campaign,
  372.         ));
  373.         return $form;
  374.     }
  375.     private function createParticipationForm($participation)
  376.     {
  377.         $form $this->createForm(ParticipationType::class, new ParticipationType(), array(
  378.             'participation' => $participation,
  379.         ));
  380.         return $form;
  381.     }
  382.     private function createReportForm($participation)
  383.     {
  384.         $form $this->createForm(ReportType::class, new ReportType(), array(
  385.             'participation' => $participation,
  386.         ));
  387.         return $form;
  388.     }
  389.     private function saveBase64Image(?string $base64): string
  390.     {
  391.         $base64 str_replace('data:image/png;base64,'''$base64);
  392.         $base64 str_replace(' ''+'$base64);
  393.         $imageData base64_decode($base64);
  394.         $filename "cloud_" uniqid() . '.png';
  395.         $path $this->getParameter('kernel.project_dir') . '/public/tmp/' $filename;
  396.         file_put_contents($path$imageData);
  397.         return $filename// juste le nom, le chemin public sera /tmp/filename.png
  398.     }
  399. }