<?php
namespace App\Controller;
use App\Entity\CandidatFiche;
use App\Entity\CritereEvaluation;
use App\Entity\CritereSatisfaction;
use App\Entity\DemandeAffectation;
use App\Entity\DemandeService;
use App\Entity\DemandeServiceCandidat;
use App\Entity\FicheEval;
use App\Entity\Module;
use App\Entity\PourcentageQuiz;
use App\Entity\Quiz;
use App\Entity\QuizReponse;
use App\Entity\QuizResultat;
use App\Entity\ReponseCandidatFiche;
use App\Entity\Tenant\Fiche;
use App\Entity\User;
use App\Entity\UserFicheSatisfaction;
use App\Entity\UserFicheSatisfactionReponse;
use Doctrine\ORM\EntityManagerInterface;
use Symfony\Component\HttpFoundation\JsonResponse;
use Symfony\Component\HttpFoundation\Request;
use Symfony\Component\HttpFoundation\Response;
use Symfony\Component\Routing\Annotation\Route;
use Symfony\Contracts\Translation\TranslatorInterface;
use Symfony\Component\VarExporter\Internal\Values;
use Symfony\Bundle\FrameworkBundle\Controller\AbstractController;
use App\Controller\Trait\CsrfRequestValidationTrait;
use App\Service\CapabilityTokenManager;
use App\Service\SafeRedirectValidator;
class AdminController extends AbstractController
{
use CsrfRequestValidationTrait;
private const BACKOFFICE_ROLES = [
'ROLE_ADMIN',
'ROLE_CHARGE_ASSISTANCE',
'ROLE_DAE',
'ROLE_UNITE_REGINALE',
'ROLE_AGENT_INTERNE',
];
private CapabilityTokenManager $capabilityTokenManager;
public function __construct(CapabilityTokenManager $capabilityTokenManager)
{
$this->capabilityTokenManager = $capabilityTokenManager;
}
#[Route('/admin1', name: 'app_admin')]
public function index(): Response
{
return $this->render('admin/index.html.twig', [
'controller_name' => 'Interface Admin',
]);
}
#[Route('/get/module/quiz', name: 'get_module_quiz')]
public function moduleQuizList( Request $request, EntityManagerInterface $entityManager ): JsonResponse
{
$this->denyBackofficeAccess();
$result = [];
$demandeAffectation = $entityManager->getRepository(DemandeAffectation::class)->find($request->query->get('demandeA'));
if (!$demandeAffectation) {
return new JsonResponse($result);
}
$quizList = $demandeAffectation->getDemandeService()->getModule()->getQuizzes();
foreach( $quizList as $quiz ){
$showQuiz = false;
$demandePrincipales = $entityManager->getRepository(DemandeService::class)->getDemandesPrincipalesOfGroupe( $demandeAffectation->getDemandeService()->getGroupeDemande()->getId() );
foreach( $demandePrincipales as $demande ) {
foreach ($demande->getDemandeServiceCandidats() as $candidat) {
$userQuizResponse = $entityManager->getRepository(PourcentageQuiz::class)->findOneBy([ 'quiz' => $quiz, 'candidat' => $candidat ]);
$QuizResultat = $entityManager->getRepository(QuizResultat::class)->findOneBy([ 'quiz' => $quiz]);
if( !$userQuizResponse && $QuizResultat && $QuizResultat->isSelected()){
$showQuiz = true;
break;
}
}
if( $showQuiz ){
break;
}
}
if( $showQuiz && $quiz->isValidated() ){
$result[] = [
'id' => $quiz->getId(),
'nom' => $quiz->getNom()
];
}
}
return new JsonResponse($result);
}
#[Route('/get/module/fiche', name: 'get_module_fiche')]
public function moduleFicheList( Request $request, EntityManagerInterface $entityManager ): JsonResponse
{
$this->denyBackofficeAccess();
$result = [];
$demandeAffectation = $entityManager->getRepository(DemandeAffectation::class)->find($request->query->get('demandeA'));
if (!$demandeAffectation) {
return new JsonResponse($result);
}
$ficheList = $demandeAffectation->getDemandeService()->getModule()->getFicheEvals();
foreach( $ficheList as $fiche ){
$showFiche = false;
$demandePrincipales = $entityManager->getRepository(DemandeService::class)->getDemandesPrincipalesOfGroupe( $demandeAffectation->getDemandeService()->getGroupeDemande()->getId() );
foreach( $demandePrincipales as $demande ) {
foreach ($demande->getDemandeServiceCandidats() as $candidat) {
$candidatFiche = $entityManager->getRepository(CandidatFiche::class)->findOneBy([ 'fiche' => $fiche, 'candidat' => $candidat ]);
if( !$candidatFiche ){
$showFiche = true;
break;
}
}
if( $showFiche ){
break;
}
}
if( $showFiche && $fiche->isValidated() ){
$result[] = [
'id' => $fiche->getId(),
'nom' => $fiche->getLabel() . ' (' . $fiche->getId() . ')'
];
}
}
return new JsonResponse($result);
}
#[Route('/quiz/{quiz}/{token}', name: 'app_quiz')]
public function quiz(Quiz $quiz, $token, Request $request, EntityManagerInterface $entityManager): Response
{
$pourcentageCandidat = $entityManager->getRepository(PourcentageQuiz::class)->findOneBy([
'token' => $token,
'quiz' => $quiz,
]);
if (!$pourcentageCandidat || !$this->capabilityTokenManager->isValid($pourcentageCandidat->getToken())) {
$this->addFlash('danger', $this->trans('flash.token_invalid_expired'));
return $this->redirectToRoute('login');
}
if ($request->isMethod('POST')) {
$this->validateRequestCsrfToken($request, 'quiz');
$correctAnswredQuestionsNumber = 0;
foreach ($quiz->getQuizQuestions() as $Question) {
$answers = [];
$correct_answers = [];
// transform answers in array if not already one
if (is_array($request->request->all()[$Question->getIdFileds()])) {
$answers = $request->request->all()[$Question->getIdFileds()];
} else {
$answers[] = $request->request->all()[$Question->getIdFileds()];
}
// get correct answers
foreach ($Question->getOptions() as $option) {
// if correct push value in correct answers array
if ($option->isIsCorrect()) {
$correct_answers[] = $option->getValue();
}
}
// save user answers
foreach ($answers as $answer) {
// add answer
$repenseUser = new QuizReponse();
$repenseUser->setUser($this->getUser());
$repenseUser->setQuestion($Question);
$repenseUser->setValue($answer);
$entityManager->persist($repenseUser);
}
// check if correct question answer
if ( count( array_diff($answers, $correct_answers) ) == 0 ) {
$correctAnswredQuestionsNumber++;
}
$entityManager->flush();
}
// calc percent
$quizPercent = $correctAnswredQuestionsNumber * 100 / count($quiz->getQuizQuestions());
// save percent
$pourcentageCandidat->setPourcentage($quizPercent);
$entityManager->flush();
}
$mention = null;
if( !$quiz->getQuizResultats()->isEmpty() ){
foreach ($quiz->getQuizResultats()->last()->getMention() as $mentionQuiz){
$pourcentage = $pourcentageCandidat->getPourcentage();
if( isset( $pourcentage ) && $pourcentage >= $mentionQuiz->getPourcentage() && $pourcentage <= $mentionQuiz->getPourcentageMax() ){
$mention = $mentionQuiz->getMention();
}
}
}
return $this->render('quiz/index.html.twig', [
'quiz' => $quiz,
'pourcentageCandidat' => $pourcentageCandidat,
'mention' => $mention,
]);
}
#[Route('/fiche/{fiche}/{token}', name: 'app_fiche')]
public function fiche(FicheEval $fiche, $token, Request $request, EntityManagerInterface $entityManager): Response
{
$candidatAnswers = [];
$candidatFiche = $entityManager->getRepository(CandidatFiche::class)->findOneBy([
'token' => $token,
'fiche' => $fiche,
]);
if (!$candidatFiche || !$this->capabilityTokenManager->isValid($candidatFiche->getToken())) {
$this->addFlash('danger', $this->trans('flash.token_invalid_expired'));
return $this->redirectToRoute('login');
}
if ( $request->getMethod() == 'POST' and $candidatFiche->getReponseCandidatFiches()->isEmpty() ) {
$this->validateRequestCsrfToken($request, 'fiche');
foreach( $request->request->all()['questions'] as $question => $candidatAnswer ){
if( $question == 'critere' || $question == 'critere_avant' || $question == 'critere_apres' ){
foreach( $candidatAnswer as $critereId => $answer ){
$critere = $entityManager->find(CritereEvaluation::class, $critereId);
$reponseCandidatFiche = new ReponseCandidatFiche();
$reponseCandidatFiche->setCandidatFiche($candidatFiche);
$reponseCandidatFiche->setQuestion($question);
$reponseCandidatFiche->setCritere($critere);
$reponseCandidatFiche->setReponse($answer);
$entityManager->persist($reponseCandidatFiche);
$candidatAnswers[ $question ][ $critereId ] = $answer;
}
}else{
$reponseCandidatFiche = new ReponseCandidatFiche();
$reponseCandidatFiche->setCandidatFiche($candidatFiche);
$reponseCandidatFiche->setQuestion($question);
$reponseCandidatFiche->setReponse($candidatAnswer);
$entityManager->persist($reponseCandidatFiche);
$candidatAnswers[ $question ] = $candidatAnswer;
}
}
$entityManager->flush();
}else{
foreach( $candidatFiche->getReponseCandidatFiches() as $reponseCandidatFich ){
if( $reponseCandidatFich->getCritere() ){
$candidatAnswers[ $reponseCandidatFich->getQuestion() ][ $reponseCandidatFich->getCritere()->getId() ] = $reponseCandidatFich->getReponse();
}
else{
$candidatAnswers[ $reponseCandidatFich->getQuestion() ] = $reponseCandidatFich->getReponse();
}
}
}
return $this->render('fiche/index.html.twig', [
'fiche' => $fiche,
'candidatFiche' => $candidatFiche,
'candidatAnswers' => $candidatAnswers,
]);
}
#[Route('/fiche-satisfaction/{demandeService}', name: 'app_fiche_satisfaction')]
public function ficheSatisfaction(DemandeService $demandeService, Request $request, EntityManagerInterface $entityManager): Response
{
$userFiche = $entityManager->getRepository( UserFicheSatisfaction::class)->findOneBy( [ 'demandeService' => $demandeService->getId() ] );
$critere = $entityManager->getREpository(CritereSatisfaction::class)->findAll();
if( !$userFiche ){
// To do : handle exception
}
if ( $request->getMethod() == 'POST' /*and $userFiche->getReponseCandidatFiches()->isEmpty()*/
&& !$userFiche->isValidated()) {
$this->validateRequestCsrfToken($request, 'fiche_satisfaction');
$userFiche->setUser($this->getUser());
// $userFiche->setReponses($request->request->all()['satisfaction']['reponses']);
$userFiche->setNom($request->request->all()['satisfaction']['nom']);
$userFiche->setDomaine($request->request->all()['satisfaction']['domaine']);
$userFiche->setNombreSalarie($request->request->all()['satisfaction']['nombreSalarie']);
$userFiche->setAdresse($request->request->all()['satisfaction']['adresse']);
$userFiche->setContact($request->request->all()['satisfaction']['contact']);
$userFiche->setEmail($request->request->all()['satisfaction']['email']);
$userFiche->setFax($request->request->all()['satisfaction']['fax']);
$userFiche->setRemplirPar($request->request->all()['satisfaction']['remplirPar']);
$userFiche->setFonction($request->request->all()['satisfaction']['fonction']);
$userFiche->setAnalyseResultat($request->request->all()['satisfaction']['analyse_resultat']);
// $userFiche->setConclusion($request->request->all()['satisfaction']['conclusion']);
if(!$userFiche->isValidated()){
foreach ( $request->request->all()['satisfaction']['rows'] as $row ){
$reponse = new UserFicheSatisfactionReponse();
$critere = $entityManager->getRepository( CritereSatisfaction::class)->findOneBy( [ 'id' => $row['critere'] ] );
$reponse->setCritereSatisfaction($critere);
$reponse->setSatisfait( $row['satisfait'] );
$reponse->setUserFicheSatisfaction($userFiche);
$entityManager->persist($reponse);
}
}
$userFiche->setValidated( true );
$entityManager->flush();
}
return $this->render('fiche/fiche_satisfaction_service_intervention.html.twig', [
'user' => $demandeService->getUser(),
'userFiche' => $userFiche,
'criteres' => $critere
]);
}
#[Route('/fiche-collect-donnee', name: 'app_fiche_collect_donnee')]
public function ficheCollectDonnee(Request $request, EntityManagerInterface $entityManager, TranslatorInterface $translator): Response
{
if ($request->isMethod('POST')) {
$this->validateRequestCsrfToken($request, 'fiche_collect');
// Ici on pourrait persister dans une table dédiée. Pour l'instant, on récupère et on journalise.
// $data = $request->request->all('collecte');
// TODO: persister $data
$this->addFlash('success', $translator->trans('flash.fiche_collecte_saved'));
return $this->redirectToRoute('app_fiche_collect_donnee');
}
return $this->render('fiche/fiche_collect_donnee_service_intervention.html.twig', []);
}
#[Route('/attestation-participation/{candidat}', name: 'app_attestation_participation')]
public function attestationParticipation(DemandeServiceCandidat $candidat): Response
{
return $this->render('service/candidat_attestation_particiapation.html.twig', [
'candidat' => $candidat
]);
}
#[Route('/changeLocale/{_locale}', name: 'app_change_locale')]
public function changeLocale(Request $request, SafeRedirectValidator $redirectValidator)
{
// dd($request->attributes->get('_locale'));
if ($locale = $request->attributes->get('_locale')) {
$request->getSession()->set('_locale', $locale);
}
$referer = $request->headers->get('referer');
$target = $redirectValidator->sanitizeReferer($referer, $request->getHost());
return $this->redirect($target);
}
private function denyBackofficeAccess(): void
{
foreach (self::BACKOFFICE_ROLES as $role) {
if ($this->isGranted($role)) {
return;
}
}
$this->denyAccessUnlessGranted('ROLE_ADMIN');
}
}