src/Controller/Front/UserRegistrationController.php line 145

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