<?php
namespace App\Controller\Front;
use DateTime;
use Stripe\Stripe;
use App\Entity\Club;
use App\Entity\User;
use App\Entity\Coach;
use App\Entity\Trainee;
use App\Entity\Operator;
use App\Entity\CoachInfo;
use App\Entity\StripeInfo;
use App\Entity\Availability;
use App\Entity\SportTrainee;
use App\Service\BrevoService;
use App\Form\ClubRegisterType;
use App\Service\StripeService;
use App\Service\TwilioService;
use App\Form\CoachRegisterType;
use App\EmailNotification\ToPro;
use App\Form\TraineeRegisterType;
use App\Form\ClubRegistrationType;
use App\Form\OperatorRegisterType;
use App\Repository\RoleRepository;
use App\Repository\UserRepository;
use App\Form\CoachRegistrationType;
use App\Repository\OfferRepository;
use App\Repository\SportRepository;
use App\EmailNotification\ToTrainee;
use App\Entity\UserRegistrationTemp;
use App\Service\InternationalService;
use Symfony\Component\Form\FormError;
use App\Form\OperatorRegistrationType;
use Doctrine\ORM\EntityManagerInterface;
use App\Repository\NoteRequestRepository;
use App\Repository\WebsiteInfoRepository;
use Symfony\Component\HttpFoundation\Request;
use Symfony\Component\Security\Core\Security;
use Symfony\Component\Routing\Annotation\Route;
use App\Repository\UserRegistrationTempRepository;
use Symfony\Component\HttpFoundation\JsonResponse;
use Symfony\Component\HttpFoundation\RequestStack;
use Symfony\Component\String\Slugger\AsciiSlugger;
use Symfony\Bundle\FrameworkBundle\Controller\AbstractController;
use Symfony\Component\PasswordHasher\Hasher\UserPasswordHasherInterface;
use Symfony\Component\Security\Http\Authenticator\FormLoginAuthenticator;
use Symfony\Component\Security\Http\Authentication\UserAuthenticatorInterface;
use Symfony\Component\Security\Core\Authentication\Token\UsernamePasswordToken;
use Symfony\Component\Security\Core\Authentication\Token\Storage\TokenStorageInterface;
#[Route(path: '{_locale}')]
class UserRegistrationController extends AbstractController
{
private $apiKey;
private $stripe;
private $request;
private $internationalService;
public function __construct(RequestStack $requestStack, InternationalService $internationalService, private BrevoService $brevoService)
{
$this->apiKey = $_ENV['STRIPE_SECRET_KEY'];
$this->request = $requestStack->getCurrentRequest();
$this->stripe = $this->stripe = new \Stripe\StripeClient($this->apiKey);
$this->internationalService = $internationalService;
}
private function generateString(int $length = 64)
{
$length = ($length < 4) ? 4 : $length;
return bin2hex(random_bytes(($length - ($length % 2)) / 2));
}
public function createStripeCustomer(User $pro)
{
$customer = $this->stripe->customers->create([
'email' => $pro->getEmail(),
'name' => $pro->getFirstname() . ' ' . $pro->getLastname(),
'address' => ['country' => $pro->getAddress()->getCountryCode()],
'expand' => ['tax']
]);
return $customer;
}
public function createStripeAccount(User $pro)
{
$account = $this->stripe->accounts->create([
'type' => 'standard',
'email' => $pro->getEmail()
]);
return $account;
}
#[Route(path: '/trainee-registration', name: 'trainee_registration')]
public function register(Request $request)
{
if ($this->getUser() != null) {
return $this->redirectToRoute('homepage');
}
$session = $request->getSession();
$session->set('userType', 'trainee');
return $this->redirectToRoute('registration_email');
}
#[Route(path: '/pro-registration', name: 'pro_registration_type', methods: ['POST'])]
public function userType(Request $request)
{
$user = $this->getUser();
if ($user != null) {
return $this->redirectToRoute('homepage');
}
$userType = $request->request->get('userType');
if ($userType) {
$session = $request->getSession();
if (in_array($userType, ['coach', 'club', 'operator'])) {
$session->set('userType', $userType);
return $this->redirectToRoute('registration_email');
}
}
$this->addFlash('error', 'Une erreur est survenue. Veuillez réessayer.');
return $this->redirectToRoute('membership_presentation');
}
#[Route(path: '/registration-email', name: 'registration_email')]
public function registrationEmail(Request $request)
{
if ($this->getUser() != null) {
return $this->redirectToRoute('homepage');
}
$session = $request->getSession();
$userType = $session->get('userType');
return $this->render('front/registration/registration-1.html.twig', [
'userType' => $userType,
'step' => 1
]);
}
#[Route(path: '/send-email-verification-code', name: 'registration_send_email_verification_code', methods: ['POST'])]
public function sendEmailVerificationCode(Request $request, UserRepository $userRepository, ToPro $toPro)
{
\sleep(1);
$data = json_decode($request->getContent(), true);
$email = $data['email'] ?? null;
$session = $request->getSession();
if ($email) {
$existingUser = $userRepository->findOneBy(['email' => $email]);
if ($existingUser) {
$this->addFlash('error', 'Un compte existe déjà avec cet email');
return new JsonResponse(['status' => 'error']);
}
$session->set('registrationEmail', $email);
// Génère un code
$code = random_int(123456, 987600);
$session->set('verificationCode', $code);
$locale = $this->request->getLocale();
$toPro->sendVericationCode($email, $code, $locale);
return new JsonResponse(['status' => 'success']);
}
$this->addFlash('error', 'Une erreur est survenue. Veuillez réessayer.');
return new JsonResponse(['status' => 'error']);
}
#[Route(path: '/verify-email-code', name: 'registration_verify_email_code', methods: ['POST'])]
public function verifyEmailCode(Request $request)
{
\sleep(1);
$data = json_decode($request->getContent(), true);
$email = $data['email'] ?? null;
$code = $data['code'] ?? null;
$session = $request->getSession();
$emailSession = $session->get('registrationEmail');
if ($emailSession != $email) {
$this->addFlash('error', 'Une erreur est survenue. Veuillez réessayer.');
return new JsonResponse(['status' => 'error', 'type' => 'error1', 'emailSession' => $emailSession, 'email' => $email]);
}
if ($email && $code) {
if ($code != $session->get('verificationCode')) {
return new JsonResponse(['status' => 'error', 'type' => 'errorCode', 'message' => 'Code invalide']);
}
$session->set('registrationEmailVerified', true);
$redirectionUrl = $this->generateUrl('registration_password');
$session->remove('verificationCode');
return new JsonResponse(['status' => 'success', 'redirectionUrl' => $redirectionUrl]);
}
$this->addFlash('error', 'Une erreur est survenue. Veuillez réessayer.');
return new JsonResponse(['status' => 'error', 'type' => 'error2', 'email' => $email, 'code' => $code]);
}
#[Route(path: '/registration-password', name: 'registration_password')]
public function registrationPassword(Request $request)
{
$user = $this->getUser();
if ($user != null) {
return $this->redirectToRoute('homepage');
}
$session = $request->getSession();
$userType = $session->get('userType');
if ($session->get('registrationEmailVerified') != true) {
return $this->redirectToRoute('registration_email');
}
if ($request->request->get('password')) {
$session->set('registrationPassword', $request->request->get('password'));
return $this->redirectToRoute('registration_phone');
}
return $this->render('front/registration/registration-2.html.twig', [
'userType' => $userType,
'step' => 2
]);
}
#[Route(path: '/registration-phone', name: 'registration_phone')]
public function registrationPhone(Request $request)
{
$user = $this->getUser();
if ($user != null) {
return $this->redirectToRoute('homepage');
}
$session = $request->getSession();
$userType = $session->get('userType');
if ($session->get('registrationEmailVerified') != true ) {
return $this->redirectToRoute('registration_email');
}
if ($session->get('registrationPassword') != true) {
return $this->redirectToRoute('registration_password');
}
return $this->render('front/registration/registration-3.html.twig', [
'userType' => $userType,
'step' => 3
]);
}
#[Route(path: '/send-phone-verification-code', name: 'registration_send_phone_verification_code', methods: ['POST'])]
public function sendPhoneVerificationCode(Request $request, TwilioService $twilioService)
{
\sleep(1);
$data = json_decode($request->getContent(), true);
$phone = $data['phone'] ?? null;
$session = $request->getSession();
if ($phone) {
// Génère un code
$code = random_int(123456, 987600);
$session->set('verificationCode', $code);
$message = "Votre code de vérification Racket Trip est : " . $code;
try {
$twilioService->sendSms($phone, $message);
} catch (\Exception $e) {
return new JsonResponse(['status' => 'error', 'message' => 'Numéro de téléphone invalide.'], 400);
}
$session->set('registrationPhone', $phone);
return new JsonResponse(['status' => 'success']);
}
$this->addFlash('error', 'Une erreur est survenue. Veuillez réessayer.');
return new JsonResponse(['status' => 'error']);
}
#[Route(path: '/verify-phone-code', name: 'registration_verify_phone_code', methods: ['POST'])]
public function verifyPhoneCode(Request $request)
{
\sleep(1);
$data = json_decode($request->getContent(), true);
$phone = $data['phone'] ?? null;
$code = $data['code'] ?? null;
$session = $request->getSession();
$emailSession = $session->get('registrationPhone');
if ($emailSession != $phone) {
$this->addFlash('error', 'Une erreur est survenue. Veuillez réessayer.');
return new JsonResponse(['status' => 'error', 'type' => 'error']);
}
if ($phone && $code) {
if ($code != $session->get('verificationCode')) {
return new JsonResponse(['status' => 'error', 'type' => 'errorCode', 'message' => 'Code invalide']);
}
$session->set('registrationPhoneVerified', true);
$session->remove('verificationCode');
$userType = $session->get('userType');
// Redirection vers la page d'informations
if (in_array($userType, ['coach', 'club', 'operator'])) {
$redirectionUrl = $this->generateUrl('pro_registration_informations');
} else {
$redirectionUrl = $this->generateUrl('trainee_registration_informations');
}
return new JsonResponse(['status' => 'success', 'redirectionUrl' => $redirectionUrl]);
}
$this->addFlash('error', 'Une erreur est survenue. Veuillez réessayer.');
return new JsonResponse(['status' => 'error', 'type' => 'error']);
}
#[Route(path: '/pro-registration-informations', name: 'pro_registration_informations')]
public function registration(Request $request, EntityManagerInterface $manager, RoleRepository $roleRepository, UserPasswordHasherInterface $passwordHasher)
{
if ($this->getUser() != null) {
return $this->redirectToRoute('homepage');
}
$slugger = new AsciiSlugger();
$timeZone = $this->internationalService->findVisitorTimeZone();
$session = $request->getSession();
$userType = $session->get('userType');
$email = $session->get('registrationEmail');
$phone = $session->get('registrationPhone');
$password = $session->get('registrationPassword');
if ($userType == null || $email == null || $password == null || $phone == null) {
$this->addFlash('error', 'Une erreur est survenue. Veuillez réessayer.');
return $this->redirectToRoute('homepage');
}
// Choix de l'entité et du FormType
switch ($userType) {
case 'coach':
$pro = new Coach();
$formType = CoachRegistrationType::class;
break;
case 'club':
$pro = new Club();
$formType = ClubRegistrationType::class;
break;
case 'operator':
$pro = new Operator();
$formType = OperatorRegistrationType::class;
break;
default:
$this->addFlash('error', 'Une erreur est survenue. Veuillez réessayer.');
return $this->redirectToRoute('membership_presentation');
}
$form = $this->createForm($formType, $pro);
$form->handleRequest($request);
if ($form->isSubmitted() && $form->isValid()) {
$hashed = $passwordHasher->hashPassword($pro, $password);
$pro->setEmail($email)
->setTelephone($phone)
->setPassword($hashed);
$proInfo = $pro->getProInfo();
$proInfo->setPageVisible(false)
->setCoverPhoto('cover.png')
->setContactEmail($pro->getEmail());
// Particularités selon le userType
switch ($userType) {
case 'coach':
$proInfo->setFullname($pro->getFirstname() . ' ' . $pro->getLastname());
$coachInfo = new CoachInfo();
$coachInfo->setOwner($pro)
->setName($proInfo->getFullname())
->setAddress($pro->getAddress());
$manager->persist($coachInfo);
break;
case 'club':
$proInfo->setFullname($pro->getClubInfo()->getName());
$clubInfo = $pro->getClubInfo();
$clubInfo->setOwner($pro)
->setName($proInfo->getFullname())
->setAddress($pro->getAddress());
$manager->persist($clubInfo);
break;
case 'operator':
$proInfo->setFullname($pro->getOperatorInfo()->getName());
$operatorInfo = $pro->getOperatorInfo();
$operatorInfo->setOwner($pro);
$proInfo->setFullname($operatorInfo->getName())
->setContactEmail($pro->getEmail());
$manager->persist($operatorInfo);
break;
}
// Gestion des sports
foreach ($proInfo->getSports() as $sport) {
$sport->addPro($proInfo);
$manager->persist($sport);
// Seulement pour club ➔ créer des disponibilités
if ($userType === 'club') {
$availability = new Availability();
$availability->setSport($sport)->setClub($pro);
$manager->persist($availability);
}
}
$slug = strtolower($slugger->slug(
($userType === 'coach'
? $pro->getFirstname() . '-' . $pro->getLastname()
: $proInfo->getFullname()
) . '-' . rand(10000, 98765)
));
$role = $roleRepository->findOneBy(['title' => 'ROLE_PRO']);
$pro->setRegisteredAt(new \DateTime())
->setToken($this->generateString(32))
->setIsPro(true)
->setSlug($slug)
->setPhoto('default-profile.png')
->setTimezone($timeZone)
->setNotification(true)
->setActivated(false)
->setHasAccess(false)
->addUserRole($role)
->setPassword($hashed)
->setStatus('online')
->setLanguage($this->request->getLocale());
// Spécificité pour lier clubInfo / operatorInfo
if ($userType === 'club') {
$clubInfo = $pro->getClubInfo();
$clubInfo->setOwner($pro)
->setName($proInfo->getFullname())
->setAddress($pro->getAddress());
$manager->persist($clubInfo);
}
if ($userType === 'operator') {
$operatorInfo = $pro->getOperatorInfo();
$operatorInfo->setOwner($pro);
$manager->persist($operatorInfo);
}
try {
$manager->persist($proInfo);
$manager->persist($pro);
$manager->flush();
} catch (\Throwable $th) {
$this->addFlash('error', "Une erreur s'est produite. Veuillez réessayer.");
return $this->redirectToRoute('pro_registration_type');
}
if ($pro->getNewsletter()) {
$this->brevoService->createBrevoContact(
method_exists($pro, 'getFirstname') ? $pro->getFirstname() : '',
method_exists($pro, 'getLastname') ? $pro->getLastname() : '',
$pro->getEmail(),
'pro'
);
}
return $this->redirectToRoute('pro_activate_account', [
'token' => $pro->getToken()
]);
}
return $this->render('front/registration/registration-pro.html.twig', [
'form' => $form->createView(),
'userType' => $userType,
'step' => 5
]);
}
#[Route(path: '/trainee-registration-informations', name: 'trainee_registration_informations')]
public function traineeRegistration(Request $request, EntityManagerInterface $manager, BrevoService $brevoService, RoleRepository $roleRepository, UserPasswordHasherInterface $passwordHasher, ToTrainee $toTrainee, SportRepository $sportRepo)
{
if ($this->getUser() != null) {
return $this->redirectToRoute('homepage');
}
$timeZone = $this->internationalService->findVisitorTimeZone();
$session = $request->getSession();
$userType = $session->get('userType');
$email = $session->get('registrationEmail');
$phone = $session->get('registrationPhone');
$password = $session->get('registrationPassword');
if ($userType == null || $email == null || $password == null || $phone == null) {
$this->addFlash('error', 'Une erreur est survenue. Veuillez réessayer.');
return $this->redirectToRoute('homepage');
}
$trainee = new Trainee();
$trainee->setTimezone($timeZone);
$sports = $sportRepo->findAll();
foreach ($sports as $sport) {
$sportTrainee = new SportTrainee();
$sportTrainee->setTrainee($trainee)
->setSport($sport);
$trainee->addSport($sportTrainee);
}
$form = $this->createForm(TraineeRegisterType::class, $trainee);
$form->handleRequest($request);
if ($form->isSubmitted() && $form->isValid()) {
$password = $trainee->getPassword();
$hashed = $passwordHasher->hashPassword($trainee, $password);
$sportsTrainee = $trainee->getSports();
foreach ($sportsTrainee as $sportsTrainee) {
if ($sportsTrainee->getLevel() == null) {
$trainee->removeSport($sportsTrainee);
} else {
$manager->persist($sportsTrainee);
}
}
$slugger = new AsciiSlugger();
$slug = strtolower($slugger->slug($trainee->getFirstname() . '-' . $trainee->getLastname() . '-' . rand(10000, 98765)));
$role = $roleRepository->findOneBy(['title' => 'ROLE_TRAINEE']);
$trainee->setRegisteredAt(new DateTime())
->setToken($this->generateString(32))
->addUserRole($role)
->setSlug($slug)
->setEmail($email)
->setPassword($hashed)
->setTelephone($phone)
->setTimezone($timeZone)
->setPhoto('default-profile.png')
->setIsPro(false)
->setNotification(true)
->setActivated(false)
->setHasAccess(true)
->setStatus('online')
->setLanguage($this->request->getLocale());
try {
$manager->persist($trainee);
$manager->flush();
} catch (\Throwable $th) {
$this->addFlash(
'error',
"Une erreur s'est produite. Veillez réessayer"
);
return $this->redirectToRoute('trainee_registration_informations');
}
if ($trainee->getNewsletter()) {
$brevoService->createBrevoContact($trainee->getFirstname(), $trainee->getLastname(), $trainee->getEmail(), 'trainee');
}
//$toTrainee->confirmEmail($trainee);
return $this->redirectToRoute('trainee_activate_account', [
'token' => $trainee->getToken()
]);
}
return $this->render('front/registration/registration-trainee.html.twig', [
'form' => $form->createView(),
'sports' => $sports,
'userType' => $userType,
'step' => 5
]);
}
#[Route(path: '/activate-account/{token}', name: 'pro_activate_account')]
public function proVerifyEmail(Request $request, UserRepository $userRepo, $token, EntityManagerInterface $manager, StripeService $stripeService, TokenStorageInterface $tokenStorage, ToPro $toPro)
{
$user = $userRepo->findOneBy(['token' => $token]);
if (!$user) {
return $this->redirectToRoute('homepage');
}
$stripeInfo = new StripeInfo;
$stripeCustomer = $stripeService->createStripeCustomer($user);
$stripeAccount = $stripeService->createStripeAccount($user);
$stripeInfo->setCustomerId($stripeCustomer->id)
->setAccountId($stripeAccount->id);
$manager->persist($stripeInfo);
$user->setActivated(true)
->setStripeInfo($stripeInfo)
->setToken($this->generateString(32));
$manager->flush($user);
//$toPro->confirmEmail($pro);
$token = new UsernamePasswordToken($user, null, 'main', $user->getRoles());
$tokenStorage->setToken($token);
//$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.');
return $this->redirectToRoute('membership', [
'type' => $user->getProType(),
]);
}
#[Route(path: '/activate-trainee-account/{token}', name: 'trainee_activate_account')]
public function traineeVerifyEmail(UserRepository $userRepo, $token, TokenStorageInterface $tokenStorage, EntityManagerInterface $manager, NoteRequestRepository $noteRequestRepository)
{
$user = $userRepo->findOneBy(['token' => $token]);
if (!$user) {
return $this->redirectToRoute('homepage');
}
$user->setActivated(true)
->setToken($this->generateString(32));
$manager->flush($user);
$token = new UsernamePasswordToken($user, null, 'main', $user->getRoles());
$tokenStorage->setToken($token);
$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.');
if ($noteRequestRepository->findOneBy(['email' => $user->getEmail(), 'status' => 'pending'])) {
$this->addFlash(
'success',
"Votre compte a été activé avec succès. Vous pouvez maintenant reserver des stages. Vous avez une demande de notation en attente."
);
return $this->redirectToRoute('pro_note_requested');
}
return $this->redirectToRoute('homepage');
}
/*
#[Route(path: '/registration-informations', name: 'registration_informations')]
public function proRegistrationInformations(Request $request, EntityManagerInterface $manager, RoleRepository $roleRepository, UserPasswordHasherInterface $passwordHasher, ToPro $toPro, UserRepository $userRepository)
{
$user = $this->getUser();
if ($user != null) {
return $this->redirectToRoute('homepage');
}
$timeZone = $this->internationalService->findVisitorTimeZone();
$session = $request->getSession();
$userType = $session->get('userType');
$email = $session->get('registrationEmail');
$password = $session->get('registrationPassword');
$phone = $session->get('registrationPhone');
if ($userType == null || $email == null || $password == null || $phone == null) {
return $this->redirectToRoute('pro_registration_type');
}
if ($userType == 'coach') {
$pro = new Coach();
$form = $this->createForm(CoachRegisterType::class, $pro);
}
if ($userType == 'club') {
$pro = new Club();
$form = $this->createForm(ClubRegisterType::class, $pro);
}
if ($userType == 'operator') {
$pro = new Operator();
$form = $this->createForm(OperatorRegisterType::class, $pro);
}
$form->handleRequest($request);
$slugger = new AsciiSlugger();
if ($form->isSubmitted() && $form->isValid()) {
$hashed = $passwordHasher->hashPassword($pro, $password);
$proInfo = $pro->getProInfo();
$proInfo->setFullname($pro->getFirstname() . ' ' . $pro->getLastname())
->setPageVisible(false)
->setCoverPhoto('cover.png')
->setHaveSubscription(false)
->setContactEmail($email);
$sports = $proInfo->getSports();
foreach ($sports as $sport) {
$sport->addPro($proInfo);
$manager->persist($sport);
}
$slug = strtolower($slugger->slug($pro->getFirstname() . '-' . $pro->getLastname() . '-' . rand(10000, 98765)));
$role = $roleRepository->findOneBy(['title' => 'ROLE_PRO']);
$pro->setRegisteredAt(new DateTime())
->setToken($this->generateString(32))
->setTimezone($timeZone)
->addUserRole($role)
->setIsPro(true)
->setPhoto('default-profile.png')
->setSlug($slug)
->setNotification(true)
->setActivated(false)
->setHasAccess(false)
->setPassword($hashed)
->setStatus('online')
->setLanguage($this->request->getLocale());
$coachInfo = new CoachInfo();
$coachInfo->setOwner($pro)
->setName($proInfo->getFullname())
->setAddress($pro->getAddress());
try {
$manager->persist($proInfo);
$manager->persist($pro);
$manager->persist($coachInfo);
$manager->flush();
} catch (\Throwable $th) {
$this->addFlash(
'success',
"Une erreur s'est produite. Veillez réessayer"
);
return $this->redirectToRoute('coach_register');
}
if ($pro->getNewsletter()) {
$this->brevoService->createBrevoContact($pro->getFirstname(), $pro->getLastname(), $pro->getEmail(), 'pro');
}
$toPro->confirmEmail($pro);
$this->addFlash(
'registration',
""
);
return $this->redirectToRoute('homepage');
}
return $this->render('front/pro/registration/coach-registration.html.twig', [
'form' => $form->createView(),
'type' => 'coach'
]);
}
#[Route(path: '/coach-registration', name: 'coach_register')]
public function coachRegistration(Request $request, EntityManagerInterface $manager, RoleRepository $roleRepository, UserPasswordHasherInterface $passwordHasher, ToPro $toPro, UserRepository $userRepository)
{
$user = $this->getUser();
if ($user != null) {
return $this->redirectToRoute('homepage');
}
$timeZone = $this->internationalService->findVisitorTimeZone();
$coach = new Coach();
$slugger = new AsciiSlugger();
$form = $this->createForm(CoachRegisterType::class, $coach);
$form->handleRequest($request);
if ($form->isSubmitted() && $form->isValid()) {
if ($userRepository->findOneBy(['email' => $coach->getEmail()])) {
$form->get('email')->addError(new FormError("Un compte existe avec cet email"));
} else {
$password = $coach->getPassword();
$hashed = $passwordHasher->hashPassword($coach, $password);
$proInfo = $coach->getProInfo();
$proInfo->setFullname($coach->getFirstname() . ' ' . $coach->getLastname())
->setPageVisible(false)
->setCoverPhoto('cover.png')
->setHaveSubscription(false)
->setContactEmail($coach->getEmail());
$sports = $proInfo->getSports();
foreach ($sports as $sport) {
$sport->addPro($proInfo);
$manager->persist($sport);
}
$slug = strtolower($slugger->slug($coach->getFirstname() . '-' . $coach->getLastname() . '-' . rand(10000, 98765)));
$role = $roleRepository->findOneBy(['title' => 'ROLE_PRO']);
$coach->setRegisteredAt(new DateTime())
->setToken($this->generateString(32))
->setTimezone($timeZone)
->addUserRole($role)
->setIsPro(true)
->setPhoto('default-profile.png')
->setSlug($slug)
->setNotification(true)
->setActivated(false)
->setHasAccess(false)
->setPassword($hashed)
->setStatus('online')
->setLanguage($this->request->getLocale());
$coachInfo = new CoachInfo();
$coachInfo->setOwner($coach)
->setName($proInfo->getFullname())
->setAddress($coach->getAddress());
try {
$manager->persist($proInfo);
$manager->persist($coach);
$manager->persist($coachInfo);
$manager->flush();
} catch (\Throwable $th) {
$this->addFlash(
'success',
"Une erreur s'est produite. Veillez réessayer"
);
return $this->redirectToRoute('coach_register');
}
if ($coach->getNewsletter()) {
$this->brevoService->createBrevoContact($coach->getFirstname(), $coach->getLastname(), $coach->getEmail(), 'pro');
}
$toPro->confirmEmail($coach);
$this->addFlash(
'registration',
""
);
return $this->redirectToRoute('homepage');
}
}
return $this->render('front/pro/registration/coach-registration.html.twig', [
'form' => $form->createView(),
'type' => 'coach'
]);
}
#[Route(path: '/club-registration', name: 'club_register')]
public function clubRegister(Request $request, EntityManagerInterface $manager, RoleRepository $roleRepository, UserPasswordHasherInterface $passwordHasher, ToPro $toPro, UserRepository $userRepository)
{
$user = $this->getUser();
if ($user != null) {
return $this->redirectToRoute('homepage');
}
$timeZone = $this->internationalService->findVisitorTime();
$club = new Club();
$slugger = new AsciiSlugger();
$form = $this->createForm(ClubRegisterType::class, $club);
$form->handleRequest($request);
if ($form->isSubmitted() && $form->isValid()) {
if ($userRepository->findOneBy(['email' => $club->getEmail()])) {
$form->get('email')->addError(new FormError("Un compte existe avec cet email"));
} else {
$password = $club->getPassword();
$hashed = $passwordHasher->hashPassword($club, $password);
$proInfo = $club->getProInfo();
$proInfo->setFullname($club->getClubInfo()->getName())
->setPageVisible(false)
->setCoverPhoto('cover.png')
->setContactEmail($club->getEmail());
$sports = $proInfo->getSports();
foreach ($sports as $sport) {
$sport->addPro($proInfo);
$availability = new Availability();
$availability->setSport($sport)
->setClub($club);
$manager->persist($availability);
$manager->persist($club);
$manager->persist($sport);
}
$slug = strtolower($slugger->slug($club->getClubInfo()->getName() . '-' . rand(10000, 98765)));
$role = $roleRepository->findOneBy(['title' => 'ROLE_PRO']);
$club->setRegisteredAt(new DateTime())
->setToken($this->generateString(32))
->setIsPro(true)
->addUserRole($role)
->setTimezone($timeZone)
->setPhoto('default-profile.png')
->setSlug($slug)
->setNotification(true)
->setActivated(false)
->setHasAccess(false)
->setPassword($hashed)
->setStatus('online')
->setLanguage($this->request->getLocale());
$clubInfo = $club->getClubInfo();
$clubInfo->setOwner($club)
->setName($proInfo->getFullname())
->setAddress($club->getAddress());
try {
$manager->persist($proInfo);
$manager->persist($club);
$manager->persist($clubInfo);
$manager->flush();
} catch (\Throwable $th) {
$this->addFlash(
'success',
"Une erreur s'est produite. Veillez réessayer"
);
return $this->redirectToRoute('club_register');
}
if ($club->getNewsletter()) {
$this->brevoService->createBrevoContact($club->getFirstname(), $club->getLastname(), $club->getEmail(), 'pro');
}
$toPro->confirmEmail($club);
$this->addFlash(
'registration',
""
);
return $this->redirectToRoute('homepage');
}
}
return $this->render('front/pro/registration/club-registration.html.twig', [
'form' => $form->createView(),
'type' => 'club'
]);
}
#[Route(path: '/operator-registration', name: 'operator_register')]
public function operatorRegister(Request $request, EntityManagerInterface $manager, RoleRepository $roleRepository, UserPasswordHasherInterface $passwordHasher, ToPro $toPro, UserRepository $userRepository)
{
$user = $this->getUser();
if ($user != null) {
return $this->redirectToRoute('homepage');
}
$timeZone = $this->internationalService->findVisitorTimeZone();
$operator = new Operator();
$slugger = new AsciiSlugger();
$form = $this->createForm(OperatorRegisterType::class, $operator);
$form->handleRequest($request);
if ($form->isSubmitted() && $form->isValid()) {
if ($userRepository->findOneBy(['email' => $operator->getEmail()])) {
$form->get('email')->addError(new FormError("Un compte existe avec cet email"));
} else {
$password = $operator->getPassword();
$hashed = $passwordHasher->hashPassword($operator, $password);
$proInfo = $operator->getProInfo();
$proInfo->setFullname($operator->getOperatorInfo()->getName())
->setPageVisible(false)
->setCoverPhoto('cover.png')
->setContactEmail($operator->getEmail());
$sports = $proInfo->getSports();
foreach ($sports as $sport) {
$sport->addPro($proInfo);
$manager->persist($sport);
}
$slug = strtolower($slugger->slug($operator->getOperatorInfo()->getName() . '-' . rand(10000, 98765)));
$role = $roleRepository->findOneBy(['title' => 'ROLE_PRO']);
$operator->setRegisteredAt(new DateTime())
->setToken($this->generateString(32))
->addUserRole($role)
->setIsPro(true)
->setSlug($slug)
->setPhoto('default-profile.png')
->setTimezone($timeZone)
->setNotification(true)
->setActivated(false)
->setPassword($hashed)
->setHasAccess(false)
->setStatus('online')
->setLanguage($this->request->getLocale());
$operatorInfo = $operator->getOperatorInfo();
$operatorInfo->setOwner($operator);
$proInfo->setFullname($operatorInfo->getName())
->setContactEmail($operator->getEmail());
try {
$manager->persist($proInfo);
$manager->persist($operator);
$manager->persist($operatorInfo);
$manager->flush();
} catch (\Throwable $th) {
$this->addFlash(
'success',
"Une erreur s'est produite. Veillez réessayer"
);
return $this->redirectToRoute('operator_register');
}
if ($operator->getNewsletter()) {
$this->brevoService->createBrevoContact($operator->getFirstname(), $operator->getLastname(), $operator->getEmail(), 'pro');
}
$toPro->confirmEmail($operator);
$this->addFlash(
'registration',
""
);
return $this->redirectToRoute('homepage');
}
}
return $this->render('front/pro/registration/operator-registration.html.twig', [
'form' => $form->createView(),
'type' => 'operator'
]);
}
*/
}