src/Controller/AdminController.php line 371

Open in your IDE?
  1. <?php
  2. namespace App\Controller;
  3. use App\Entity\CandidatFiche;
  4. use App\Entity\CritereEvaluation;
  5. use App\Entity\CritereSatisfaction;
  6. use App\Entity\DemandeAffectation;
  7. use App\Entity\DemandeService;
  8. use App\Entity\DemandeServiceCandidat;
  9. use App\Entity\FicheEval;
  10. use App\Entity\Module;
  11. use App\Entity\PourcentageQuiz;
  12. use App\Entity\Quiz;
  13. use App\Entity\QuizReponse;
  14. use App\Entity\QuizResultat;
  15. use App\Entity\ReponseCandidatFiche;
  16. use App\Entity\Tenant\Fiche;
  17. use App\Entity\User;
  18. use App\Entity\UserFicheSatisfaction;
  19. use App\Entity\UserFicheSatisfactionReponse;
  20. use Doctrine\ORM\EntityManagerInterface;
  21. use Symfony\Component\HttpFoundation\JsonResponse;
  22. use Symfony\Component\HttpFoundation\Request;
  23. use Symfony\Component\HttpFoundation\Response;
  24. use Symfony\Component\Routing\Annotation\Route;
  25. use Symfony\Contracts\Translation\TranslatorInterface;
  26. use Symfony\Component\VarExporter\Internal\Values;
  27. use Symfony\Bundle\FrameworkBundle\Controller\AbstractController;
  28. use App\Controller\Trait\CsrfRequestValidationTrait;
  29. use App\Service\CapabilityTokenManager;
  30. use App\Service\SafeRedirectValidator;
  31. class AdminController extends AbstractController
  32. {
  33.     use CsrfRequestValidationTrait;
  34.     private const BACKOFFICE_ROLES = [
  35.         'ROLE_ADMIN',
  36.         'ROLE_CHARGE_ASSISTANCE',
  37.         'ROLE_DAE',
  38.         'ROLE_UNITE_REGINALE',
  39.         'ROLE_AGENT_INTERNE',
  40.     ];
  41.     private CapabilityTokenManager $capabilityTokenManager;
  42.     public function __construct(CapabilityTokenManager $capabilityTokenManager)
  43.     {
  44.         $this->capabilityTokenManager $capabilityTokenManager;
  45.     }
  46.     #[Route('/admin1'name'app_admin')]
  47.     public function index(): Response
  48.     {
  49.         return $this->render('admin/index.html.twig', [
  50.             'controller_name' => 'Interface Admin',
  51.         ]);
  52.     }
  53.     #[Route('/get/module/quiz'name'get_module_quiz')]
  54.     public function moduleQuizListRequest $requestEntityManagerInterface $entityManager ): JsonResponse
  55.     {
  56.         $this->denyBackofficeAccess();
  57.         $result = [];
  58.         $demandeAffectation $entityManager->getRepository(DemandeAffectation::class)->find($request->query->get('demandeA'));
  59.         if (!$demandeAffectation) {
  60.             return new JsonResponse($result);
  61.         }
  62.         $quizList $demandeAffectation->getDemandeService()->getModule()->getQuizzes();
  63.         foreach( $quizList as $quiz ){
  64.             $showQuiz false;
  65.             $demandePrincipales $entityManager->getRepository(DemandeService::class)->getDemandesPrincipalesOfGroupe$demandeAffectation->getDemandeService()->getGroupeDemande()->getId() );
  66.             foreach( $demandePrincipales as $demande ) {
  67.                 foreach ($demande->getDemandeServiceCandidats() as $candidat) {
  68.                     $userQuizResponse $entityManager->getRepository(PourcentageQuiz::class)->findOneBy([ 'quiz' => $quiz'candidat' => $candidat ]);
  69.                     $QuizResultat $entityManager->getRepository(QuizResultat::class)->findOneBy([ 'quiz' => $quiz]);
  70.                     if( !$userQuizResponse && $QuizResultat && $QuizResultat->isSelected()){
  71.                         $showQuiz true;
  72.                         break;
  73.                     }
  74.                 }
  75.                 if( $showQuiz ){
  76.                     break;
  77.                 }
  78.             }
  79.             if( $showQuiz && $quiz->isValidated() ){
  80.                 $result[] = [
  81.                     'id' => $quiz->getId(),
  82.                     'nom' => $quiz->getNom()
  83.                 ];
  84.             }
  85.         }
  86.         return new JsonResponse($result);
  87.     }
  88.     #[Route('/get/module/fiche'name'get_module_fiche')]
  89.     public function moduleFicheListRequest $requestEntityManagerInterface $entityManager ): JsonResponse
  90.     {
  91.         $this->denyBackofficeAccess();
  92.         $result = [];
  93.         $demandeAffectation $entityManager->getRepository(DemandeAffectation::class)->find($request->query->get('demandeA'));
  94.         if (!$demandeAffectation) {
  95.             return new JsonResponse($result);
  96.         }
  97.         $ficheList $demandeAffectation->getDemandeService()->getModule()->getFicheEvals();
  98.         foreach( $ficheList as $fiche ){
  99.             $showFiche false;
  100.             $demandePrincipales $entityManager->getRepository(DemandeService::class)->getDemandesPrincipalesOfGroupe$demandeAffectation->getDemandeService()->getGroupeDemande()->getId() );
  101.             foreach( $demandePrincipales as $demande ) {
  102.                 foreach ($demande->getDemandeServiceCandidats() as $candidat) {
  103.                     $candidatFiche $entityManager->getRepository(CandidatFiche::class)->findOneBy([ 'fiche' => $fiche'candidat' => $candidat ]);
  104.                     if( !$candidatFiche ){
  105.                         $showFiche true;
  106.                         break;
  107.                     }
  108.                 }
  109.                 if( $showFiche ){
  110.                     break;
  111.                 }
  112.             }
  113.             if( $showFiche && $fiche->isValidated() ){
  114.                 $result[] = [
  115.                     'id' => $fiche->getId(),
  116.                     'nom' => $fiche->getLabel() . ' (' $fiche->getId() . ')'
  117.                 ];
  118.             }
  119.         }
  120.         return new JsonResponse($result);
  121.     }
  122.     #[Route('/quiz/{quiz}/{token}'name'app_quiz')]
  123.     public function quiz(Quiz $quiz$tokenRequest $requestEntityManagerInterface $entityManager): Response
  124.     {
  125.         $pourcentageCandidat $entityManager->getRepository(PourcentageQuiz::class)->findOneBy([
  126.             'token' => $token,
  127.             'quiz' => $quiz,
  128.         ]);
  129.         if (!$pourcentageCandidat || !$this->capabilityTokenManager->isValid($pourcentageCandidat->getToken())) {
  130.             $this->addFlash('danger'$this->trans('flash.token_invalid_expired'));
  131.             return $this->redirectToRoute('login');
  132.         }
  133.         if ($request->isMethod('POST')) {
  134.             $this->validateRequestCsrfToken($request'quiz');
  135.             $correctAnswredQuestionsNumber 0;
  136.             foreach ($quiz->getQuizQuestions() as $Question) {
  137.                 $answers = [];
  138.                 $correct_answers = [];
  139.                 // transform answers in array if not already one
  140.                 if (is_array($request->request->all()[$Question->getIdFileds()])) {
  141.                     $answers $request->request->all()[$Question->getIdFileds()];
  142.                 } else {
  143.                     $answers[] = $request->request->all()[$Question->getIdFileds()];
  144.                 }
  145.                 // get correct answers
  146.                 foreach ($Question->getOptions() as $option) {
  147.                     // if correct push value in correct answers array
  148.                     if ($option->isIsCorrect()) {
  149.                         $correct_answers[] = $option->getValue();
  150.                     }
  151.                 }
  152.                 // save user answers
  153.                 foreach ($answers as $answer) {
  154.                     // add answer
  155.                     $repenseUser = new QuizReponse();
  156.                     $repenseUser->setUser($this->getUser());
  157.                     $repenseUser->setQuestion($Question);
  158.                     $repenseUser->setValue($answer);
  159.                     $entityManager->persist($repenseUser);
  160.                 }
  161.                 // check if correct question answer
  162.                 if ( countarray_diff($answers$correct_answers) ) == ) {
  163.                     $correctAnswredQuestionsNumber++;
  164.                 }
  165.                 $entityManager->flush();
  166.             }
  167.             // calc percent
  168.             $quizPercent $correctAnswredQuestionsNumber 100 count($quiz->getQuizQuestions());
  169.             // save percent
  170.             $pourcentageCandidat->setPourcentage($quizPercent);
  171.             $entityManager->flush();
  172.         }
  173.         $mention null;
  174.         if( !$quiz->getQuizResultats()->isEmpty() ){
  175.             foreach ($quiz->getQuizResultats()->last()->getMention() as $mentionQuiz){
  176.                 $pourcentage $pourcentageCandidat->getPourcentage();
  177.                 if( isset( $pourcentage ) && $pourcentage >= $mentionQuiz->getPourcentage() && $pourcentage <= $mentionQuiz->getPourcentageMax()  ){
  178.                     $mention $mentionQuiz->getMention();
  179.                 }
  180.             }
  181.         }
  182.         return $this->render('quiz/index.html.twig', [
  183.             'quiz' => $quiz,
  184.             'pourcentageCandidat' => $pourcentageCandidat,
  185.             'mention' => $mention,
  186.         ]);
  187.     }
  188.     #[Route('/fiche/{fiche}/{token}'name'app_fiche')]
  189.     public function fiche(FicheEval $fiche$tokenRequest $requestEntityManagerInterface $entityManager): Response
  190.     {
  191.         $candidatAnswers = [];
  192.         $candidatFiche $entityManager->getRepository(CandidatFiche::class)->findOneBy([
  193.             'token' => $token,
  194.             'fiche' => $fiche,
  195.         ]);
  196.         if (!$candidatFiche || !$this->capabilityTokenManager->isValid($candidatFiche->getToken())) {
  197.             $this->addFlash('danger'$this->trans('flash.token_invalid_expired'));
  198.             return $this->redirectToRoute('login');
  199.         }
  200.         if ( $request->getMethod() == 'POST' and $candidatFiche->getReponseCandidatFiches()->isEmpty() ) {
  201.             $this->validateRequestCsrfToken($request'fiche');
  202.             foreach( $request->request->all()['questions'] as $question => $candidatAnswer ){
  203.                 if( $question == 'critere' || $question == 'critere_avant' || $question == 'critere_apres' ){
  204.                     foreach( $candidatAnswer as $critereId => $answer ){
  205.                         $critere $entityManager->find(CritereEvaluation::class, $critereId);
  206.                         $reponseCandidatFiche = new ReponseCandidatFiche();
  207.                         $reponseCandidatFiche->setCandidatFiche($candidatFiche);
  208.                         $reponseCandidatFiche->setQuestion($question);
  209.                         $reponseCandidatFiche->setCritere($critere);
  210.                         $reponseCandidatFiche->setReponse($answer);
  211.                         $entityManager->persist($reponseCandidatFiche);
  212.                         $candidatAnswers$question ][ $critereId ] = $answer;
  213.                     }
  214.                 }else{
  215.                     $reponseCandidatFiche = new ReponseCandidatFiche();
  216.                     $reponseCandidatFiche->setCandidatFiche($candidatFiche);
  217.                     $reponseCandidatFiche->setQuestion($question);
  218.                     $reponseCandidatFiche->setReponse($candidatAnswer);
  219.                     $entityManager->persist($reponseCandidatFiche);
  220.                     $candidatAnswers$question ] = $candidatAnswer;
  221.                 }
  222.             }
  223.             $entityManager->flush();
  224.         }else{
  225.             foreach( $candidatFiche->getReponseCandidatFiches() as $reponseCandidatFich ){
  226.                 if( $reponseCandidatFich->getCritere() ){
  227.                     $candidatAnswers$reponseCandidatFich->getQuestion() ][ $reponseCandidatFich->getCritere()->getId() ] = $reponseCandidatFich->getReponse();
  228.                 }
  229.                 else{
  230.                     $candidatAnswers$reponseCandidatFich->getQuestion() ] = $reponseCandidatFich->getReponse();
  231.                 }
  232.             }
  233.         }
  234.         return $this->render('fiche/index.html.twig', [
  235.             'fiche' => $fiche,
  236.             'candidatFiche' => $candidatFiche,
  237.             'candidatAnswers' => $candidatAnswers,
  238.         ]);
  239.     }
  240.     #[Route('/fiche-satisfaction/{demandeService}'name'app_fiche_satisfaction')]
  241.     public function ficheSatisfaction(DemandeService $demandeServiceRequest $requestEntityManagerInterface $entityManager): Response
  242.     {
  243.         $userFiche $entityManager->getRepositoryUserFicheSatisfaction::class)->findOneBy( [ 'demandeService' => $demandeService->getId() ] );
  244.         $critere $entityManager->getREpository(CritereSatisfaction::class)->findAll();
  245.         if( !$userFiche ){
  246.             // To do : handle exception
  247.         }
  248.         if ( $request->getMethod() == 'POST' /*and $userFiche->getReponseCandidatFiches()->isEmpty()*/ 
  249.         && !$userFiche->isValidated()) {
  250.             $this->validateRequestCsrfToken($request'fiche_satisfaction');
  251.             $userFiche->setUser($this->getUser());
  252.             // $userFiche->setReponses($request->request->all()['satisfaction']['reponses']);
  253.             
  254.             $userFiche->setNom($request->request->all()['satisfaction']['nom']);
  255.             $userFiche->setDomaine($request->request->all()['satisfaction']['domaine']);
  256.             $userFiche->setNombreSalarie($request->request->all()['satisfaction']['nombreSalarie']);
  257.             $userFiche->setAdresse($request->request->all()['satisfaction']['adresse']);
  258.             $userFiche->setContact($request->request->all()['satisfaction']['contact']);
  259.             $userFiche->setEmail($request->request->all()['satisfaction']['email']);
  260.             $userFiche->setFax($request->request->all()['satisfaction']['fax']);
  261.             $userFiche->setRemplirPar($request->request->all()['satisfaction']['remplirPar']);
  262.             $userFiche->setFonction($request->request->all()['satisfaction']['fonction']);
  263.             $userFiche->setAnalyseResultat($request->request->all()['satisfaction']['analyse_resultat']);
  264.             // $userFiche->setConclusion($request->request->all()['satisfaction']['conclusion']);
  265.           if(!$userFiche->isValidated()){
  266.             foreach ( $request->request->all()['satisfaction']['rows'] as $row ){
  267.                 $reponse = new UserFicheSatisfactionReponse();
  268.                 $critere $entityManager->getRepositoryCritereSatisfaction::class)->findOneBy( [ 'id' => $row['critere'] ] );
  269.                 $reponse->setCritereSatisfaction($critere);
  270.                 $reponse->setSatisfait$row['satisfait'] );
  271.                 $reponse->setUserFicheSatisfaction($userFiche);
  272.                 $entityManager->persist($reponse);
  273.             }
  274.           }
  275.             $userFiche->setValidatedtrue );
  276.             $entityManager->flush();
  277.         }
  278.         return $this->render('fiche/fiche_satisfaction_service_intervention.html.twig', [
  279.             'user' => $demandeService->getUser(),
  280.             'userFiche' => $userFiche,
  281.             'criteres' => $critere
  282.         ]);
  283.     }
  284.     #[Route('/fiche-collect-donnee'name'app_fiche_collect_donnee')]
  285.     public function ficheCollectDonnee(Request $requestEntityManagerInterface $entityManagerTranslatorInterface $translator): Response
  286.     {
  287.         if ($request->isMethod('POST')) {
  288.             $this->validateRequestCsrfToken($request'fiche_collect');
  289.             // Ici on pourrait persister dans une table dédiée. Pour l'instant, on récupère et on journalise.
  290.             // $data = $request->request->all('collecte');
  291.             // TODO: persister $data
  292.             $this->addFlash('success'$translator->trans('flash.fiche_collecte_saved'));
  293.             return $this->redirectToRoute('app_fiche_collect_donnee');
  294.         }
  295.         return $this->render('fiche/fiche_collect_donnee_service_intervention.html.twig', []);
  296.     }
  297.     #[Route('/attestation-participation/{candidat}'name'app_attestation_participation')]
  298.     public function attestationParticipation(DemandeServiceCandidat $candidat): Response
  299.     {
  300.         return $this->render('service/candidat_attestation_particiapation.html.twig', [
  301.             'candidat' => $candidat
  302.         ]);
  303.     }
  304.     #[Route('/changeLocale/{_locale}'name'app_change_locale')]
  305.     public function changeLocale(Request $requestSafeRedirectValidator $redirectValidator)
  306.     {
  307.         // dd($request->attributes->get('_locale'));
  308.         if ($locale $request->attributes->get('_locale')) {
  309.             $request->getSession()->set('_locale'$locale);
  310.         }
  311.         $referer $request->headers->get('referer');
  312.         $target $redirectValidator->sanitizeReferer($referer$request->getHost());
  313.         return $this->redirect($target);
  314.     }
  315.     private function denyBackofficeAccess(): void
  316.     {
  317.         foreach (self::BACKOFFICE_ROLES as $role) {
  318.             if ($this->isGranted($role)) {
  319.                 return;
  320.             }
  321.         }
  322.         $this->denyAccessUnlessGranted('ROLE_ADMIN');
  323.     }
  324. }