src/Controller/Front/UserRegistrationController.php line 138

Open in your IDE?
  1. <?php
  2. namespace App\Controller\Front;
  3. use DateTime;
  4. use Stripe\Stripe;
  5. use App\Entity\Club;
  6. use App\Entity\User;
  7. use App\Entity\Coach;
  8. use App\Entity\Trainee;
  9. use App\Entity\Operator;
  10. use App\Entity\CoachInfo;
  11. use App\Entity\StripeInfo;
  12. use App\Entity\Availability;
  13. use App\Entity\SportTrainee;
  14. use App\Service\BrevoService;
  15. use App\Form\ClubRegisterType;
  16. use App\Service\StripeService;
  17. use App\Service\TwilioService;
  18. use App\Form\CoachRegisterType;
  19. use App\EmailNotification\ToPro;
  20. use App\Form\TraineeRegisterType;
  21. use App\Form\ClubRegistrationType;
  22. use App\Form\OperatorRegisterType;
  23. use App\Repository\RoleRepository;
  24. use App\Repository\UserRepository;
  25. use App\Form\CoachRegistrationType;
  26. use App\Repository\OfferRepository;
  27. use App\Repository\SportRepository;
  28. use App\EmailNotification\ToTrainee;
  29. use App\Entity\UserRegistrationTemp;
  30. use App\Service\InternationalService;
  31. use Symfony\Component\Form\FormError;
  32. use App\Form\OperatorRegistrationType;
  33. use Doctrine\ORM\EntityManagerInterface;
  34. use App\Repository\NoteRequestRepository;
  35. use App\Repository\WebsiteInfoRepository;
  36. use Symfony\Component\HttpFoundation\Request;
  37. use Symfony\Component\Security\Core\Security;
  38. use Symfony\Component\Routing\Annotation\Route;
  39. use App\Repository\UserRegistrationTempRepository;
  40. use App\Service\SinchSmsService;
  41. use Symfony\Component\HttpFoundation\JsonResponse;
  42. use Symfony\Component\HttpFoundation\RequestStack;
  43. use Symfony\Component\String\Slugger\AsciiSlugger;
  44. use Symfony\Bundle\FrameworkBundle\Controller\AbstractController;
  45. use Symfony\Component\PasswordHasher\Hasher\UserPasswordHasherInterface;
  46. use Symfony\Component\Security\Http\Authenticator\FormLoginAuthenticator;
  47. use Symfony\Component\Security\Http\Authentication\UserAuthenticatorInterface;
  48. use Symfony\Component\Security\Core\Authentication\Token\UsernamePasswordToken;
  49. use Symfony\Component\Security\Core\Authentication\Token\Storage\TokenStorageInterface;
  50. #[Route(path'{_locale}')]
  51. class UserRegistrationController extends AbstractController
  52. {
  53.     private $apiKey;
  54.     private $stripe;
  55.     private $request;
  56.     private $internationalService;
  57.     public function __construct(RequestStack $requestStackInternationalService $internationalService, private BrevoService $brevoService, private SinchSmsService $sinchSmsService)
  58.     {
  59.         $this->apiKey $_ENV['STRIPE_SECRET_KEY'];
  60.         $this->request $requestStack->getCurrentRequest();
  61.         $this->stripe $this->stripe = new \Stripe\StripeClient($this->apiKey);
  62.         $this->internationalService $internationalService;
  63.     }
  64.     private function generateString(int $length 64)
  65.     {
  66.         $length = ($length 4) ? $length;
  67.         return bin2hex(random_bytes(($length - ($length 2)) / 2));
  68.     }
  69.     public function createStripeCustomer(User $pro)
  70.     {
  71.         $customer $this->stripe->customers->create([
  72.             'email' => $pro->getEmail(),
  73.             'name' => $pro->getFirstname() . '  ' $pro->getLastname(),
  74.             'address' => ['country' => $pro->getAddress()->getCountryCode()],
  75.             'expand' => ['tax']
  76.         ]);
  77.         return $customer;
  78.     }
  79.     public function createStripeAccount(User $pro)
  80.     {
  81.         $account $this->stripe->accounts->create([
  82.             'type' => 'standard',
  83.             'email' => $pro->getEmail()
  84.         ]);
  85.         return $account;
  86.     }
  87.     #[Route(path'/trainee-registration'name'trainee_registration')]
  88.     public function register(Request $request)
  89.     {
  90.         if ($this->getUser() != null) {
  91.             return $this->redirectToRoute('homepage');
  92.         }
  93.         $session $request->getSession();
  94.         $session->set('userType''trainee');
  95.         return $this->redirectToRoute('registration_email');
  96.     }
  97.     #[Route(path'/pro-registration'name'pro_registration_type'methods: ['POST'])]
  98.     public function userType(Request $request)
  99.     {
  100.         $user $this->getUser();
  101.         if ($user != null) {
  102.             return $this->redirectToRoute('homepage');
  103.         }
  104.         $userType $request->request->get('userType');
  105.         if ($userType) {
  106.             $session $request->getSession();
  107.             
  108.             if (in_array($userType, ['coach''club''operator'])) {
  109.                 $session->set('userType'$userType);
  110.                 return $this->redirectToRoute('registration_email');
  111.             }
  112.         }
  113.         
  114.         $this->addFlash('error''Une erreur est survenue. Veuillez réessayer.');
  115.         return $this->redirectToRoute('membership_presentation');
  116.     }
  117.     #[Route(path'/registration-email'name'registration_email')]
  118.     public function registrationEmail(Request $request)
  119.     {
  120.         if ($this->getUser() != null) {
  121.             return $this->redirectToRoute('homepage');
  122.         }
  123.         $session $request->getSession();
  124.         $userType $session->get('userType');
  125.         return $this->render('front/registration/registration-1.html.twig', [
  126.             'userType' => $userType,
  127.             'step' => 1
  128.         ]);
  129.     }
  130.     #[Route(path'/send-email-verification-code'name'registration_send_email_verification_code'methods: ['POST'])]
  131.     public function sendEmailVerificationCode(Request $requestUserRepository $userRepositoryToPro $toPro)
  132.     {
  133.         \sleep(1);
  134.         $data json_decode($request->getContent(), true);
  135.         $email $data['email'] ?? null;
  136.         $session $request->getSession();
  137.         if ($email) {
  138.             $existingUser $userRepository->findOneBy(['email' => $email]);
  139.             if ($existingUser) {
  140.                 $this->addFlash('error''Un compte existe déjà avec cet email');
  141.                 return new JsonResponse(['status' => 'error']);
  142.             }
  143.             $session->set('registrationEmail'$email);
  144.             // Génère un code
  145.             $code random_int(123456987600);
  146.             $session->set('verificationCode'$code);
  147.             $locale $this->request->getLocale();
  148.             $toPro->sendVericationCode($email$code$locale);
  149.             return new JsonResponse(['status' => 'success']);
  150.         } 
  151.         $this->addFlash('error''Une erreur est survenue. Veuillez réessayer.');
  152.         return new JsonResponse(['status' => 'error']);
  153.     }
  154.     #[Route(path'/verify-email-code'name'registration_verify_email_code'methods: ['POST'])]
  155.     public function verifyEmailCode(Request $request)
  156.     {
  157.         \sleep(1);
  158.         $data json_decode($request->getContent(), true);
  159.         $email $data['email'] ?? null;
  160.         $code $data['code'] ?? null;
  161.         $session $request->getSession();
  162.         $emailSession $session->get('registrationEmail');
  163.         if ($emailSession != $email) {
  164.             $this->addFlash('error''Une erreur est survenue. Veuillez réessayer.');
  165.             return new JsonResponse(['status' => 'error''type' => 'error1''emailSession' => $emailSession'email' => $email]);
  166.         }
  167.         if ($email && $code) {
  168.             if ($code != $session->get('verificationCode')) {
  169.                 return new JsonResponse(['status' => 'error''type' => 'errorCode''message' => 'Code invalide']);
  170.             }
  171.             $session->set('registrationEmailVerified'true);
  172.             $redirectionUrl $this->generateUrl('registration_password');
  173.             $session->remove('verificationCode');
  174.             return new JsonResponse(['status' => 'success''redirectionUrl' => $redirectionUrl]);
  175.         } 
  176.         $this->addFlash('error''Une erreur est survenue. Veuillez réessayer.');
  177.         return new JsonResponse(['status' => 'error''type' => 'error2''email' => $email'code' => $code]);
  178.     }
  179.     #[Route(path'/registration-password'name'registration_password')]
  180.     public function registrationPassword(Request $request)
  181.     {
  182.         $user $this->getUser();
  183.         if ($user != null) {
  184.             return $this->redirectToRoute('homepage');
  185.         }
  186.         $session $request->getSession();
  187.         $userType $session->get('userType');
  188.         if ($session->get('registrationEmailVerified') != true) {
  189.             return $this->redirectToRoute('registration_email');
  190.         }
  191.         if ($request->request->get('password')) {
  192.             $session->set('registrationPassword'$request->request->get('password'));
  193.             return $this->redirectToRoute('registration_phone');
  194.         }
  195.         return $this->render('front/registration/registration-2.html.twig', [
  196.             'userType' => $userType,
  197.             'step' => 2
  198.         ]);
  199.     }
  200.     #[Route(path'/registration-phone'name'registration_phone')]
  201.     public function registrationPhone(Request $request)
  202.     {
  203.         $user $this->getUser();
  204.         if ($user != null) {
  205.             return $this->redirectToRoute('homepage');
  206.         }
  207.         $session $request->getSession();
  208.         $userType $session->get('userType');
  209.         if ($session->get('registrationEmailVerified') != true ) {
  210.             return $this->redirectToRoute('registration_email');
  211.         }
  212.         if ($session->get('registrationPassword') != true) {
  213.             return $this->redirectToRoute('registration_password');
  214.         }
  215.         return $this->render('front/registration/registration-3.html.twig', [
  216.             'userType' => $userType,
  217.             'step' => 3
  218.         ]);
  219.     }
  220.     #[Route(path'/send-phone-verification-code'name'registration_send_phone_verification_code'methods: ['POST'])]
  221.     public function sendPhoneVerificationCode(Request $requestTwilioService $twilioService)
  222.     {
  223.         \sleep(1);
  224.         $data json_decode($request->getContent(), true);
  225.         $phone $data['phone'] ?? null;
  226.         $session $request->getSession();
  227.         if ($phone) {
  228.             // Génère un code
  229.             $code random_int(123456987600);
  230.             $session->set('verificationCode'$code);
  231.             $message "Votre code de vérification Racket Trip est : " $code;
  232.             try {
  233.                 $this->sinchSmsService->sendSms($phone$message);
  234.                 //$twilioService->sendSms($phone, $message);
  235.             } catch (\Exception $e) {
  236.                 return new JsonResponse(['status' => 'error''message' => 'Numéro de téléphone invalide.'], 400);
  237.             }
  238.             
  239.             $session->set('registrationPhone'$phone);
  240.             return new JsonResponse(['status' => 'success']);
  241.         } 
  242.         $this->addFlash('error''Une erreur est survenue. Veuillez réessayer.');
  243.         return new JsonResponse(['status' => 'error']);
  244.     }
  245.     #[Route(path'/verify-phone-code'name'registration_verify_phone_code'methods: ['POST'])]
  246.     public function verifyPhoneCode(Request $request)
  247.     {
  248.         \sleep(1);
  249.         $data json_decode($request->getContent(), true);
  250.         $phone $data['phone'] ?? null;
  251.         $code $data['code'] ?? null;
  252.         $session $request->getSession();
  253.         $emailSession $session->get('registrationPhone');
  254.         if ($emailSession != $phone) {
  255.             $this->addFlash('error''Une erreur est survenue. Veuillez réessayer.');
  256.             return new JsonResponse(['status' => 'error''type' => 'error']);
  257.         }
  258.         if ($phone && $code) {
  259.             if ($code != $session->get('verificationCode')) {
  260.                 return new JsonResponse(['status' => 'error''type' => 'errorCode''message' => 'Code invalide']);
  261.             }
  262.             $session->set('registrationPhoneVerified'true);
  263.             $session->remove('verificationCode');
  264.             $userType $session->get('userType');
  265.             // Redirection vers la page d'informations
  266.             if (in_array($userType, ['coach''club''operator'])) {
  267.                 $redirectionUrl $this->generateUrl('pro_registration_informations');
  268.             } else {
  269.                 $redirectionUrl $this->generateUrl('trainee_registration_informations');                
  270.             }
  271.             return new JsonResponse(['status' => 'success''redirectionUrl' => $redirectionUrl]);
  272.         } 
  273.         $this->addFlash('error''Une erreur est survenue. Veuillez réessayer.');
  274.         return new JsonResponse(['status' => 'error''type' => 'error']);
  275.     }
  276.     #[Route(path'/pro-registration-informations'name'pro_registration_informations')]
  277.     public function registration(Request $requestEntityManagerInterface $managerRoleRepository $roleRepositoryUserPasswordHasherInterface $passwordHasher
  278.     {
  279.         if ($this->getUser() != null) {
  280.             return $this->redirectToRoute('homepage');
  281.         }
  282.         $slugger = new AsciiSlugger();
  283.         $timeZone $this->internationalService->findVisitorTimeZone();
  284.         $session $request->getSession();
  285.         $userType $session->get('userType');
  286.         $email $session->get('registrationEmail');
  287.         $phone $session->get('registrationPhone');
  288.         $password $session->get('registrationPassword');
  289.         if ($userType == null || $email == null || $password == null || $phone == null) {
  290.             $this->addFlash('error''Une erreur est survenue. Veuillez réessayer.');
  291.             return $this->redirectToRoute('homepage');
  292.         }
  293.         // Choix de l'entité et du FormType
  294.         switch ($userType) {
  295.             case 'coach':
  296.                 $pro = new Coach();
  297.                 $formType CoachRegistrationType::class;
  298.                 break;
  299.             case 'club':
  300.                 $pro = new Club();
  301.                 $formType ClubRegistrationType::class;
  302.                 break;
  303.             case 'operator':
  304.                 $pro = new Operator();
  305.                 $formType OperatorRegistrationType::class;
  306.                 break;
  307.             default:
  308.                 $this->addFlash('error''Une erreur est survenue. Veuillez réessayer.');
  309.                 return $this->redirectToRoute('membership_presentation');
  310.         }
  311.         $form $this->createForm($formType$pro);
  312.         $form->handleRequest($request);
  313.         if ($form->isSubmitted() && $form->isValid()) {
  314.             $hashed $passwordHasher->hashPassword($pro$password);
  315.             $pro->setEmail($email)
  316.                 ->setTelephone($phone)
  317.                 ->setPassword($hashed);
  318.             $proInfo $pro->getProInfo();
  319.             $proInfo->setPageVisible(false)
  320.                     ->setCoverPhoto('cover.png')
  321.                     ->setContactEmail($pro->getEmail());
  322.             // Particularités selon le userType
  323.             switch ($userType) {
  324.                 case 'coach':
  325.                     $proInfo->setFullname($pro->getFirstname() . ' ' $pro->getLastname());
  326.                     $coachInfo = new CoachInfo();
  327.                     $coachInfo->setOwner($pro)
  328.                         ->setName($proInfo->getFullname())
  329.                         ->setAddress($pro->getAddress());
  330.                     $manager->persist($coachInfo);
  331.                     
  332.                     break;
  333.                 case 'club':
  334.                     $proInfo->setFullname($pro->getClubInfo()->getName());
  335.                     $clubInfo $pro->getClubInfo();
  336.                     $clubInfo->setOwner($pro)
  337.                         ->setName($proInfo->getFullname())
  338.                         ->setAddress($pro->getAddress());
  339.                     $manager->persist($clubInfo);
  340.                     break;
  341.                 case 'operator':
  342.                     $proInfo->setFullname($pro->getOperatorInfo()->getName());
  343.                     $operatorInfo $pro->getOperatorInfo();
  344.                     $operatorInfo->setOwner($pro);
  345.                     $proInfo->setFullname($operatorInfo->getName())
  346.                     ->setContactEmail($pro->getEmail());
  347.                     $manager->persist($operatorInfo);
  348.                     break;
  349.             }
  350.             // Gestion des sports
  351.             foreach ($proInfo->getSports() as $sport) {
  352.                 $sport->addPro($proInfo);
  353.                 $manager->persist($sport);
  354.                 // Seulement pour club ➔ créer des disponibilités
  355.                 if ($userType === 'club') {
  356.                     $availability = new Availability();
  357.                     $availability->setSport($sport)->setClub($pro);
  358.                     $manager->persist($availability);
  359.                 }
  360.             }
  361.             $slug strtolower($slugger->slug(
  362.                 ($userType === 'coach' 
  363.                     $pro->getFirstname() . '-' $pro->getLastname() 
  364.                     : $proInfo->getFullname()
  365.                 ) . '-' rand(1000098765)
  366.             ));
  367.             $role $roleRepository->findOneBy(['title' => 'ROLE_PRO']);
  368.             $pro->setRegisteredAt(new \DateTime())
  369.                 ->setToken($this->generateString(32))
  370.                 ->setIsPro(true)
  371.                 ->setSlug($slug)
  372.                 ->setPhoto('default-profile.png')
  373.                 ->setTimezone($timeZone)
  374.                 ->setNotification(true)
  375.                 ->setActivated(false)
  376.                 ->setHasAccess(false)
  377.                 ->addUserRole($role)
  378.                 ->setPassword($hashed)
  379.                 ->setStatus('online')
  380.                 ->setLanguage($this->request->getLocale());
  381.             // Spécificité pour lier clubInfo / operatorInfo
  382.             if ($userType === 'club') {
  383.                 $clubInfo $pro->getClubInfo();
  384.                 $clubInfo->setOwner($pro)
  385.                         ->setName($proInfo->getFullname())
  386.                         ->setAddress($pro->getAddress());
  387.                 $manager->persist($clubInfo);
  388.             }
  389.             if ($userType === 'operator') {
  390.                 $operatorInfo $pro->getOperatorInfo();
  391.                 $operatorInfo->setOwner($pro);
  392.                 $manager->persist($operatorInfo);
  393.             }
  394.             try {
  395.                 $manager->persist($proInfo);
  396.                 $manager->persist($pro);
  397.                 $manager->flush();
  398.             } catch (\Throwable $th) {
  399.                 $this->addFlash('error'"Une erreur s'est produite. Veuillez réessayer.");
  400.                 return $this->redirectToRoute('pro_registration_type');
  401.             }
  402.             if ($pro->getNewsletter()) {
  403.                 $this->brevoService->createBrevoContact(
  404.                     method_exists($pro'getFirstname') ? $pro->getFirstname() : '',
  405.                     method_exists($pro'getLastname') ? $pro->getLastname() : '',
  406.                     $pro->getEmail(),
  407.                     'pro'
  408.                 );
  409.             }
  410.             return $this->redirectToRoute('pro_activate_account', [
  411.                 'token' => $pro->getToken()
  412.             ]);
  413.             
  414.         }
  415.         return $this->render('front/registration/registration-pro.html.twig', [
  416.             'form' => $form->createView(),
  417.             'userType' => $userType,
  418.             'step' => 5
  419.         ]);
  420.     }
  421.     #[Route(path'/trainee-registration-informations'name'trainee_registration_informations')]
  422.     public function traineeRegistration(Request $requestEntityManagerInterface $managerBrevoService $brevoServiceRoleRepository $roleRepositoryUserPasswordHasherInterface $passwordHasherToTrainee $toTraineeSportRepository $sportRepo)
  423.     {
  424.         if ($this->getUser() != null) {
  425.             return $this->redirectToRoute('homepage');
  426.         }
  427.         $timeZone $this->internationalService->findVisitorTimeZone();
  428.         $session $request->getSession();
  429.         $userType $session->get('userType');
  430.         $email $session->get('registrationEmail');
  431.         $phone $session->get('registrationPhone');
  432.         $password $session->get('registrationPassword');
  433.         if ($userType == null || $email == null || $password == null || $phone == null) {
  434.             $this->addFlash('error''Une erreur est survenue. Veuillez réessayer.');
  435.             return $this->redirectToRoute('homepage');
  436.         }
  437.         $trainee = new Trainee();
  438.         $trainee->setTimezone($timeZone);
  439.         $sports $sportRepo->findAll();
  440.         foreach ($sports as $sport) {
  441.             $sportTrainee = new SportTrainee();
  442.             $sportTrainee->setTrainee($trainee)
  443.                 ->setSport($sport);
  444.             $trainee->addSport($sportTrainee);
  445.         }
  446.         $form $this->createForm(TraineeRegisterType::class, $trainee);
  447.         $form->handleRequest($request);
  448.         if ($form->isSubmitted() && $form->isValid()) {
  449.             $password $trainee->getPassword();
  450.             $hashed $passwordHasher->hashPassword($trainee$password);
  451.             $sportsTrainee $trainee->getSports();
  452.             foreach ($sportsTrainee as $sportsTrainee) {
  453.                 if ($sportsTrainee->getLevel() == null) {
  454.                     $trainee->removeSport($sportsTrainee);
  455.                 } else {
  456.                     $manager->persist($sportsTrainee);
  457.                 }
  458.             }
  459.             $slugger = new AsciiSlugger();
  460.             $slug strtolower($slugger->slug($trainee->getFirstname() . '-' $trainee->getLastname() . '-' rand(1000098765)));
  461.             $role $roleRepository->findOneBy(['title' => 'ROLE_TRAINEE']);
  462.             $trainee->setRegisteredAt(new DateTime())
  463.                 ->setToken($this->generateString(32))
  464.                 ->addUserRole($role)
  465.                 ->setSlug($slug)
  466.                 ->setEmail($email)
  467.                 ->setPassword($hashed)
  468.                 ->setTelephone($phone)
  469.                 ->setTimezone($timeZone)
  470.                 ->setPhoto('default-profile.png')
  471.                 ->setIsPro(false)
  472.                 ->setNotification(true)
  473.                 ->setActivated(false)
  474.                 ->setHasAccess(true)
  475.                 ->setStatus('online')
  476.                 ->setLanguage($this->request->getLocale());
  477.             try {
  478.                 $manager->persist($trainee);
  479.                 $manager->flush();
  480.             } catch (\Throwable $th) {
  481.                 $this->addFlash(
  482.                     'error',
  483.                     "Une erreur s'est produite. Veillez réessayer"
  484.                 );
  485.                 return $this->redirectToRoute('trainee_registration_informations');
  486.             }
  487.             if ($trainee->getNewsletter()) {
  488.                 $brevoService->createBrevoContact($trainee->getFirstname(), $trainee->getLastname(), $trainee->getEmail(), 'trainee');
  489.             }
  490.             //$toTrainee->confirmEmail($trainee);
  491.             return $this->redirectToRoute('trainee_activate_account', [
  492.                 'token' => $trainee->getToken()
  493.             ]);
  494.         }
  495.         return $this->render('front/registration/registration-trainee.html.twig', [
  496.             'form' => $form->createView(),
  497.             'sports' => $sports,
  498.             'userType' => $userType,
  499.             'step' => 5
  500.         ]);
  501.     }
  502.     #[Route(path'/activate-account/{token}'name'pro_activate_account')]
  503.     public function proVerifyEmail(Request $requestUserRepository $userRepo$tokenEntityManagerInterface $managerStripeService $stripeServiceTokenStorageInterface $tokenStorageToPro $toPro)
  504.     {
  505.         $user $userRepo->findOneBy(['token' => $token]);
  506.         if (!$user) {
  507.             return $this->redirectToRoute('homepage');
  508.         }
  509.         $stripeInfo = new StripeInfo;
  510.         $stripeCustomer $stripeService->createStripeCustomer($user);
  511.         $stripeAccount $stripeService->createStripeAccount($user);
  512.         $stripeInfo->setCustomerId($stripeCustomer->id)
  513.                     ->setAccountId($stripeAccount->id);
  514.         $manager->persist($stripeInfo);                
  515.         $user->setActivated(true)
  516.              ->setStripeInfo($stripeInfo)
  517.              ->setToken($this->generateString(32));
  518.         $manager->flush($user);
  519.         //$toPro->confirmEmail($pro);
  520.         $token = new UsernamePasswordToken($usernull'main'$user->getRoles());
  521.         $tokenStorage->setToken($token);
  522.         //$this->addFlash('welcome-registration', 'Bienvenue sur Racket Trip ! Votre compte a été activé avec succès. Vous pouvez maintenant profiter de toutes les fonctionnalités.');
  523.         return $this->redirectToRoute('membership', [
  524.             'type' => $user->getProType(),
  525.         ]);
  526.     }
  527.     #[Route(path'/activate-trainee-account/{token}'name'trainee_activate_account')]
  528.     public function traineeVerifyEmail(UserRepository $userRepo$tokenTokenStorageInterface $tokenStorageEntityManagerInterface $managerNoteRequestRepository $noteRequestRepository)
  529.     {
  530.         $user $userRepo->findOneBy(['token' => $token]);
  531.         if (!$user) {
  532.             return $this->redirectToRoute('homepage');
  533.         }
  534.         $user->setActivated(true)
  535.              ->setToken($this->generateString(32));
  536.         $manager->flush($user);
  537.         $token = new UsernamePasswordToken($usernull'main'$user->getRoles());
  538.         $tokenStorage->setToken($token);
  539.         $this->addFlash('welcome-registration''Bienvenue sur Racket Trip ! Votre compte a été activé avec succès. Vous pouvez maintenant profiter de toutes les fonctionnalités.');
  540.         if ($noteRequestRepository->findOneBy(['email' => $user->getEmail(), 'status' => 'pending'])) {
  541.             $this->addFlash(
  542.                 'success',
  543.                 "Votre compte a été activé avec succès. Vous pouvez maintenant reserver des stages. Vous avez une demande de notation en attente."
  544.             );  
  545.             return $this->redirectToRoute('pro_note_requested');
  546.         }     
  547.         return $this->redirectToRoute('homepage');
  548.     }
  549.     /*
  550.     #[Route(path: '/registration-informations', name: 'registration_informations')]
  551.     public function proRegistrationInformations(Request $request, EntityManagerInterface $manager, RoleRepository $roleRepository, UserPasswordHasherInterface $passwordHasher, ToPro $toPro, UserRepository $userRepository)
  552.     {
  553.         $user = $this->getUser();
  554.         if ($user != null) {
  555.             return $this->redirectToRoute('homepage');
  556.         }
  557.         $timeZone = $this->internationalService->findVisitorTimeZone();
  558.         $session = $request->getSession();
  559.         $userType = $session->get('userType');
  560.         $email = $session->get('registrationEmail');
  561.         $password = $session->get('registrationPassword');
  562.         $phone = $session->get('registrationPhone');
  563.         if ($userType == null || $email == null || $password == null || $phone == null) {
  564.             return $this->redirectToRoute('pro_registration_type');
  565.         }
  566.         if ($userType == 'coach') {
  567.             $pro = new Coach();
  568.             $form = $this->createForm(CoachRegisterType::class, $pro);
  569.         }
  570.         if ($userType == 'club') {
  571.             $pro = new Club();
  572.             $form = $this->createForm(ClubRegisterType::class, $pro);
  573.         }
  574.         if ($userType == 'operator') {
  575.             $pro = new Operator();
  576.             $form = $this->createForm(OperatorRegisterType::class, $pro);
  577.         }
  578.         $form->handleRequest($request);
  579.         
  580.         $slugger = new AsciiSlugger();
  581.         if ($form->isSubmitted() && $form->isValid()) {
  582.             $hashed = $passwordHasher->hashPassword($pro, $password);
  583.             $proInfo = $pro->getProInfo();
  584.             $proInfo->setFullname($pro->getFirstname() . ' ' . $pro->getLastname())
  585.                 ->setPageVisible(false)
  586.                 ->setCoverPhoto('cover.png')
  587.                 ->setHaveSubscription(false)
  588.                 ->setContactEmail($email);
  589.             $sports = $proInfo->getSports();
  590.             foreach ($sports as $sport) {
  591.                 $sport->addPro($proInfo);
  592.                 $manager->persist($sport);
  593.             }
  594.             $slug = strtolower($slugger->slug($pro->getFirstname() . '-' . $pro->getLastname() . '-' . rand(10000, 98765)));
  595.             $role = $roleRepository->findOneBy(['title' => 'ROLE_PRO']);
  596.             $pro->setRegisteredAt(new DateTime())
  597.                 ->setToken($this->generateString(32))
  598.                 ->setTimezone($timeZone)
  599.                 ->addUserRole($role)
  600.                 ->setIsPro(true)
  601.                 ->setPhoto('default-profile.png')
  602.                 ->setSlug($slug)
  603.                 ->setNotification(true)
  604.                 ->setActivated(false)
  605.                 ->setHasAccess(false)
  606.                 ->setPassword($hashed)
  607.                 ->setStatus('online')
  608.                 ->setLanguage($this->request->getLocale());
  609.             $coachInfo = new CoachInfo();
  610.             $coachInfo->setOwner($pro)
  611.                 ->setName($proInfo->getFullname())
  612.                 ->setAddress($pro->getAddress());
  613.             try {
  614.                 $manager->persist($proInfo);
  615.                 $manager->persist($pro);
  616.                 $manager->persist($coachInfo);
  617.                 $manager->flush();
  618.                 
  619.             } catch (\Throwable $th) {
  620.                 $this->addFlash(
  621.                     'success',
  622.                     "Une erreur s'est produite. Veillez réessayer"
  623.                 );
  624.                 return $this->redirectToRoute('coach_register');
  625.             }
  626.             if ($pro->getNewsletter()) {
  627.                 $this->brevoService->createBrevoContact($pro->getFirstname(), $pro->getLastname(), $pro->getEmail(), 'pro');
  628.             }
  629.             $toPro->confirmEmail($pro);
  630.             $this->addFlash(
  631.                 'registration',
  632.                 ""
  633.             );
  634.             return $this->redirectToRoute('homepage');
  635.             
  636.         }
  637.         return $this->render('front/pro/registration/coach-registration.html.twig', [
  638.             'form' => $form->createView(),
  639.             'type' => 'coach'
  640.         ]);
  641.     }
  642.         
  643.     #[Route(path: '/coach-registration', name: 'coach_register')]
  644.     public function coachRegistration(Request $request, EntityManagerInterface $manager, RoleRepository $roleRepository, UserPasswordHasherInterface $passwordHasher, ToPro $toPro, UserRepository $userRepository)
  645.     {
  646.         $user = $this->getUser();
  647.         if ($user != null) {
  648.             return $this->redirectToRoute('homepage');
  649.         }
  650.         $timeZone = $this->internationalService->findVisitorTimeZone();
  651.         $coach = new Coach();
  652.         $slugger = new AsciiSlugger();
  653.         $form = $this->createForm(CoachRegisterType::class, $coach);
  654.         $form->handleRequest($request);
  655.         if ($form->isSubmitted() && $form->isValid()) {
  656.             if ($userRepository->findOneBy(['email' => $coach->getEmail()])) {
  657.                 $form->get('email')->addError(new FormError("Un compte existe avec cet email"));
  658.             } else {
  659.                 $password = $coach->getPassword();
  660.                 $hashed = $passwordHasher->hashPassword($coach, $password);
  661.                 $proInfo = $coach->getProInfo();
  662.                 $proInfo->setFullname($coach->getFirstname() . ' ' . $coach->getLastname())
  663.                     ->setPageVisible(false)
  664.                     ->setCoverPhoto('cover.png')
  665.                     ->setHaveSubscription(false)
  666.                     ->setContactEmail($coach->getEmail());
  667.                 $sports = $proInfo->getSports();
  668.                 foreach ($sports as $sport) {
  669.                     $sport->addPro($proInfo);
  670.                     $manager->persist($sport);
  671.                 }
  672.                 $slug = strtolower($slugger->slug($coach->getFirstname() . '-' . $coach->getLastname() . '-' . rand(10000, 98765)));
  673.                 $role = $roleRepository->findOneBy(['title' => 'ROLE_PRO']);
  674.                 $coach->setRegisteredAt(new DateTime())
  675.                     ->setToken($this->generateString(32))
  676.                     ->setTimezone($timeZone)
  677.                     ->addUserRole($role)
  678.                     ->setIsPro(true)
  679.                     ->setPhoto('default-profile.png')
  680.                     ->setSlug($slug)
  681.                     ->setNotification(true)
  682.                     ->setActivated(false)
  683.                     ->setHasAccess(false)
  684.                     ->setPassword($hashed)
  685.                     ->setStatus('online')
  686.                     ->setLanguage($this->request->getLocale());
  687.                 $coachInfo = new CoachInfo();
  688.                 $coachInfo->setOwner($coach)
  689.                     ->setName($proInfo->getFullname())
  690.                     ->setAddress($coach->getAddress());
  691.                 try {
  692.                     $manager->persist($proInfo);
  693.                     $manager->persist($coach);
  694.                     $manager->persist($coachInfo);
  695.                     $manager->flush();
  696.                     
  697.                 } catch (\Throwable $th) {
  698.                     $this->addFlash(
  699.                         'success',
  700.                         "Une erreur s'est produite. Veillez réessayer"
  701.                     );
  702.                     return $this->redirectToRoute('coach_register');
  703.                 }
  704.                 if ($coach->getNewsletter()) {
  705.                     $this->brevoService->createBrevoContact($coach->getFirstname(), $coach->getLastname(), $coach->getEmail(), 'pro');
  706.                 }
  707.                 $toPro->confirmEmail($coach);
  708.                 $this->addFlash(
  709.                     'registration',
  710.                     ""
  711.                 );
  712.                 return $this->redirectToRoute('homepage');
  713.             }
  714.         }
  715.         return $this->render('front/pro/registration/coach-registration.html.twig', [
  716.             'form' => $form->createView(),
  717.             'type' => 'coach'
  718.         ]);
  719.     }
  720.     #[Route(path: '/club-registration', name: 'club_register')]
  721.     public function clubRegister(Request $request, EntityManagerInterface $manager, RoleRepository $roleRepository, UserPasswordHasherInterface $passwordHasher, ToPro $toPro, UserRepository $userRepository)
  722.     {
  723.         $user = $this->getUser();
  724.         if ($user != null) {
  725.             return $this->redirectToRoute('homepage');
  726.         }
  727.         $timeZone = $this->internationalService->findVisitorTime();
  728.         $club = new Club();
  729.         $slugger = new AsciiSlugger();
  730.         $form = $this->createForm(ClubRegisterType::class, $club);
  731.         $form->handleRequest($request);
  732.         if ($form->isSubmitted() && $form->isValid()) {
  733.             if ($userRepository->findOneBy(['email' => $club->getEmail()])) {
  734.                 $form->get('email')->addError(new FormError("Un compte existe avec cet email"));
  735.             } else {
  736.                 $password = $club->getPassword();
  737.                 $hashed = $passwordHasher->hashPassword($club, $password);
  738.                 $proInfo = $club->getProInfo();
  739.                 $proInfo->setFullname($club->getClubInfo()->getName())
  740.                     ->setPageVisible(false)
  741.                     ->setCoverPhoto('cover.png')
  742.                     ->setContactEmail($club->getEmail());
  743.                 $sports = $proInfo->getSports();
  744.                 foreach ($sports as $sport) {
  745.                     $sport->addPro($proInfo);
  746.                     $availability = new Availability();
  747.                     $availability->setSport($sport)
  748.                         ->setClub($club);
  749.                     $manager->persist($availability);
  750.                     $manager->persist($club);
  751.                     $manager->persist($sport);
  752.                 }
  753.                 $slug = strtolower($slugger->slug($club->getClubInfo()->getName() . '-' . rand(10000, 98765)));
  754.                 $role = $roleRepository->findOneBy(['title' => 'ROLE_PRO']);
  755.                 $club->setRegisteredAt(new DateTime())
  756.                     ->setToken($this->generateString(32))
  757.                     ->setIsPro(true)
  758.                     ->addUserRole($role)
  759.                     ->setTimezone($timeZone)
  760.                     ->setPhoto('default-profile.png')
  761.                     ->setSlug($slug)
  762.                     ->setNotification(true)
  763.                     ->setActivated(false)
  764.                     ->setHasAccess(false)
  765.                     ->setPassword($hashed)
  766.                     ->setStatus('online')
  767.                     ->setLanguage($this->request->getLocale());
  768.                 $clubInfo = $club->getClubInfo();
  769.                 $clubInfo->setOwner($club)
  770.                     ->setName($proInfo->getFullname())
  771.                     ->setAddress($club->getAddress());
  772.                 try {
  773.                     $manager->persist($proInfo);
  774.                     $manager->persist($club);
  775.                     $manager->persist($clubInfo);
  776.                     $manager->flush();
  777.                 } catch (\Throwable $th) {
  778.                     $this->addFlash(
  779.                         'success',
  780.                         "Une erreur s'est produite. Veillez réessayer"
  781.                     );
  782.                     return $this->redirectToRoute('club_register');
  783.                 }
  784.                 if ($club->getNewsletter()) {
  785.                     $this->brevoService->createBrevoContact($club->getFirstname(), $club->getLastname(), $club->getEmail(), 'pro');
  786.                 }
  787.                 $toPro->confirmEmail($club);
  788.                 $this->addFlash(
  789.                     'registration',
  790.                     ""
  791.                 );
  792.                 return $this->redirectToRoute('homepage');
  793.             }
  794.         }
  795.         return $this->render('front/pro/registration/club-registration.html.twig', [
  796.             'form' => $form->createView(),
  797.             'type' => 'club'
  798.         ]);
  799.     }
  800.     #[Route(path: '/operator-registration', name: 'operator_register')]
  801.     public function operatorRegister(Request $request, EntityManagerInterface $manager, RoleRepository $roleRepository, UserPasswordHasherInterface $passwordHasher, ToPro $toPro, UserRepository $userRepository)
  802.     {
  803.         $user = $this->getUser();
  804.         if ($user != null) {
  805.             return $this->redirectToRoute('homepage');
  806.         }
  807.         $timeZone = $this->internationalService->findVisitorTimeZone();
  808.         $operator = new Operator();
  809.         $slugger = new AsciiSlugger();
  810.         $form = $this->createForm(OperatorRegisterType::class, $operator);
  811.         $form->handleRequest($request);
  812.         if ($form->isSubmitted() && $form->isValid()) {
  813.             if ($userRepository->findOneBy(['email' => $operator->getEmail()])) {
  814.                 $form->get('email')->addError(new FormError("Un compte existe avec cet email"));
  815.             } else {
  816.                 $password = $operator->getPassword();
  817.                 $hashed = $passwordHasher->hashPassword($operator, $password);
  818.                 $proInfo = $operator->getProInfo();
  819.                 $proInfo->setFullname($operator->getOperatorInfo()->getName())
  820.                     ->setPageVisible(false)
  821.                     ->setCoverPhoto('cover.png')
  822.                     ->setContactEmail($operator->getEmail());
  823.                 $sports = $proInfo->getSports();
  824.                 foreach ($sports as $sport) {
  825.                     $sport->addPro($proInfo);
  826.                     $manager->persist($sport);
  827.                 }
  828.                 $slug = strtolower($slugger->slug($operator->getOperatorInfo()->getName() . '-' . rand(10000, 98765)));
  829.                 $role = $roleRepository->findOneBy(['title' => 'ROLE_PRO']);
  830.                 $operator->setRegisteredAt(new DateTime())
  831.                     ->setToken($this->generateString(32))
  832.                     ->addUserRole($role)
  833.                     ->setIsPro(true)
  834.                     ->setSlug($slug)
  835.                     ->setPhoto('default-profile.png')
  836.                     ->setTimezone($timeZone)
  837.                     ->setNotification(true)
  838.                     ->setActivated(false)
  839.                     ->setPassword($hashed)
  840.                     ->setHasAccess(false)
  841.                     ->setStatus('online')
  842.                     ->setLanguage($this->request->getLocale());
  843.                 $operatorInfo = $operator->getOperatorInfo();
  844.                 $operatorInfo->setOwner($operator);
  845.                 $proInfo->setFullname($operatorInfo->getName())
  846.                     ->setContactEmail($operator->getEmail());
  847.                 try {
  848.                     $manager->persist($proInfo);
  849.                     $manager->persist($operator);
  850.                     $manager->persist($operatorInfo);
  851.                     $manager->flush();
  852.                 } catch (\Throwable $th) {
  853.                     $this->addFlash(
  854.                         'success',
  855.                         "Une erreur s'est produite. Veillez réessayer"
  856.                     );
  857.                     return $this->redirectToRoute('operator_register');
  858.                 }
  859.                 if ($operator->getNewsletter()) {
  860.                     $this->brevoService->createBrevoContact($operator->getFirstname(), $operator->getLastname(), $operator->getEmail(), 'pro');
  861.                 }
  862.                 $toPro->confirmEmail($operator);
  863.                 $this->addFlash(
  864.                     'registration',
  865.                     ""
  866.                 );
  867.                 return $this->redirectToRoute('homepage');
  868.             }
  869.         }
  870.         return $this->render('front/pro/registration/operator-registration.html.twig', [
  871.             'form' => $form->createView(),
  872.             'type' => 'operator'
  873.         ]);
  874.     }
  875.     */
  876. }