src/Controller/RegistrationController.php line 542

Open in your IDE?
  1. <?php
  2. namespace App\Controller;
  3. use App\Entity\User;
  4. use App\Entity\Autres;
  5. use App\Entity\Adresse;
  6. use App\Entity\AgentInterne;
  7. use App\Entity\ChargeAssistance;
  8. use App\Entity\ChargeFormation;
  9. use App\Entity\Dae;
  10. use App\Entity\Delegation;
  11. use App\Entity\EnterprisePartenaire;
  12. use App\Form\AutresType;
  13. use App\Form\AdresseType;
  14. use App\Entity\Entreprise;
  15. use App\Entity\Partenaire;
  16. use App\Entity\Particulier;
  17. use App\Form\AgentInterneType;
  18. use App\Form\ChargeAssistanceType;
  19. use App\Form\ChargeFormationType;
  20. use App\Form\EntrepriseType;
  21. use App\Form\PartenaireNationalType;
  22. use App\Form\DaeType;
  23. use App\Form\PartenaireRegionalType;
  24. use App\Form\PartenaireType;
  25. use App\Form\ParticulierType;
  26. use App\Security\EmailVerifier;
  27. use App\Form\RegistrationFormType;
  28. use App\Repository\UserRepository;
  29. use App\Service\JwtService;
  30. use App\Service\SendMailService;
  31. use Symfony\Component\Mime\Address;
  32. use App\Repository\AdresseRepository;
  33. use App\Repository\DelegationRepository;
  34. use App\Repository\EnterprisePartenaireRepository;
  35. use App\Repository\GouvernoratRepository;
  36. use Doctrine\DBAL\Driver\Mysqli\Initializer\Charset;
  37. use Doctrine\ORM\EntityManagerInterface;
  38. use Doctrine\Persistence\ManagerRegistry;
  39. use Symfony\Bridge\Twig\Mime\TemplatedEmail;
  40. use Symfony\Component\HttpFoundation\Request;
  41. use Symfony\Component\HttpFoundation\Response;
  42. use Symfony\Component\Routing\Annotation\Route;
  43. use Symfony\Component\HttpFoundation\RequestStack;
  44. use Symfony\Component\Security\Http\Authentication\UserAuthenticatorInterface;
  45. use Symfony\Component\String\Slugger\SluggerInterface;
  46. use Symfony\Contracts\Translation\TranslatorInterface;
  47. use Symfony\Component\Mailer\Exception\TransportException;
  48. use Symfony\Bundle\FrameworkBundle\Controller\AbstractController;
  49. use Symfony\Component\HttpFoundation\JsonResponse;
  50. use Symfony\Component\PasswordHasher\Hasher\UserPasswordHasherInterface;
  51. use SymfonyCasts\Bundle\VerifyEmail\Exception\VerifyEmailExceptionInterface;
  52. use SymfonyCasts\Bundle\VerifyEmail\VerifyEmailHelperInterface;
  53. use App\Security\UsersAuthenticator;
  54. use App\Service\FileUploader;
  55. class RegistrationController extends AbstractController
  56. {
  57.     private $verifyEmailHelper;
  58.     private EmailVerifier $emailVerifier;
  59.     private $request;
  60.         /**
  61.      * @var FileUploader
  62.      */
  63.     protected $fileUploader;
  64.     /**
  65.      * @param RequestStack $request
  66.      */
  67.     public function __construct(EmailVerifier $emailVerifierRequestStack $request,
  68.     FileUploader $fileUploader,
  69.     VerifyEmailHelperInterface $helper,)
  70.     {
  71.         $this->emailVerifier $emailVerifier;
  72.         $this->request $request;
  73.         $this->verifyEmailHelper $helper;
  74.         $this->fileUploader $fileUploader;
  75.     }
  76.     #[Route('/register'name'app_register')]
  77.     public function register(
  78.         Request $request,
  79.         UserPasswordHasherInterface $userPasswordHasher,
  80.         EntityManagerInterface $entityManager,
  81.         UserRepository $userRepository,
  82.         GouvernoratRepository $gouvernoratRepository,
  83.         DelegationRepository $delegationRepository,
  84.         SendMailService $mailService,
  85.         JwtService $jwtService,
  86.         UserAuthenticatorInterface $userAuthenticator,
  87.         UsersAuthenticator $authenticator
  88.     ): Response {
  89.         $form_view_array = [];
  90.         $requestedType null;
  91.         $request $this->request->getCurrentRequest();
  92.         $adresse = new Adresse();
  93.         $formAdr $this->createForm(AdresseType::class);
  94.         $types = [
  95.             User::PARTIICULIER,
  96.             User::ENTREPRISE,
  97.             Partenaire::PARTENAIRE_NATIONAL,
  98.             Partenaire::PARTENAIRE_REGIONAL,
  99.             
  100.         ];
  101.         $instance_array = [
  102.             User::PARTIICULIER => new Particulier(),
  103.             User::ENTREPRISE  => new Entreprise(),
  104.             Partenaire::PARTENAIRE_NATIONAL => new Partenaire(),
  105.             Partenaire::PARTENAIRE_REGIONAL => new Partenaire(),
  106.             User::AUTRES  => new Autres(),
  107.         ];
  108.         $form_type_array = [
  109.             User::ENTREPRISE  => EntrepriseType::class,
  110.             User::PARTIICULIER => ParticulierType::class,
  111.             Partenaire::PARTENAIRE_REGIONAL => PartenaireRegionalType::class,
  112.             Partenaire::PARTENAIRE_NATIONAL => PartenaireNationalType::class,
  113.             User::AUTRES => AutresType::class,
  114.         ];
  115.         $role_array = [
  116.             User::PARTIICULIER  => 'ROLE_PARTICULIER',
  117.             User::ENTREPRISE  => 'ROLE_ENTREPRISES',
  118.             Partenaire::PARTENAIRE_REGIONAL  => 'ROLE_PARTENAIRES_REGIONAUX',
  119.             Partenaire::PARTENAIRE_NATIONAL  => 'ROLE_PARTENAIRES_NATIONAUX',
  120.             User::AUTRES => 'ROLE_AUTRES',
  121.         ];
  122.         $formAdr->handleRequest($request);
  123.         foreach ($types as $type) {
  124.             $instance $instance_array[$type];
  125.             $form $this->createForm($form_type_array[$type], $instance);
  126.             //$instance->addAdress(new Adresse());
  127.             $form_view_array[$type] = $form->createView();
  128.             $form->handleRequest($request);
  129.             if ($form->isSubmitted()) {
  130.                 if ($type == "Entreprise" and count($instance->getAdresses()) > 0) {
  131.                     foreach ($request->request->all()[strtolower($type)]['adresses'] as $i => $elem) {
  132.                         $deleg =  $delg $delegationRepository->findOneBy(['id' => $elem['delegation']]);
  133.                         $instance->getAdresses()[$i]->setDelegation($deleg);
  134.                         $instance->getAdresses()[$i]->setUser($instance);
  135.                         $instance->getAdresses()[$i]->setAdresse($elem['adresse']);
  136.                         
  137.                     }
  138.                 }
  139.                 if ($type == "Entreprise" and $instance->getChargeFormations()) {
  140.                     /** mapping of created User */
  141.                     foreach ($instance->getChargeFormations() as $elem) {
  142.                         $elem->setEntreprise($instance);
  143.                     }
  144.                 }
  145.                 if (($type == "Partenaire_national" or $type == "Partenaire_regional") and $instance->getAdresses()) {
  146.                     $adress = new Adresse();
  147.                     $deleg $delegationRepository->findOneBy(['id' => $request->request->all()[strtolower($type)]['delegation']]);
  148.                     $gouv $gouvernoratRepository->findOneBy(['id' => $request->request->all()[strtolower($type)]['gouvernorat']]);
  149.                     $adress->setDelegation($deleg);
  150.                     $adress->setGouvernorat($gouv);
  151.                     $adress->setCodePostale($request->request->all()[strtolower($type)]['code_postale']);
  152.                     $adress->setAdresse($request->request->all()[strtolower                                                                                                                                                                                       ($type)]['adresse']);
  153.                     $instance->addAdress($adress);
  154.                 }
  155.                 if ($type == "Partenaire_national" or $type == "Partenaire_regional") {
  156.                     $instance->setTypePartenaire($type);
  157.                     /** mapping of created User */
  158.                     foreach ($instance->getEnterprisePartenaires() as $elem) {
  159.                         $elem->setEntreprisePartenaire($instance);
  160.                     }
  161.                 }
  162.                 if (($type == "Autres"  or $type == "Particulier") and $instance->getAdresses()) {
  163.                     $adress = new Adresse();
  164.                     $gouv $gouvernoratRepository->findOneBy(['id' => $request->request->all()[strtolower($type)]['gouvernorat']]);
  165.                     $adress->setGouvernorat($gouv);
  166.                     $adress->setCodePostale($request->request->all()[strtolower($type)]['code_postale']);
  167.                     $adress->setAdresse($request->request->all()[strtolower($type)]['adresse']);
  168.                     $instance->addAdress($adress);
  169.                 }
  170.                 $requestedType $type;
  171.                 $requestedParams $request->request->all()[strtolower($type)];
  172.        
  173.                 if ($form->get('plainPassword')->getData() != null) {
  174.                     if (strcmp($form->get('plainPassword')->getData(), $form->get('confirmpassword')->getData()) == 0) {
  175.                         if ($form->get('plainPassword')->getData() != null) {
  176.                             $instance->setPassword(
  177.                                 $userPasswordHasher->hashPassword(
  178.                                     $instance,
  179.                                     $form->get('plainPassword')->getData()
  180.                                 )
  181.                             );
  182.                         }
  183.                     } else {
  184.                         return new JsonResponse([
  185.                             'success' => false,
  186.                             'message' => 'Les mots de passe ne sont pas identiques !'
  187.                             
  188.                         ], Response::HTTP_OK, ['Content-Type''application/json']);
  189.                     }
  190.                 }
  191.     
  192.                 // set roles
  193.                 $instance->setRoles(array($role_array[$type]));
  194.                 // set gouvernorat
  195.                 if (array_key_exists('gouvernorat'$requestedParams)) {
  196.                     $gouv $gouvernoratRepository->findOneBy(['id' => $requestedParams['gouvernorat']]);
  197.                     $adresse->setGouvernorat($gouv);
  198.                 }
  199.                 // set delegation if exist
  200.                 if (array_key_exists('delegation'$requestedParams)) {
  201.                     $delg $delegationRepository->findOneBy(['id' => $requestedParams['delegation']]);
  202.                     $adresse->setDelegation($delg);
  203.                 }
  204.                 // set adresse if exist
  205.                 if (array_key_exists('adresse'$requestedParams)) {
  206.                     $adresse->setAdresse($requestedParams['adresse']);
  207.                 }
  208.                 // set Localite if exist
  209.                 if (array_key_exists('Localite'$requestedParams)) {
  210.                     $adresse->setLocalite($requestedParams['Localite']);
  211.                 }
  212.                 // set code postale
  213.                 if (array_key_exists('code_postale'$requestedParams)) {
  214.                     $adresse->setCodePostale($requestedParams['code_postale']);
  215.                 }
  216.                 
  217.                 if (!$userRepository->findOneBy(['email' => $form->get('email')->getData()])) {
  218.                   //dd($instance);
  219.                   $entityManager->persist($instance);
  220.                   $entityManager->flush();
  221.                   // On génère le JWT de l'utilisateur
  222.                   // On crée le Header
  223.                   $header = [
  224.                       'typ' => 'JWT',
  225.                       'alg' => 'HS256'
  226.                   ];
  227.                   // On crée le Payload
  228.                   $payload = [
  229.                       'user_id' => $instance->getId()
  230.                   ];
  231.                   // On génère le token
  232.                   $token $jwtService->generate($header$payload$this->getParameter('app.jwtsecret'));
  233.                   // On envoie un mail
  234.                   $mailService->send(
  235.                       $this->getParameter('EmailAdmin'),
  236.                       $instance->getEmail(),
  237.                       'Activation de votre compte',
  238.                       'emails/register_mail.html.twig',
  239.                       ['username' => $instance->getUsername(), 'token' => $token],
  240.                   );
  241.                   return new JsonResponse([
  242.                       'success' => true,
  243.                       'message' => 'Votre compte a été créé avec succès, vérifiez votre boite mail pour le confirmer!'
  244.                       
  245.                   ], Response::HTTP_OK, ['Content-Type''application/json']);
  246.                  
  247.                 } else {
  248.                     return new JsonResponse([
  249.                         'success' => false,
  250.                         'message' => 'Email existe déjà !'
  251.                         
  252.                     ], Response::HTTP_OK, ['Content-Type''application/json']);
  253.                    
  254.                 }
  255.             }
  256.         }
  257.         return $this->render('registration/register.html.twig', [
  258.             'form_view_array' => $form_view_array,
  259.             'types' => $types,
  260.             'formAdr' => $formAdr->createView(),
  261.             'requestedType' => $requestedType
  262.         ]);
  263.     }
  264.     #[Route('ajax/get/delegation'name'ajax_get_delegation')]
  265.     public function getDelegation(Request $requestTranslatorInterface $translatorEntityManagerInterface $em): JsonResponse
  266.     {
  267.         $delegations $em
  268.             ->getRepository(Delegation::class)
  269.             ->getDelegationByGouvernaurat($request->query->get('gouvernorat_id'));
  270.         return new JsonResponse(json_encode($delegations));
  271.     }
  272.     #[Route('/verify/email'name'app_verify_email')]
  273.     public function verifyUserEmail(Request $requestTranslatorInterface $translatorVerifyEmailHelperInterface $verifyEmailHelper): Response
  274.     {
  275.         $this->denyAccessUnlessGranted('IS_AUTHENTICATED_FULLY');
  276.         $user $this->getUser();
  277.         // Do not get the User's Id or Email Address from the Request object
  278.         try {
  279.             $this->verifyEmailHelper->validateEmailConfirmation($request->getUri(), $user->getId(), $user->getEmail());
  280.         } catch (VerifyEmailExceptionInterface $e) {
  281.             $this->addFlash('verify_email_error'$e->getReason());
  282.             return $this->redirectToRoute('app_register');
  283.         }
  284.         // Mark your user as verified. e.g. switch a User::verified property to true
  285.         $this->addFlash('success''Your e-mail address has been verified.');
  286.         return $this->redirectToRoute('accueil');
  287.     }
  288.     #[Route('/profil'name'app_profil')]
  289. public function app_profil(
  290.     Request $request,
  291.     SluggerInterface $slugger,
  292.     EntityManagerInterface $entityManager,
  293.     ManagerRegistry $registry,
  294.     GouvernoratRepository $gouvernoratRepository,
  295.     DelegationRepository $delegationRepository,
  296.     UserPasswordHasherInterface $userPasswordHasher,
  297.     EnterprisePartenaireRepository $enterprisePartenaireRepository,
  298.     UserRepository $userRepository,
  299.     AdresseRepository $adresseRepository
  300. ): Response {
  301.     $AdresseRepository $entityManager->getRepository(Adresse::class);
  302.     $adr $AdresseRepository->findOneBy(['user' => $this->getUser()]);
  303.     // Vérification utilisateur connecté
  304.     if (!$this->getUser()) {
  305.         return $this->redirectToRoute('login');
  306.     }
  307.     // Création du formulaire en fonction du type d’utilisateur
  308.     $form null;
  309.     if ($this->getUser() instanceof Partenaire) {
  310.         if ($this->getUser()->getTypePartenaire() === Partenaire::PARTENAIRE_REGIONAL) {
  311.             $form $this->createForm(PartenaireRegionalType::class, $this->getUser());
  312.         } elseif ($this->getUser()->getTypePartenaire() === Partenaire::PARTENAIRE_NATIONAL) {
  313.             $form $this->createForm(PartenaireNationalType::class, $this->getUser());
  314.         }
  315.     } elseif ($this->getUser() instanceof Particulier) {
  316.         $form $this->createForm(ParticulierType::class, $this->getUser());
  317.     } elseif ($this->getUser() instanceof Entreprise) {
  318.         $form $this->createForm(EntrepriseType::class, $this->getUser());
  319.     } elseif ($this->getUser() instanceof Autres) {
  320.         $form $this->createForm(AutresType::class, $this->getUser());
  321.     } elseif ($this->getUser() instanceof Dae) {
  322.         $form $this->createForm(DaeType::class, $this->getUser());
  323.     } elseif ($this->getUser() instanceof ChargeAssistance) {
  324.         $form $this->createForm(ChargeAssistanceType::class, $this->getUser());
  325.     } elseif ($this->getUser() instanceof AgentInterne) {
  326.         $form $this->createForm(AgentInterneType::class, $this->getUser());
  327.     }
  328.     // Si aucun formulaire trouvé → erreur explicite
  329.     if (!$form) {
  330.         throw $this->createNotFoundException('Aucun formulaire défini pour ce type d’utilisateur.');
  331.     }
  332.     // Traitement du formulaire
  333.     $form->handleRequest($request);
  334.     if ($form->isSubmitted() && $form->isValid()) {
  335.         $data $request->request->all();
  336.         if ($this->getUser() instanceof Particulier) {
  337.             $gouv $gouvernoratRepository->find((int)$data['particulier']['gouvernorat']);
  338.             $adr->setGouvernorat($gouv);
  339.             $adr->setAdresse($data['particulier']['adresse']);
  340.             $adr->setCodePostale($data['particulier']['code_postale']);
  341.         } elseif ($this->getUser() instanceof Dae) {
  342.             $gouv $gouvernoratRepository->find((int)$data['dae']['gouvernorat']);
  343.             $adr->setGouvernorat($gouv);
  344.             $adr->setAdresse($data['dae']['adresse']);
  345.             $adr->setCodePostale($data['dae']['code_postale']);
  346.         } elseif ($this->getUser() instanceof Entreprise) {
  347.             foreach ($this->getUser()->getChargeFormations() as $elem) {
  348.                 $elem->setEntreprise($this->getUser());
  349.             }
  350.         } elseif ($this->getUser() instanceof Partenaire) {
  351.             $type $this->getUser()->getTypePartenaire() === Partenaire::PARTENAIRE_NATIONAL
  352.                 "partenaire_national"
  353.                 "partenaire_regional";
  354.             $gouv $gouvernoratRepository->find((int)$data[$type]['gouvernorat']);
  355.             $delg $delegationRepository->find((int)$data[$type]['delegation']);
  356.             $adr->setGouvernorat($gouv);
  357.             $adr->setDelegation($delg);
  358.             $adr->setAdresse($data[$type]['adresse']);
  359.             $adr->setCodePostale($data[$type]['code_postale']);
  360.             $file $request->files->get($type)['fileName'] ?? null;
  361.             if ($file) {
  362.                 $newFileName $this->fileUploader->upload($file'/listEnt''docEnt');
  363.                 $this->getUser()->setFileName($newFileName);
  364.             }
  365.         } elseif ($this->getUser() instanceof Autres) {
  366.             $gouv $gouvernoratRepository->find((int)$data['autres']['gouvernorat']);
  367.             $adr->setGouvernorat($gouv);
  368.             $adr->setAdresse($data['autres']['adresse']);
  369.             $adr->setCodePostale($data['autres']['code_postale']);
  370.         }
  371.         // Vérification mot de passe
  372.         if ($form->get('plainPassword')->getData()) {
  373.             if ($form->get('plainPassword')->getData() === $form->get('confirmpassword')->getData()) {
  374.                 $this->getUser()->setPassword(
  375.                     $userPasswordHasher->hashPassword(
  376.                         $this->getUser(),
  377.                         $form->get('plainPassword')->getData()
  378.                     )
  379.                 );
  380.             } else {
  381.                 return new JsonResponse([
  382.                     'success' => false,
  383.                     'message' => 'Les mots de passe ne sont pas identiques !'
  384.                 ]);
  385.             }
  386.         }
  387.         $entityManager->persist($this->getUser());
  388.         $entityManager->flush();
  389.         return new JsonResponse([
  390.             'success' => true,
  391.             'message' => 'Profil mis à jour avec succès'
  392.         ]);
  393.     }
  394.     return $this->render('registration/profil.html.twig', [
  395.         'profilForm' => $form->createView(),
  396.         'adr' => $adr
  397.     ]);
  398. }
  399.     #[Route('/verif/{token}'name'verify_user')]
  400.     public function verifyUser($tokenJwtService $jwtUserRepository $userRepositoryEntityManagerInterface $em): Response
  401.     {
  402.         //On vérifie si le token est valide, n'a pas expiré et n'a pas été modifié
  403.         if ($jwt->isValid($token) && !$jwt->isExpired($token) && $jwt->check($token$this->getParameter('app.jwtsecret'))) {
  404.             // On récupère le payload
  405.             $payload $jwt->getPayload($token);
  406.             // On récupère le user du token
  407.             $user $userRepository->find($payload['user_id']);
  408.             //On vérifie que l'utilisateur existe et n'a pas encore activé son compte
  409.             if ($user && !$user->isVerified()) {
  410.                 $user->setIsVerified(true);
  411.                 $em->flush($user);
  412.                 $this->addFlash('success''Utilisateur activé');
  413.                 return $this->redirectToRoute('app_profil');
  414.             }
  415.         }
  416.         // Ici un problème se pose dans le token
  417.         $this->addFlash('danger''Le token est invalide ou a expiré');
  418.         return $this->redirectToRoute('login');
  419.     }
  420.     #[Route('/renvoiverif'name'resend_verif')]
  421.     public function resendVerif(JWTService $jwtSendMailService $mailUserRepository $userRepository): Response
  422.     {
  423.         $user $this->getUser();
  424.         if (!$user) {
  425.             $this->addFlash('danger''Vous devez être connecté pour accéder à cette page');
  426.             return $this->redirectToRoute('login');
  427.         }
  428.         if ($user->isVerified()) {
  429.             $this->addFlash('warning''Cet utilisateur est déjà activé');
  430.             return $this->redirectToRoute('app_profil');
  431.         }
  432.         // On génère le JWT de l'utilisateur
  433.         // On crée le Header
  434.         $header = [
  435.             'typ' => 'JWT',
  436.             'alg' => 'HS256'
  437.         ];
  438.         // On crée le Payload
  439.         $payload = [
  440.             'user_id' => $user->getId()
  441.         ];
  442.         // On génère le token
  443.         $token $jwt->generate($header$payload$this->getParameter('app.jwtsecret'));
  444.         // On envoie un mail
  445.         $mail->send(
  446.             $this->getParameter('EmailAdmin'),
  447.             $user->getEmail(),
  448.             'Activation de votre compte sur le site e-commerce',
  449.             'register',
  450.             compact('user''token')
  451.         );
  452.         $this->addFlash('success''Email de vérification envoyé');
  453.         return $this->redirectToRoute('app_profil');
  454.     }
  455.      protected function executeAction(Request $request): Response
  456.     {
  457.         // Récupérez les données soumises
  458.         $montant $request->request->get('entreprise_montant');
  459.         // Effectuez la validation et l'enregistrement
  460.         if (floatval($montant) === 0) {
  461.             return new Response('Le montant ne peut pas être zéro.'400);
  462.         }
  463.         // Effectuez l'enregistrement dans la base de données
  464.         return new Response('Enregistrement réussi !');
  465.     }
  466.     #[Route('/general-conditions'name'app_general_conditions')]
  467.     public function generalConditions(){
  468.         return $this->render('registration/general_conditions.html.twig', []);
  469.     }
  470. }