src/Controller/Front/UserRegistrationController.php line 127

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