src/Controller/UserController.php line 230

  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.         $type "";
  112.         $formation null;
  113.         if ($formationId) {
  114.             $formation $entityManager->getRepository(Formation::class)->findOneBy(['id' => $formationId]);
  115.             if ($formation) {
  116.                 $type $formation->getType();
  117.                 if( $formation->getType() == "intra") {
  118.                     $customer $formation->getCustomers();
  119.                     if ($customer) {
  120.                         $user->setCustomer($customer[0]);
  121.                     }
  122.                 }  
  123.             }
  124.         }
  125.         // hide comments field on the trainee edit view
  126.         $form $this->createForm(TraineeFormType::class, $user, ['show_comments' => false]);
  127.         $form->handleRequest($request);
  128.         if ($form->isSubmitted() && $form->isValid()) {
  129.             $user $form->getData();
  130.             $entityManager->persist($user);
  131.             $entityManager->flush();
  132.             if($formationId) {
  133.                 $formation  $entityManager->getRepository(Formation::class)->findOneBy(['id'=> $formationId]);
  134.                 $TraineeFormation = new TraineeFormation();
  135.                 $TraineeFormation->setTrainee($user);
  136.                 $TraineeFormation->setFormation($formation);
  137.                 $entityManager->persist($TraineeFormation);
  138.                 $entityManager->flush();
  139.                 return $this->redirectToRoute('app_courses_manage', ['idFormation' => $formationId'type' => $formation->getType()]);
  140.             } else {
  141.                 return $this->redirectToRoute('app_trainees');
  142.             }
  143.         }
  144.         $isTeacher false;
  145.         if (in_array('ROLE_TEACHER'$this->getUser()->getRoles(), true)) {
  146.             $isTeacher true;
  147.         }
  148.         return $this->render('trainees/new_trainee.html.twig', [
  149.             'registrationForm' => $form->createView(),
  150.             'formationId' => $formationId,
  151.             'typeFormation' => $type,
  152.             'base_template' => $isTeacher 'baseTeacher.html.twig' 'baseAdmin.html.twig'
  153.         ]);
  154.     }
  155.     /** Teacher CRUD */
  156.     #[Route('/user/teachers'name'app_teachers')]
  157.     public function listOfTeacher(EntityManagerInterface $entityManager): Response
  158.     {
  159.         $users $entityManager->getRepository(User::class)->findUsers('ROLE_TEACHER');
  160.         return $this->render('user/teachers.html.twig', [
  161.             'users' => $users,
  162.         ]);
  163.     }
  164.     #[Route('/user/addTeacher'name'app_add_teacher')]
  165.     public function addTeacher(Request $requestEntityManagerInterface $entityManagerUserPasswordHasherInterface $userPasswordHasher): Response
  166.     {
  167.         $user = new User();
  168.         $form $this->createForm(UpdateUserFormType::class, $user);
  169.         $form->handleRequest($request);
  170.         if ($form->isSubmitted() && $form->isValid()) {
  171.             $user $form->getData();
  172.             //set default password for Trainees 00000000
  173.             $user->setPassword(
  174.                 $userPasswordHasher->hashPassword(
  175.                     $user,
  176.                     '00000000'
  177.                 )
  178.             );
  179.             $user->setRoles(['ROLE_TEACHER']);
  180.             $entityManager->persist($user);
  181.             $entityManager->flush();
  182.             return $this->redirectToRoute('app_teachers');
  183.         }
  184.         return $this->render('user/new_teacher.html.twig', [
  185.             'registrationForm' => $form->createView(),
  186.         ]);
  187.     }
  188.     #[Route('/trainee/edit/{id}/{idFormation}'name'app_edit_trainee')]
  189.     public function updateTrainee(Request $requestEntityManagerInterface $entityManager$id$idFormation null): Response
  190.     {
  191.         $user $entityManager->getRepository(Trainee::class)->findOneBy(['id' => $id]);
  192.         $form $this->createForm(TraineeFormType::class, $user, ['show_comments' => false]);
  193.         $type "";
  194.         if($idFormation) {
  195.             $formation $entityManager->getRepository(Formation::class)->findOneBy(['id' => $idFormation]);
  196.             $type $formation->getType();
  197.         }
  198.         $form->handleRequest($request);
  199.         if ($form->isSubmitted() && $form->isValid()) {
  200.             $user $form->getData();
  201.             $entityManager->persist($user);
  202.             $entityManager->flush();
  203.             if ($idFormation !== null) {
  204.                 return $this->redirectToRoute('app_courses_manage', ['type' => $type'idFormation' => $idFormation]);
  205.             }
  206.             return $this->redirectToRoute('app_trainees');
  207.         }
  208.         $isTeacher false;
  209.         if (in_array('ROLE_TEACHER'$this->getUser()->getRoles(), true)) {
  210.             $isTeacher true;
  211.         }
  212.         return $this->render('trainees/update_trainee.html.twig', [
  213.             'setTraineeForm' => $form->createView(),
  214.             'typeFormation' => $type,
  215.             'base_template' => $isTeacher 'baseTeacher.html.twig' 'baseAdmin.html.twig'
  216.         ]);
  217.     }
  218.     #[Route('/update-password'name'app_update_password')]
  219.     public function updatePassword(Request $requestEntityManagerInterface $entityManagerMailerInterface $mailer): Response
  220.     {
  221.         if ($request->isMethod('POST')) {
  222.             $email $request->request->get('email');
  223.             if($email != "") {
  224.                 $user $entityManager->getRepository(User::class)->findOneBy(['email' => $email]);
  225.                 if ($user) {
  226.                     //send mail to user with token
  227.                     $link 'https://adformation.online'.$this->generateUrl('app_update_user_password',['email'=>$email]);
  228.                     $emailToSend = (new Email())
  229.                         ->from('noreply-formation@adconseil.eu')
  230.                         ->subject('Modification de mot de passe')
  231.                         ->html('<p>Bonjour, cliquer sur le lien pour modifier votre mot de passe:<br><a href="'.$link.'">'.$link.'</a></p>')
  232.                         ->to($user->getEmail());
  233.                     $mailer->send($emailToSend);
  234.                     $this->addFlash('success'"Un email est envoyé à votre compte.");
  235.                     return $this->redirectToRoute('app_update_password');
  236.                 } else {
  237.                     // show error message
  238.                     $this->addFlash('warning'"Cet email n'existe pas!");
  239.                     return $this->redirectToRoute('app_update_password');
  240.                 }
  241.             }
  242.             return $this->redirectToRoute('app_update_password');
  243.         }
  244.         return $this->render('security/resetPassword.html.twig', [
  245.         ]);
  246.     }
  247.     #[Route('/update-user-password/{email}'name'app_update_user_password')]
  248.     public function updateUserPassword(Request $requestEntityManagerInterface $entityManager,UserPasswordHasherInterface $userPasswordHasher$email): Response
  249.     {
  250.         if ($request->isMethod('POST')) {
  251.             $password$request->request->get('password');
  252.             if($email != "" && $password != "") {
  253.                 $user $entityManager->getRepository(User::class)->findOneBy(['email' => $email]);
  254.                 if ($user) {
  255.                     //update password
  256.                     $user->setPassword(
  257.                         $userPasswordHasher->hashPassword(
  258.                             $user,
  259.                             $password
  260.                         )
  261.                     );
  262.                     $entityManager->persist($user);
  263.                     $entityManager->flush();
  264.                     $this->addFlash('success'"Votre mot de passe aura été changé avec succès");
  265.                     return $this->redirectToRoute('app_login');
  266.                 } else {
  267.                     // show error message
  268.                     $this->addFlash('warning'"Le lien est incorrect");
  269.                     return $this->redirectToRoute('app_update_user_password');
  270.                 }
  271.             }
  272.             return $this->redirectToRoute('app_login');
  273.         }
  274.         return $this->render('security/newPassword.html.twig', [
  275.         ]);
  276.     }
  277.     #[Route('/trainee/delete/{id}'name'app_delete_trainee')]
  278.     public function deleteTrainee(EntityManagerInterface $entityManager$id): Response
  279.     {
  280.         $trainee $entityManager->getRepository(Trainee::class)->findOneBy(['id' => $id]);
  281.         $traineeFormation $entityManager->getRepository(TraineeFormation::class)->findBy(['trainee' => $trainee]);
  282.         //find if trainee is affected to formation
  283.         $object = new \stdClass();
  284.         if($traineeFormation) {
  285.             foreach ($traineeFormation as $trfor) {
  286.                  $entityManager->remove($trfor);
  287.             }
  288.             $entityManager->flush();
  289.         }
  290.         $entityManager->remove($trainee);
  291.         $entityManager->flush();
  292.         $object->status true;
  293.         $object->message "Le stagiaire est supprimé avec succès";
  294.         return new Response(json_encode($object));
  295.     }
  296.     #[Route('/teacher/delete/{id}'name'app_delete_teacher')]
  297.     public function deleteTeacher(EntityManagerInterface $entityManager$id): Response
  298.     {
  299.         $teacher $entityManager->getRepository(User::class)->findOneBy(['id' => $id]);
  300.         //find if trainee is affected to formation
  301.         $teacherFormation $entityManager->getRepository(Formation::class)->findOneBy(['formateur' => $teacher]);
  302.         $object = new \stdClass();
  303.         if ($teacherFormation) {
  304.             $object->status false;
  305.             $object->message "Ce formateur est enregistré dans une formation et il est impossible de le supprimer.";
  306.         } else {
  307.             $entityManager->remove($teacher);
  308.             $entityManager->flush();
  309.             $object->status true;
  310.             $object->message "Le formateur est supprimé avec succès";
  311.         }
  312.         return new Response(json_encode($object));
  313.     }
  314.     #[Route('/user/delete/{id}'name'app_delete_user')]
  315.     public function deleteUser(EntityManagerInterface $entityManager$id): Response
  316.     {
  317.         $user $entityManager->getRepository(User::class)->findOneBy(['id' => $id]);
  318.         $object = new \stdClass();
  319.         $entityManager->remove($user);
  320.         $entityManager->flush();
  321.         $object->status true;
  322.         $object->message "L'utilisateur est supprimé avec succès";
  323.         return new Response(json_encode($object));
  324.     }
  325.     #[Route('/downloadTrainee'name'app_download_trainee')]
  326.     public function downloadTrainee(EntityManagerInterface $entityManager): Response
  327.     {
  328.         $users $entityManager->getRepository(Trainee::class)->findBy([],['id' => 'DESC']);
  329.         $spreadsheet = new Spreadsheet();
  330.         $sheet $spreadsheet->getActiveSheet();
  331.         $sheet->setCellValue('A1''Nom');
  332.         $sheet->setCellValue('B1''Prénom');
  333.         $sheet->setCellValue('C1''Fonction');
  334.         $sheet->setCellValue('D1''Email');
  335.         $counter 2;
  336.         foreach ($users as $user) {
  337.             $sheet->setCellValue('A' $counter$user->getFirstName());
  338.             $sheet->setCellValue('B' $counter$user->getLastName());
  339.             $sheet->setCellValue('C' $counter$user->getPosition());
  340.             $sheet->setCellValue('D' $counter$user->getEmail());
  341.             $counter++;
  342.         }
  343.         $writer = new Xls($spreadsheet);
  344.         $response =  new StreamedResponse(
  345.             function () use ($writer) {
  346.                 $writer->save('php://output');
  347.             }
  348.         );
  349.         $fileName "ExportEmails_".date('m-d-Y_hia').".xls";
  350.         $response->headers->set('Content-Type''application/vnd.ms-excel');
  351.         $response->headers->set('Content-Disposition''attachment; filename=' '"' $fileName '"');
  352.         $response->headers->set('Cache-Control','max-age=0');
  353.         return $response;
  354.         //$this->addFlash('success', "Les stagiaires sont télechargées avec succès.");
  355.        // return $this->redirectToRoute('app_trainees');
  356.     }
  357.     #[Route('/downloadTraineeByFormation/{idFormation}'name'app_download_trainee_by_formation')]
  358.     public function downloadTraineeByFormation(EntityManagerInterface $entityManager$idFormation null): Response
  359.     {
  360.         $course =  $entityManager->getRepository(Formation::class)->find($idFormation);
  361.         $formationUser $entityManager->getRepository(TraineeFormation::class)->findBy(['formation' => $course]);
  362.         $spreadsheet = new Spreadsheet();
  363.         $sheet $spreadsheet->getActiveSheet();
  364.         $sheet->setCellValue('A1''Nom');
  365.         $sheet->setCellValue('B1''Prénom');
  366.         $sheet->setCellValue('C1''Fonction');
  367.         $sheet->setCellValue('D1''Email');
  368.         $counter 2;
  369.         foreach ($formationUser as $item) {
  370.             $sheet->setCellValue('A' $counter$item->getTrainee()->getFirstName());
  371.             $sheet->setCellValue('B' $counter$item->getTrainee()->getLastName());
  372.             $sheet->setCellValue('C' $counter$item->getTrainee()->getPosition());
  373.             $sheet->setCellValue('D' $counter$item->getTrainee()->getEmail());
  374.             $counter++;
  375.         }
  376.         $writer = new Xls($spreadsheet);
  377.         $response =  new StreamedResponse(
  378.             function () use ($writer) {
  379.                 $writer->save('php://output');
  380.             }
  381.         );
  382.         $fileName "ExportEmails_".str_replace(' ','',$course->getNomFormation())."_".date('m-d-Y_hia').".xls";
  383.         $response->headers->set('Content-Type''application/vnd.ms-excel');
  384.         $response->headers->set('Content-Disposition''attachment; filename=' '"' $fileName '"');
  385.         $response->headers->set('Cache-Control','max-age=0');
  386.         return $response;
  387.         //$this->addFlash('success', "Les stagiaires sont télechargées avec succès.");
  388.         // return $this->redirectToRoute('app_trainees');
  389.     }
  390.     #[Route('/user/profileAdmin/{id}'name'app_edit_admin')]
  391.     public function updateAdminProfile(Request $requestEntityManagerInterface $entityManager$id): Response
  392.     {
  393.         if($id) {
  394.             $user $entityManager->getRepository(User::class)->findOneBy(['id' => $id]);
  395.         } else {
  396.             $user $this->getUser();
  397.         }
  398.         $form $this->createForm(UpdateUserFormType::class, $user);
  399.         $form->handleRequest($request);
  400.         $teacher false;
  401.         if (in_array('ROLE_TEACHER'$this->getUser()->getRoles(), true)) {
  402.             $teacher true;
  403.         }
  404.         if ($form->isSubmitted() && $form->isValid()) {
  405.             $user $form->getData();
  406.             $entityManager->persist($user);
  407.             $entityManager->flush();
  408.             // do anything else you need here, like send an email
  409.             if ($teacher) {
  410.                 return $this->redirectToRoute('app_trainer');
  411.             }
  412.             return $this->redirectToRoute('app_user');
  413.         }
  414.         return $this->render('user/update.html.twig', [
  415.             'setUserForm' => $form->createView(),
  416.             'teacher' => $teacher
  417.         ]);
  418.     }
  419.     #[Route('/user/profileFormateur/{id}'name'app_edit_formateur')]
  420.     public function updateFormateurProfile(Request $requestEntityManagerInterface $entityManager$id): Response
  421.     {
  422.         if($id) {
  423.             $user $entityManager->getRepository(User::class)->findOneBy(['id' => $id]);
  424.         } else {
  425.             $user $this->getUser();
  426.         }
  427.         $form $this->createForm(UpdateUserFormType::class, $user);
  428.         $form->handleRequest($request);
  429.         $teacher false;
  430.         if (in_array('ROLE_TEACHER'$this->getUser()->getRoles(), true)) {
  431.             $teacher true;
  432.         }
  433.         if ($form->isSubmitted() && $form->isValid()) {
  434.             $user $form->getData();
  435.             $entityManager->persist($user);
  436.             $entityManager->flush();
  437.             // do anything else you need here, like send an email
  438.             if ($teacher) {
  439.                 return $this->redirectToRoute('app_trainer');
  440.             }
  441.             return $this->redirectToRoute('app_user');
  442.         }
  443.         return $this->render('user/update.html.twig', [
  444.             'setUserForm' => $form->createView(),
  445.             'teacher' => $teacher
  446.         ]);
  447.     }
  448.     #[Route('/user/loginTeacher/{id}'name'app_login_formateur')]
  449.     public function loginTeacher(EntityManagerInterface $entityManager,
  450.                                  UserAuthenticatorInterface $userAuthenticator,
  451.                                  AppAuthenticator $authenticator,
  452.                                  Request $request,
  453.         $id): Response
  454.     {
  455.         if (in_array('ROLE_SUPER_ADMIN'$this->getUser()->getRoles(), true)) {
  456.             $admin =$this->getUser();
  457.             $request->getSession()->set('adminId'$admin->getId());
  458.         }
  459.         // Load the user by ID (assuming Doctrine)
  460.         $user $entityManager->getRepository(User::class)->findOneBy(['id' => $id]);
  461.         // Authenticate the user
  462.         $userAuthenticator->authenticateUser($user$authenticator$request);
  463.         // Redirect to homepage (or another route)
  464.         if (in_array('ROLE_SUPER_ADMIN'$this->getUser()->getRoles(), true)) {
  465.             return $this->redirectToRoute('app_home');
  466.         } else {
  467.             return $this->redirectToRoute('app_home_trainer');
  468.         }
  469.     }
  470. }