src/Controller/UserController.php line 220

  1. <?php
  2. namespace App\Controller;
  3. use App\Entity\Formation;
  4. use App\Entity\Trainee;
  5. use App\Entity\TraineeFormation;
  6. use App\Entity\User;
  7. use App\Form\RegistrationFormType;
  8. use App\Form\TraineeFormType;
  9. use App\Form\UpdateUserFormType;
  10. use Doctrine\DBAL\Types\TextType;
  11. use PhpOffice\PhpSpreadsheet\Reader\Xlsx;
  12. use PhpOffice\PhpSpreadsheet\Spreadsheet;
  13. use PhpOffice\PhpSpreadsheet\Writer\Xls;
  14. use Symfony\Bundle\FrameworkBundle\Controller\AbstractController;
  15. use Symfony\Component\HttpFoundation\Request;
  16. use Symfony\Component\HttpFoundation\Response;
  17. use Symfony\Component\HttpFoundation\StreamedResponse;
  18. use Symfony\Component\Mailer\MailerInterface;
  19. use Symfony\Component\Mime\Email;
  20. use Symfony\Component\Routing\Annotation\Route;
  21. use Symfony\Component\PasswordHasher\Hasher\UserPasswordHasherInterface;
  22. use Symfony\Component\Security\Core\Security;
  23. use Symfony\Component\Security\Http\Authentication\UserAuthenticatorInterface;
  24. use App\Security\AppAuthenticator;
  25. use Doctrine\ORM\EntityManagerInterface;
  26. class UserController extends AbstractController
  27. {
  28.     /** User CRUD */
  29.     #[Route('/user'name'app_user')]
  30.     public function index(EntityManagerInterface $entityManager): Response
  31.     {
  32.         $users $entityManager->getRepository(User::class)->findUsers("ROLE_SUPER_ADMIN");
  33.         return $this->render('user/index.html.twig', [
  34.             'users' => $users,
  35.         ]);
  36.     }
  37.     #[Route('/user/add'name'app_add_user')]
  38.     public function addUser(Request $requestUserPasswordHasherInterface $userPasswordHasherUserAuthenticatorInterface $userAuthenticatorEntityManagerInterface $entityManager): Response
  39.     {
  40.         $user = new User();
  41.         $form $this->createForm(RegistrationFormType::class, $user);
  42.         $form->handleRequest($request);
  43.         if ($form->isSubmitted() && $form->isValid()) {
  44.              // Créer une instance de l'entité User avec les données du formulaire
  45.             $user $form->getData();
  46.             // Définir le rôle de l'utilisateur en tant qu'utilisateur
  47.             $user->setRoles(['ROLE_SUPER_ADMIN']);
  48.             // encode the plain password
  49.             $user->setPassword(
  50.                 $userPasswordHasher->hashPassword(
  51.                     $user,
  52.                     $form->get('password')->getData()
  53.                 )
  54.             );
  55.             $entityManager->persist($user);
  56.             $entityManager->flush();
  57.             // do anything else you need here, like send an email
  58.             return $this->redirectToRoute('app_user');
  59.         }
  60.         return $this->render('user/new.html.twig', [
  61.             'registrationForm' => $form->createView(),
  62.         ]);
  63.     }
  64.     #[Route('/user/profile/{id}'name'app_edit_user')]
  65.     public function updateUserProfile(Request $requestEntityManagerInterface $entityManager$id): Response
  66.     {
  67.         if($id) {
  68.             $user $entityManager->getRepository(User::class)->findOneBy(['id' => $id]);
  69.         } else {
  70.             $user $this->getUser();
  71.         }
  72.         $form $this->createForm(UpdateUserFormType::class, $user);
  73.         $form->handleRequest($request);
  74.         $teacher false;
  75.         if (in_array('ROLE_TEACHER'$this->getUser()->getRoles(), true)) {
  76.             $teacher true;
  77.         }
  78.         if ($form->isSubmitted() && $form->isValid()) {
  79.             $user $form->getData();
  80.             $entityManager->persist($user);
  81.             $entityManager->flush();
  82.             // do anything else you need here, like send an email
  83.             if ($teacher) {
  84.                 return $this->redirectToRoute('app_trainer');
  85.             }
  86.             return $this->redirectToRoute('app_user');
  87.         }
  88.         return $this->render('user/update.html.twig', [
  89.             'setUserForm' => $form->createView(),
  90.             'teacher' => $teacher
  91.         ]);
  92.     }
  93.     /** Trainees CRUD */
  94.     #[Route('/user/trainees'name'app_trainees')]
  95.     public function listOfTrainees(EntityManagerInterface $entityManager): Response
  96.     {
  97.         $users $entityManager->getRepository(Trainee::class)->findBy([],['id' => 'DESC']);
  98.         $isTeacher false;
  99.         if (in_array('ROLE_TEACHER'$this->getUser()->getRoles(), true)) {
  100.             $isTeacher true;
  101.         }
  102.         return $this->render('trainees/trainees.html.twig', [
  103.             'users' => $users,
  104.             'base_template' => $isTeacher 'baseTeacher.html.twig' 'baseAdmin.html.twig'
  105.         ]);
  106.     }
  107.     #[Route('/user/addTrainee/{formationId}'name'app_add_trainee')]
  108.     public function addTrainees(Request $requestEntityManagerInterface $entityManager$formationId null): Response
  109.     {
  110.         $user = new Trainee();
  111.         $form $this->createForm(TraineeFormType::class, $user);
  112.         $form->handleRequest($request);
  113.         $type "";
  114.         if($formationId) {
  115.             $formation $entityManager->getRepository(Formation::class)->findOneBy(['id' => $formationId]);
  116.             $type $formation->getType();
  117.         }
  118.         if ($form->isSubmitted() && $form->isValid()) {
  119.             $user $form->getData();
  120.             $entityManager->persist($user);
  121.             $entityManager->flush();
  122.             if($formationId) {
  123.                 $formation  $entityManager->getRepository(Formation::class)->findOneBy(['id'=> $formationId]);
  124.                 $TraineeFormation = new TraineeFormation();
  125.                 $TraineeFormation->setTrainee($user);
  126.                 $TraineeFormation->setFormation($formation);
  127.                 $entityManager->persist($TraineeFormation);
  128.                 $entityManager->flush();
  129.                 return $this->redirectToRoute('app_courses_manage', ['idFormation' => $formationId'type' => $formation->getType()]);
  130.             } else {
  131.                 return $this->redirectToRoute('app_trainees');
  132.             }
  133.         }
  134.         $isTeacher false;
  135.         if (in_array('ROLE_TEACHER'$this->getUser()->getRoles(), true)) {
  136.             $isTeacher true;
  137.         }
  138.         return $this->render('trainees/new_trainee.html.twig', [
  139.             'registrationForm' => $form->createView(),
  140.             'formationId' => $formationId,
  141.             'typeFormation' => $type,
  142.             'base_template' => $isTeacher 'baseTeacher.html.twig' 'baseAdmin.html.twig'
  143.         ]);
  144.     }
  145.     /** Teacher CRUD */
  146.     #[Route('/user/teachers'name'app_teachers')]
  147.     public function listOfTeacher(EntityManagerInterface $entityManager): Response
  148.     {
  149.         $users $entityManager->getRepository(User::class)->findUsers('ROLE_TEACHER');
  150.         return $this->render('user/teachers.html.twig', [
  151.             'users' => $users,
  152.         ]);
  153.     }
  154.     #[Route('/user/addTeacher'name'app_add_teacher')]
  155.     public function addTeacher(Request $requestEntityManagerInterface $entityManagerUserPasswordHasherInterface $userPasswordHasher): Response
  156.     {
  157.         $user = new User();
  158.         $form $this->createForm(UpdateUserFormType::class, $user);
  159.         $form->handleRequest($request);
  160.         if ($form->isSubmitted() && $form->isValid()) {
  161.             $user $form->getData();
  162.             //set default password for Trainees 00000000
  163.             $user->setPassword(
  164.                 $userPasswordHasher->hashPassword(
  165.                     $user,
  166.                     '00000000'
  167.                 )
  168.             );
  169.             $user->setRoles(['ROLE_TEACHER']);
  170.             $entityManager->persist($user);
  171.             $entityManager->flush();
  172.             return $this->redirectToRoute('app_teachers');
  173.         }
  174.         return $this->render('user/new_teacher.html.twig', [
  175.             'registrationForm' => $form->createView(),
  176.         ]);
  177.     }
  178.     #[Route('/trainee/edit/{id}/{idFormation}'name'app_edit_trainee')]
  179.     public function updateTrainee(Request $requestEntityManagerInterface $entityManager$id$idFormation null): Response
  180.     {
  181.         $user $entityManager->getRepository(Trainee::class)->findOneBy(['id' => $id]);
  182.         $form $this->createForm(TraineeFormType::class, $user);
  183.         $type "";
  184.         if($idFormation) {
  185.             $formation $entityManager->getRepository(Formation::class)->findOneBy(['id' => $idFormation]);
  186.             $type $formation->getType();
  187.         }
  188.         $form->handleRequest($request);
  189.         if ($form->isSubmitted() && $form->isValid()) {
  190.             $user $form->getData();
  191.             $entityManager->persist($user);
  192.             $entityManager->flush();
  193.             if ($idFormation !== null) {
  194.                 return $this->redirectToRoute('app_courses_manage', ['type' => $type'idFormation' => $idFormation]);
  195.             }
  196.             return $this->redirectToRoute('app_trainees');
  197.         }
  198.         $isTeacher false;
  199.         if (in_array('ROLE_TEACHER'$this->getUser()->getRoles(), true)) {
  200.             $isTeacher true;
  201.         }
  202.         return $this->render('trainees/update_trainee.html.twig', [
  203.             'setTraineeForm' => $form->createView(),
  204.             'typeFormation' => $type,
  205.             'base_template' => $isTeacher 'baseTeacher.html.twig' 'baseAdmin.html.twig'
  206.         ]);
  207.     }
  208.     #[Route('/update-password'name'app_update_password')]
  209.     public function updatePassword(Request $requestEntityManagerInterface $entityManagerMailerInterface $mailer): Response
  210.     {
  211.         if ($request->isMethod('POST')) {
  212.             $email $request->request->get('email');
  213.             if($email != "") {
  214.                 $user $entityManager->getRepository(User::class)->findOneBy(['email' => $email]);
  215.                 if ($user) {
  216.                     //send mail to user with token
  217.                     $link 'https://adformation.online'.$this->generateUrl('app_update_user_password',['email'=>$email]);
  218.                     $emailToSend = (new Email())
  219.                         ->from('noreply-formation@adconseil.eu')
  220.                         ->subject('Modification de mot de passe')
  221.                         ->html('<p>Bonjour, cliquer sur le lien pour modifier votre mot de passe:<br><a href="'.$link.'">'.$link.'</a></p>')
  222.                         ->to($user->getEmail());
  223.                     $mailer->send($emailToSend);
  224.                     $this->addFlash('success'"Un email est envoyé à votre compte.");
  225.                     return $this->redirectToRoute('app_update_password');
  226.                 } else {
  227.                     // show error message
  228.                     $this->addFlash('warning'"Cet email n'existe pas!");
  229.                     return $this->redirectToRoute('app_update_password');
  230.                 }
  231.             }
  232.             return $this->redirectToRoute('app_update_password');
  233.         }
  234.         return $this->render('security/resetPassword.html.twig', [
  235.         ]);
  236.     }
  237.     #[Route('/update-user-password/{email}'name'app_update_user_password')]
  238.     public function updateUserPassword(Request $requestEntityManagerInterface $entityManager,UserPasswordHasherInterface $userPasswordHasher$email): Response
  239.     {
  240.         if ($request->isMethod('POST')) {
  241.             $password$request->request->get('password');
  242.             if($email != "" && $password != "") {
  243.                 $user $entityManager->getRepository(User::class)->findOneBy(['email' => $email]);
  244.                 if ($user) {
  245.                     //update password
  246.                     $user->setPassword(
  247.                         $userPasswordHasher->hashPassword(
  248.                             $user,
  249.                             $password
  250.                         )
  251.                     );
  252.                     $entityManager->persist($user);
  253.                     $entityManager->flush();
  254.                     $this->addFlash('success'"Votre mot de passe aura été changé avec succès");
  255.                     return $this->redirectToRoute('app_login');
  256.                 } else {
  257.                     // show error message
  258.                     $this->addFlash('warning'"Le lien est incorrect");
  259.                     return $this->redirectToRoute('app_update_user_password');
  260.                 }
  261.             }
  262.             return $this->redirectToRoute('app_login');
  263.         }
  264.         return $this->render('security/newPassword.html.twig', [
  265.         ]);
  266.     }
  267.     #[Route('/trainee/delete/{id}'name'app_delete_trainee')]
  268.     public function deleteTrainee(EntityManagerInterface $entityManager$id): Response
  269.     {
  270.         $trainee $entityManager->getRepository(Trainee::class)->findOneBy(['id' => $id]);
  271.         $traineeFormation $entityManager->getRepository(TraineeFormation::class)->findBy(['trainee' => $trainee]);
  272.         //find if trainee is affected to formation
  273.         $object = new \stdClass();
  274.         if($traineeFormation) {
  275.             foreach ($traineeFormation as $trfor) {
  276.                  $entityManager->remove($trfor);
  277.             }
  278.             $entityManager->flush();
  279.         }
  280.         $entityManager->remove($trainee);
  281.         $entityManager->flush();
  282.         $object->status true;
  283.         $object->message "Le stagiaire est supprimé avec succès";
  284.         return new Response(json_encode($object));
  285.     }
  286.     #[Route('/teacher/delete/{id}'name'app_delete_teacher')]
  287.     public function deleteTeacher(EntityManagerInterface $entityManager$id): Response
  288.     {
  289.         $teacher $entityManager->getRepository(User::class)->findOneBy(['id' => $id]);
  290.         //find if trainee is affected to formation
  291.         $teacherFormation $entityManager->getRepository(Formation::class)->findOneBy(['formateur' => $teacher]);
  292.         $object = new \stdClass();
  293.         if ($teacherFormation) {
  294.             $object->status false;
  295.             $object->message "Ce formateur est enregistré dans une formation et il est impossible de le supprimer.";
  296.         } else {
  297.             $entityManager->remove($teacher);
  298.             $entityManager->flush();
  299.             $object->status true;
  300.             $object->message "Le formateur est supprimé avec succès";
  301.         }
  302.         return new Response(json_encode($object));
  303.     }
  304.     #[Route('/user/delete/{id}'name'app_delete_user')]
  305.     public function deleteUser(EntityManagerInterface $entityManager$id): Response
  306.     {
  307.         $user $entityManager->getRepository(User::class)->findOneBy(['id' => $id]);
  308.         $object = new \stdClass();
  309.         $entityManager->remove($user);
  310.         $entityManager->flush();
  311.         $object->status true;
  312.         $object->message "L'utilisateur est supprimé avec succès";
  313.         return new Response(json_encode($object));
  314.     }
  315.     #[Route('/downloadTrainee'name'app_download_trainee')]
  316.     public function downloadTrainee(EntityManagerInterface $entityManager): Response
  317.     {
  318.         $users $entityManager->getRepository(Trainee::class)->findBy([],['id' => 'DESC']);
  319.         $spreadsheet = new Spreadsheet();
  320.         $sheet $spreadsheet->getActiveSheet();
  321.         $sheet->setCellValue('A1''Nom');
  322.         $sheet->setCellValue('B1''Prénom');
  323.         $sheet->setCellValue('C1''Fonction');
  324.         $sheet->setCellValue('D1''Email');
  325.         $counter 2;
  326.         foreach ($users as $user) {
  327.             $sheet->setCellValue('A' $counter$user->getFirstName());
  328.             $sheet->setCellValue('B' $counter$user->getLastName());
  329.             $sheet->setCellValue('C' $counter$user->getPosition());
  330.             $sheet->setCellValue('D' $counter$user->getEmail());
  331.             $counter++;
  332.         }
  333.         $writer = new Xls($spreadsheet);
  334.         $response =  new StreamedResponse(
  335.             function () use ($writer) {
  336.                 $writer->save('php://output');
  337.             }
  338.         );
  339.         $fileName "ExportEmails_".date('m-d-Y_hia').".xls";
  340.         $response->headers->set('Content-Type''application/vnd.ms-excel');
  341.         $response->headers->set('Content-Disposition''attachment; filename=' '"' $fileName '"');
  342.         $response->headers->set('Cache-Control','max-age=0');
  343.         return $response;
  344.         //$this->addFlash('success', "Les stagiaires sont télechargées avec succès.");
  345.        // return $this->redirectToRoute('app_trainees');
  346.     }
  347.     #[Route('/downloadTraineeByFormation/{idFormation}'name'app_download_trainee_by_formation')]
  348.     public function downloadTraineeByFormation(EntityManagerInterface $entityManager$idFormation null): Response
  349.     {
  350.         $course =  $entityManager->getRepository(Formation::class)->find($idFormation);
  351.         $formationUser $entityManager->getRepository(TraineeFormation::class)->findBy(['formation' => $course]);
  352.         $spreadsheet = new Spreadsheet();
  353.         $sheet $spreadsheet->getActiveSheet();
  354.         $sheet->setCellValue('A1''Nom');
  355.         $sheet->setCellValue('B1''Prénom');
  356.         $sheet->setCellValue('C1''Fonction');
  357.         $sheet->setCellValue('D1''Email');
  358.         $counter 2;
  359.         foreach ($formationUser as $item) {
  360.             $sheet->setCellValue('A' $counter$item->getTrainee()->getFirstName());
  361.             $sheet->setCellValue('B' $counter$item->getTrainee()->getLastName());
  362.             $sheet->setCellValue('C' $counter$item->getTrainee()->getPosition());
  363.             $sheet->setCellValue('D' $counter$item->getTrainee()->getEmail());
  364.             $counter++;
  365.         }
  366.         $writer = new Xls($spreadsheet);
  367.         $response =  new StreamedResponse(
  368.             function () use ($writer) {
  369.                 $writer->save('php://output');
  370.             }
  371.         );
  372.         $fileName "ExportEmails_".str_replace(' ','',$course->getNomFormation())."_".date('m-d-Y_hia').".xls";
  373.         $response->headers->set('Content-Type''application/vnd.ms-excel');
  374.         $response->headers->set('Content-Disposition''attachment; filename=' '"' $fileName '"');
  375.         $response->headers->set('Cache-Control','max-age=0');
  376.         return $response;
  377.         //$this->addFlash('success', "Les stagiaires sont télechargées avec succès.");
  378.         // return $this->redirectToRoute('app_trainees');
  379.     }
  380.     #[Route('/user/profileAdmin/{id}'name'app_edit_admin')]
  381.     public function updateAdminProfile(Request $requestEntityManagerInterface $entityManager$id): Response
  382.     {
  383.         if($id) {
  384.             $user $entityManager->getRepository(User::class)->findOneBy(['id' => $id]);
  385.         } else {
  386.             $user $this->getUser();
  387.         }
  388.         $form $this->createForm(UpdateUserFormType::class, $user);
  389.         $form->handleRequest($request);
  390.         $teacher false;
  391.         if (in_array('ROLE_TEACHER'$this->getUser()->getRoles(), true)) {
  392.             $teacher true;
  393.         }
  394.         if ($form->isSubmitted() && $form->isValid()) {
  395.             $user $form->getData();
  396.             $entityManager->persist($user);
  397.             $entityManager->flush();
  398.             // do anything else you need here, like send an email
  399.             if ($teacher) {
  400.                 return $this->redirectToRoute('app_trainer');
  401.             }
  402.             return $this->redirectToRoute('app_user');
  403.         }
  404.         return $this->render('user/update.html.twig', [
  405.             'setUserForm' => $form->createView(),
  406.             'teacher' => $teacher
  407.         ]);
  408.     }
  409.     #[Route('/user/profileFormateur/{id}'name'app_edit_formateur')]
  410.     public function updateFormateurProfile(Request $requestEntityManagerInterface $entityManager$id): Response
  411.     {
  412.         if($id) {
  413.             $user $entityManager->getRepository(User::class)->findOneBy(['id' => $id]);
  414.         } else {
  415.             $user $this->getUser();
  416.         }
  417.         $form $this->createForm(UpdateUserFormType::class, $user);
  418.         $form->handleRequest($request);
  419.         $teacher false;
  420.         if (in_array('ROLE_TEACHER'$this->getUser()->getRoles(), true)) {
  421.             $teacher true;
  422.         }
  423.         if ($form->isSubmitted() && $form->isValid()) {
  424.             $user $form->getData();
  425.             $entityManager->persist($user);
  426.             $entityManager->flush();
  427.             // do anything else you need here, like send an email
  428.             if ($teacher) {
  429.                 return $this->redirectToRoute('app_trainer');
  430.             }
  431.             return $this->redirectToRoute('app_user');
  432.         }
  433.         return $this->render('user/update.html.twig', [
  434.             'setUserForm' => $form->createView(),
  435.             'teacher' => $teacher
  436.         ]);
  437.     }
  438.     #[Route('/user/loginTeacher/{id}'name'app_login_formateur')]
  439.     public function loginTeacher(EntityManagerInterface $entityManager,
  440.                                  UserAuthenticatorInterface $userAuthenticator,
  441.                                  AppAuthenticator $authenticator,
  442.                                  Request $request,
  443.         $id): Response
  444.     {
  445.         if (in_array('ROLE_SUPER_ADMIN'$this->getUser()->getRoles(), true)) {
  446.             $admin =$this->getUser();
  447.             $request->getSession()->set('adminId'$admin->getId());
  448.         }
  449.         // Load the user by ID (assuming Doctrine)
  450.         $user $entityManager->getRepository(User::class)->findOneBy(['id' => $id]);
  451.         // Authenticate the user
  452.         $userAuthenticator->authenticateUser($user$authenticator$request);
  453.         // Redirect to homepage (or another route)
  454.         if (in_array('ROLE_SUPER_ADMIN'$this->getUser()->getRoles(), true)) {
  455.             return $this->redirectToRoute('app_home');
  456.         } else {
  457.             return $this->redirectToRoute('app_home_trainer');
  458.         }
  459.     }
  460. }