src/Controller/QuestionnairesController.php line 120

Open in your IDE?
  1. <?php
  2. namespace App\Controller;
  3. use App\service\servicesGlobale;
  4. use App\Repository\QuestionnaireRepository;
  5. use App\Repository\QuestionsRepository;
  6. use App\Repository\ConfigHeaderRepository;
  7. use App\Repository\QuestionnaireProfileRepository;
  8. use Symfony\Bundle\FrameworkBundle\Controller\AbstractController;
  9. use Symfony\Component\HttpFoundation\Session\SessionInterface;
  10. use Symfony\Component\HttpFoundation\Response;
  11. use Symfony\Component\HttpFoundation\Request;
  12. use Doctrine\ORM\EntityManagerInterface;
  13. use Symfony\Component\Routing\Annotation\Route;
  14. use App\Entity\Questionnaire;
  15. use App\Entity\Questions;
  16. use App\Entity\QuestionReponse;
  17. use Symfony\Component\Filesystem\Filesystem;
  18. use Symfony\Component\Config\Definition\Exception\Exception;
  19. use Symfony\Component\HttpFoundation\JsonResponse;
  20. use App\Repository\ProfilsRepository;
  21. use App\Entity\ReponseProfil;
  22. use App\Entity\QuestionnaireProfile;
  23. use Symfony\Component\HttpKernel\Exception\NotFoundHttpException;
  24. use App\Repository\SystemConfigurationRepository;
  25. class QuestionnairesController extends AbstractController
  26. {
  27.    private $etat_cnx ;
  28.     public function __construct(EntityManagerInterface $em servicesGlobale $globalServ SessionInterface $session )
  29.     {
  30.         
  31.         $this->em $em ;
  32.         if(!$globalServ->verifSession()){
  33.             $this->etat_cnx ;
  34.         }
  35.         else{
  36.             $this->etat_cnx ;
  37.         }
  38.         $this->session $session ;
  39.        
  40.     }
  41.     
  42.     function genererCode($length){
  43.         
  44.         $chars '0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ';
  45.         $string '';
  46.         for($i=0$i<$length$i++){
  47.             $string .= $chars[rand(0strlen($chars)-1)];
  48.         }
  49.             
  50.         return $string;
  51.             
  52.     }
  53.     
  54.      /**
  55.      * @Route("/new_questionnaire", name="new_questionnaire", options = {"expose" = true})
  56.      * @Route("/qestionnaire_edit/{id}", name="qestionnaire_edit")
  57.      * @Route("/questionnaires", name="questionnaires", methods={"GET","POST"} , options={"expose"=true})
  58.      */
  59.     public function index(Request $request QuestionnaireRepository $QuestionnaireRepository 
  60.     ConfigHeaderRepository $ConfigHeaderRepository ProfilsRepository $profilesRepository): Response
  61.     {
  62.         if($this->etat_cnx == ){
  63.             return $this->redirectToRoute('login') ;
  64.         }
  65.         $questionnaires $QuestionnaireRepository->findBy([], ['created_at' => 'DESC']);
  66.         $profiles $profilesRepository->findAll();
  67.         $questionnaire null ;
  68.         if(null !== $request->get('id')){
  69.             $questionnaire $QuestionnaireRepository->find($request->get('id')) ;
  70.           
  71.         }
  72.         
  73.         return $this->render('questionnaires/index.html.twig', [
  74.             'questionnaires' => $questionnaires,
  75.             'questionnaire' => $questionnaire,
  76.             'profiles' => $profiles
  77.         ]);
  78.     }
  79.     /**
  80.      * @Route("/delete_questionnaire/{id}", name="delete_questionnaire", options={"expose"=true}, methods={"DELETE"})
  81.      */
  82.     public function deleteQuestionnaire(Request $requestQuestionnaire $questionnaire): JsonResponse
  83.     {
  84.         $entityManager $this->getDoctrine()->getManager();
  85.         //dd($questionnaire);
  86.         try {
  87.             $entityManager->remove($questionnaire);
  88.             $entityManager->flush();
  89.             // Return a success response
  90.             return new JsonResponse(['success' => true]);
  91.         } catch (\Exception $e) {
  92.             // Handle the exception, e.g., log the error
  93.             // Return an error response
  94.             return new JsonResponse(['success' => false'message' => 'Failed to delete the questionnaire']);
  95.         }
  96.     }
  97.     /**
  98.      * @Route("/quiz/{url}", name="quiz", methods={"GET","POST"}, options={"expose"=true})
  99.      */
  100.     public function showQuiz(Request $requestQuestionnaireRepository $QuestionnaireRepositorySystemConfigurationRepository $systemConfigurationRepositoryConfigHeaderRepository $ConfigHeaderRepository $url): Response
  101.     {
  102.         $systemConfiguration $systemConfigurationRepository->find(1);
  103.         $config_header $ConfigHeaderRepository->find(2) ;
  104.   
  105.         //dd($config_header);
  106.         if ($systemConfiguration && $systemConfiguration->getMaintenance() && $this->etat_cnx == 0) {
  107.             return new Response('Dans un état de maintenance, revenez plus tard.'Response::HTTP_FORBIDDEN);
  108.         }
  109.         //dd($url);
  110.         $baseURL 'https://akoyaconfig.services-unifies.fr/' $url ;
  111.         $questionnaire $QuestionnaireRepository->findOneBy(['url_questionnaire' => $url]);
  112.         if (!$questionnaire) {
  113.             throw $this->createNotFoundException('Questionnaire not found');
  114.         }
  115.         //dd($questionnaire->getQuestions()->toArray());
  116.         if ($questionnaire->getEtat() === 'disabled') {
  117.             return new Response('Questionnaire is disabled'Response::HTTP_FORBIDDEN);
  118.         }
  119.         //dd($questionnaire);
  120.     
  121.         return $this->render('questionnaires/frontOffice/quiz.html.twig', [
  122.             'questionnaire' => $questionnaire,
  123.             'HeaderGeneral' => $config_header->getContenu()
  124.         ]);
  125.     }
  126. /**
  127.  * @Route("/findProfile", name="findProfile", methods={"GET","POST"} , options={"expose"=true})
  128.  */
  129. public function findProfile(Request $requestQuestionnaireRepository $QuestionnaireRepositoryProfilsRepository $profilsRepository SystemConfigurationRepository $systemConfigurationRepository): JsonResponse
  130. {
  131.     $requestData json_decode($request->getContent(), true);
  132.     $profilePointsTotal = []; 
  133.     $systemConfiguration $systemConfigurationRepository->find(1);
  134.     
  135.     foreach ($requestData as $responseIds) {
  136.         foreach ($responseIds as $responseId) {
  137.             $response $this->getDoctrine()->getRepository(QuestionReponse::class)->find($responseId);
  138.             if ($response) {
  139.                 $responseProfilePoints $response->getProfilePoints();
  140.                 
  141.                 foreach ($responseProfilePoints as $profilePoint) {
  142.                     $profileId $profilePoint['id'];
  143.                     $profilePoints intval($profilePoint['points']);               
  144.                     if (!isset($profilePointsTotal[$profileId])) {
  145.                         $profilePointsTotal[$profileId] = 0;
  146.                         //dump($profilePointsTotal[$profileId]);
  147.                     }
  148.                     $profilePointsTotal[$profileId] += $profilePoints;
  149.                 }
  150.             }
  151.         }
  152.     }
  153.     arsort($profilePointsTotal);
  154.     //dd($profilePointsTotal);
  155.     $topProfileIds array_slice(array_keys($profilePointsTotal), 06);
  156.     $testModeEnabled $systemConfiguration $systemConfiguration->getModeTest() : false;
  157.     $profileDetails = [];
  158.     foreach ($topProfileIds as $profileId) {
  159.         $profile $profilsRepository->findBy(['nom_profil' => $profileId]);
  160.         if ($profile) {
  161.             $profileDetails[] = [
  162.                 'profile' => $profile[0],
  163.                 'points' => $profilePointsTotal[$profileId],
  164.                 'testModeEnabled' => $testModeEnabled,
  165.             ];
  166.         }
  167.     }
  168.     //dd($profileDetails);
  169.      return $this->json($profileDetails);
  170. }
  171.  /**
  172.  * @Route("/save_questionnaire", name="save_questionnaire", methods={"POST"}, options={"expose"=true})
  173.  */
  174. public function saveQuestionnaire(
  175.     Request $request
  176.     QuestionnaireRepository $questionnaireRepository
  177.     EntityManagerInterface $em
  178.     QuestionsRepository $questionRepository
  179.     ProfilsRepository $profilsRepository): JsonResponse
  180. {
  181.     //dd($request->request->all());
  182.     try {
  183.     
  184.     $nomQuestionnaire $request->request->get('nom_questionnaire');
  185.   
  186.    
  187.     $etat $request->request->get('etat');
  188.     $profiles $request->request->get('profiles');
  189.     $urlQuestionnaire $request->request->get('url_questionnaire');
  190.     $meta $request->request->get('meta');
  191.     $presentation $request->request->get('presentation');
  192.     $header $request->request->get('header');
  193.     $questionsData json_decode($request->request->get('questions'), true);
  194.     //dd($request->request->all());
  195.     //dd($questionsData);
  196.     $codeCouleur $request->request->get('code_couleur');
  197.     $couleurContraste $request->request->get('couleur_contraste');
  198.     if (empty($questionsData['questions'])) {
  199.         return new JsonResponse(['error' => 'Vous devez ajouter au moins une question.'], Response::HTTP_BAD_REQUEST);
  200.     }
  201.     //dd($urlQuestionnaire);
  202.     $questionnaire = new Questionnaire();
  203.     $questionnaire->setNomQuestionnaire($nomQuestionnaire);
  204.     $questionnaire->setEtat($etat);
  205.     $questionnaire->setUrlQuestionnaire($urlQuestionnaire);
  206.     $questionnaire->setMetaDescription($meta);
  207.     $questionnaire->setPresentation($presentation);
  208.     $questionnaire->setHeader($header);
  209.     $questionnaire->setCodeCouleur($codeCouleur);
  210.     $questionnaire->setCouleurContraste($couleurContraste);
  211.     $questionnaire->setCreatedAt(new \DateTime());
  212.     //dd($urlQuestionnaire);
  213.     //$hashedUrl = md5($urlQuestionnaire);
  214.     //$questionnaire->sethashedURL($hashedUrl);
  215.     foreach ($profiles as $profileId) {
  216.         $profile $profilsRepository->find($profileId);
  217.         if ($profile) {
  218.             $questionnaireProfile = new QuestionnaireProfile();
  219.             $questionnaireProfile->setQuestionnaire($questionnaire);
  220.             $questionnaireProfile->setProfil($profile);
  221.             $em->persist($questionnaireProfile);
  222.         }
  223.     }
  224.     $em->persist($questionnaire);
  225.     //dd($request->request->all());
  226.     foreach ($questionsData['questions'] as $questionData) {
  227.         $questionsEntity = new Questions();
  228.         $questionsEntity->setQuestion($questionData['text']);
  229.         $questionsEntity->setNomQuestionnaire($nomQuestionnaire);
  230.         $questionsEntity->setQuestionnaire($questionnaire); 
  231.         $questionsEntity->setNumResponses($questionData['numResponses']);
  232.         $em->persist($questionsEntity);
  233.         foreach ($questionData['responses'] as $response) {
  234.             $responseText $response['text'];
  235.             
  236.             $questionReponse = new QuestionReponse(); 
  237.             $questionReponse->setQuestion($questionsEntity); 
  238.             $questionReponse->setContent($responseText);
  239.             $profilePoints = [];
  240.             foreach ($response['profiles'] as $profile) {
  241.                 $profileName $profile['name'];
  242.                 $profileId str_replace('input-'''$profileName);
  243.                 $points $profile['value'];
  244.                 
  245.                 $profilePoints[] = [
  246.                     'id' => $profileId,
  247.                     'points' => $points
  248.                 ];
  249.             }
  250.             $questionReponse->setProfilePoints($profilePoints);
  251.             
  252.             $em->persist($questionReponse); 
  253.         }
  254.     }
  255.     
  256.     $em->flush();
  257.     return new JsonResponse(['success' => true'questionnaire_id' => $questionnaire->getId()]);
  258.     } catch (\Exception $e) {
  259.         if (strpos($e->getMessage(), 'Duplicate entry') !== false) {
  260.             return new JsonResponse(['error' => 'Cette URL est déjà utilisée. Veuillez en choisir un différent.'], Response::HTTP_CONFLICT);
  261.         }
  262.         
  263.         return new JsonResponse(['error' => $e->getMessage()], Response::HTTP_INTERNAL_SERVER_ERROR);
  264.     }
  265. }
  266.  /**
  267.  * @Route("/upload_image", name="upload_image", methods={"POST"})
  268.  */
  269. public function upload_image(
  270.     Request $request,
  271.     QuestionnaireRepository $questionnaireRepository,
  272.     EntityManagerInterface $em,
  273.     Filesystem $filesystem
  274. ): JsonResponse {
  275.     // Load your questionnaire entity here (you need to replace 'Questionnaire' with your actual entity class)
  276.     $questionnaireId $request->request->get('questionnaire_id');
  277.     $questionnaire $questionnaireRepository->find($questionnaireId);
  278.     if (!$questionnaire) {
  279.         return $this->json(['status' => 'error''message' => 'Questionnaire not found']);
  280.     }
  281.     $uploadDirRoot $this->getParameter('quiz_image_directory');
  282.     if (!$filesystem->exists($uploadDirRoot)) {
  283.         $filesystem->mkdir($uploadDirRoot);
  284.     }
  285.     $imageFile $request->files->get('img_principale');
  286.     if ($imageFile !== null) {
  287.         $newFilename uniqid().'.'.$imageFile->guessExtension();
  288.         $imageFile->move($uploadDirRoot$newFilename);
  289.         $questionnaire->setImgPrincipale($newFilename);
  290.         $em->persist($questionnaire);
  291.         $em->flush();
  292.         return $this->json(['status' => 'success''message' => 'Image uploaded and questionnaire updated']);
  293.     } else {
  294.         return $this->json(['status' => 'error''message' => 'No image file uploaded']);
  295.     }
  296. /**
  297.  * @Route("/edit_questionnaire/{id}", name="edit_questionnaire", methods={"POST"}, options={"expose"=true})
  298.  */
  299. public function editQuestionnaire(
  300.     Request $request,
  301.     $id,
  302.     EntityManagerInterface $em,
  303.     QuestionsRepository $questionRepository,
  304.     ProfilsRepository $profilsRepository ,
  305.     QuestionnaireRepository $questionnaireRepository,
  306. ): JsonResponse {
  307.     $requestData $request->request->all();
  308.     $questionsData json_decode($requestData['questions'], true);
  309.     //dd($requestData);
  310.     $questionnaire $em->getRepository(Questionnaire::class)->find($id);
  311.     if (!$questionnaire) {
  312.         return new JsonResponse(['error' => 'Questionnaire not found.'], 404);
  313.     }
  314.     //dd($requestData);
  315.    
  316.    // dd($request->files->get('img_principale'));
  317.    $uploadDirRoot $this->getParameter('quiz_image_directory');
  318.     $imageFile $request->files->get('img_principale');
  319.     $nomQuestionnaire $requestData['editQuestionnaireName'];
  320.     $etat $requestData['etat'];
  321.     //dd($etat);
  322.     $urlQuestionnaire $requestData['editQuestionnaireURL'];
  323.     $metaDescription $requestData['editQuestionnaireMetaDescription'];
  324.     $presentation $requestData['editQuestionnairePresentation'];
  325.     $selectedProfilesJson $requestData['selectedProfiles'];
  326.     $codeCouleur $requestData['code_couleur'];
  327.     $contrastCouleur $requestData['couleur_contraste'];
  328.     $selectedProfiles json_decode($selectedProfilesJsontrue);
  329.     /*
  330.     $existingQuestionnaire = $questionnaireRepository->findOneBy(['hashedURL' => $urlQuestionnaire]);
  331.     if ($existingQuestionnaire) {
  332.         $errorMessage = 'Cette URL est déjà utilisée. Veuillez en choisir une autre.';
  333.         return new JsonResponse(['error' => $errorMessage], 400);
  334.     }
  335.     */
  336.     
  337.     $questionnaire->setNomQuestionnaire($nomQuestionnaire);
  338.     $questionnaire->setEtat($etat);
  339.     $questionnaire->setUrlQuestionnaire($urlQuestionnaire);
  340.     $questionnaire->setMetaDescription($metaDescription);
  341.     $questionnaire->setPresentation($presentation);
  342.     $questionnaire->setCodeCouleur($codeCouleur);
  343.     $questionnaire->setCouleurContraste($contrastCouleur);
  344.    
  345.     //$questionnaire->sethashedURL($urlQuestionnaire);
  346.     if ($imageFile) {
  347.         $oldImageFilename $questionnaire->getImgPrincipale(); 
  348.     
  349.         if ($oldImageFilename && file_exists($uploadDirRoot $oldImageFilename)) {
  350.             unlink($uploadDirRoot $oldImageFilename);
  351.         }
  352.     
  353.         $newFilename uniqid().'.'.$imageFile->guessExtension();
  354.         $imageFile->move($uploadDirRoot$newFilename);
  355.         $questionnaire->setImgPrincipale($newFilename);
  356.         $em->persist($questionnaire);
  357.         $em->flush();
  358.     }
  359.     //dd($request->request->all());
  360.     foreach ($questionnaire->getQuestionnaireProfiles() as $existingProfile) {
  361.         $questionnaire->removeQuestionnaireProfile($existingProfile);
  362.         $em->remove($existingProfile);
  363.     }
  364.     
  365.     foreach ($selectedProfiles as $profileName) {
  366.         $profile $profilsRepository->findOneBy(['nom_profil' => $profileName]);
  367.     
  368.         if ($profile) {
  369.             $questionnaireProfile = new QuestionnaireProfile();
  370.             $questionnaireProfile->setQuestionnaire($questionnaire);
  371.             $questionnaireProfile->setProfil($profile);
  372.             $em->persist($questionnaireProfile);
  373.         }
  374.     }
  375.     if (isset($requestData['newQuestions'])) {
  376.         $newQuestionsData json_decode($requestData['newQuestions'], true);
  377.         //dd($newQuestionsData);
  378.         foreach ($newQuestionsData as $newQuestionData) {
  379.             $newQuestionText $newQuestionData['question'];
  380.             $numResponsesPossible $newQuestionData['numResponsesPossible'];
  381.             //dd($numResponsesPossible);
  382.             $newQuestionEntity = new Questions();
  383.             $newQuestionEntity->setQuestion($newQuestionText);
  384.             $newQuestionEntity->setNomQuestionnaire($nomQuestionnaire);
  385.             $newQuestionEntity->setQuestionnaire($questionnaire);
  386.             $newQuestionEntity->setNumResponses($numResponsesPossible);
  387.             
  388.     
  389.             $em->persist($newQuestionEntity);
  390.     
  391.             foreach ($newQuestionData['reponses'] as $newResponse) {
  392.                 $newResponseText $newResponse['content'];
  393.                 $newResponseEntity = new QuestionReponse();
  394.                 $newResponseEntity->setQuestion($newQuestionEntity);
  395.                 $newResponseEntity->setContent($newResponseText);
  396.     
  397.                 $profilePoints = [];
  398.                 foreach ($newResponse['profilePoints'] as $profilePoint) {
  399.                     $profileId $profilePoint['id'];
  400.                     $points $profilePoint['points'];
  401.                     $selectedProfile $profilsRepository->findOneBy(['nom_profil' => $profileId]);
  402.     
  403.                     if ($selectedProfile) {
  404.                         $profilePoints[] = [
  405.                             'id' => $profileId,
  406.                             'points' => $points
  407.                         ];
  408.                     }
  409.                 }
  410.     
  411.                 $newResponseEntity->setProfilePoints($profilePoints);
  412.                 $em->persist($newResponseEntity);
  413.             }
  414.         }
  415.     
  416.         $em->flush();
  417.     }
  418.    
  419.     foreach ($questionsData as $questionData) {
  420.         $questionId $questionData['id'];
  421.         $questionText $questionData['question'];
  422.         $deleted = isset($questionData['deleted']) && $questionData['deleted'] === true
  423.         $question $questionRepository->find($questionId);
  424.         $NombreReponse $questionData['numResponses'];
  425.         //dd($NombreReponse);
  426.         if ($deleted) {
  427.             $question->removeReponse($questionReponse);
  428.             $em->remove($question);
  429.         }else{
  430.         $question->setQuestion($questionText);
  431.         $question->setNumResponses($NombreReponse);
  432.         foreach ($question->getReponses() as $questionReponse) {
  433.             $question->removeReponse($questionReponse);
  434.             $em->remove($questionReponse);
  435.         }
  436.         //$em->flush(); 
  437.     
  438.         foreach ($questionData['reponses'] as $response) {
  439.             $responseText $response['content'];
  440.             $responseEntity = new QuestionReponse();
  441.             $responseEntity->setQuestion($question);
  442.             $responseEntity->setContent($responseText);
  443.     
  444.             $profilePoints = [];
  445.             //dd($response['profilePoints']);
  446.             foreach ($response['profilePoints'] as $profilePoint) {
  447.                
  448.                 $profileId $profilePoint['id'];
  449.                 $points $profilePoint['points'];
  450.                 $selectedProfile $profilsRepository->findOneBy(['nom_profil' => $profileId]);
  451.                 //dd($points);
  452.                 //$points = $profile['value'];
  453.                 //dd($points);
  454.                 if ($selectedProfile) {
  455.                     $profilePoints[] = [
  456.                         'id' => $profileId
  457.                         'points' => $points
  458.                     ];
  459.                 }
  460.             }
  461.     
  462.             $responseEntity->setProfilePoints($profilePoints); 
  463.             $em->persist($responseEntity);
  464.         }
  465.         }
  466.         //$em->flush(); 
  467.     }
  468.     
  469.     $em->persist($questionnaire);
  470.     $em->flush();
  471.     return new JsonResponse(['success' => true]);
  472. }
  473.  
  474.       /**
  475.      * @Route("/module", name="module", options = {"expose" = true})
  476.      * @Route("/listeModules", name="listeModules", options = {"expose" = true})
  477.      * @Route("/module_edit/{id}", name="module_edit")
  478.      */
  479.     /* public function index2(Request $request , ModulesRepository $ModulesRepository  , GlobalAdmin $GlobalAdmin     , ConfigHeaderRepository $ConfigHeaderRepository  ): Response
  480.     {
  481.         if( ($this->session->get('susrD3p9LjjY86') != 'gA64ya3G5N') && ($request->hasSession()) ){
  482.             return $this->redirectToRoute('connexion');
  483.         }
  484.         $modules = $ModulesRepository->findAll() ;
  485.         $module = null ;
  486.         $pieces = null;
  487.         if(null !== $request->get('id')){
  488.             $module = $ModulesRepository->find($request->get('id')) ;
  489.             $pieces = $module->getPiecesJointes();
  490.           
  491.         }
  492.         
  493.        
  494.         $config_header = $ConfigHeaderRepository->findAll()[0];
  495.         return $this->render('modules/index.html.twig', [
  496.             'modules' => $modules ,
  497.             'module' => $module,
  498.             'config_header'=>$config_header,
  499.             'pieces'=>$pieces
  500.           
  501.         ]);
  502.         
  503.     }*/