src/Controller/CompanyWizardController.php line 30

Open in your IDE?
  1. <?php
  2. // src/Controller/CompanyWizardController.php
  3. namespace App\Controller;
  4. use App\Entity\Entreprise;
  5. use App\Entity\User;
  6. use App\Form\CompanyStep1Type;
  7. use App\Form\CompanyStep2Type;
  8. use App\Form\UserRegistrationType;
  9. use Doctrine\ORM\EntityManagerInterface;
  10. use Symfony\Bundle\FrameworkBundle\Controller\AbstractController;
  11. use Symfony\Component\HttpFoundation\Request;
  12. use Symfony\Component\HttpFoundation\Session\SessionInterface;
  13. use Symfony\Component\Routing\Annotation\Route;
  14. use Symfony\Component\PasswordHasher\Hasher\UserPasswordHasherInterface;
  15. use Symfony\Component\HttpFoundation\File\Exception\FileException;
  16. use Symfony\Component\Uid\Uuid;
  17. use Symfony\Component\Security\Http\Authentication\UserAuthenticatorInterface;
  18. use App\Security\AppCustomAuthenticator;
  19. use Symfony\Component\HttpFoundation\Response;
  20. use Symfony\Component\Mailer\MailerInterface;
  21. use Symfony\Component\Mime\Address;
  22. use Symfony\Component\Mime\Email;
  23. class CompanyWizardController extends AbstractController
  24. {
  25.     #[Route('/register/company/step/{step}'name'company_wizard'requirements: ['step' => '\d+'])]
  26.     public function wizard(
  27.         Request $request,
  28.         SessionInterface $session,
  29.         EntityManagerInterface $em,
  30.         UserPasswordHasherInterface $passwordHasher,
  31.         UserAuthenticatorInterface $userAuthenticator,
  32.         AppCustomAuthenticator $authenticator,
  33.         
  34.         MailerInterface $mailer,
  35.         int $step 1
  36.     ) {
  37.         // Vérification que l'étape est valide (1, 2 ou 3)
  38.         if ($step || $step 3) {
  39.             throw $this->createNotFoundException('Cette étape n\'existe pas.');
  40.         }
  41.         // Récupère les données du wizard depuis la session ou un tableau vide
  42.         $data $session->get('company_wizard', []);
  43.         // Crée le formulaire selon l'étape
  44.         $form $this->createFormForStep($step$data);
  45.         $form->handleRequest($request);
  46.         if ($form->isSubmitted() && $form->isValid()) {
  47.             return $this->handleFormSubmission(
  48.                 $step,
  49.                 $form->getData(),
  50.                 $data,
  51.                 $session,
  52.                 $em,
  53.                 $passwordHasher,
  54.                 $form,
  55.                 $userAuthenticator,
  56.                 $authenticator,
  57.                 $request,
  58.                 $mailer
  59.             );
  60.         }
  61.         return $this->render('register/wizard.html.twig', [
  62.             'form' => $form->createView(),
  63.             'step' => $step,
  64.             'totalSteps' => 3,
  65.         ]);
  66.     }
  67.     private function createFormForStep(int $step, array $data)
  68.     {
  69.         return match ($step) {
  70.             => $this->createForm(CompanyStep1Type::class, $data['step1'] ?? null),
  71.             => $this->createForm(CompanyStep2Type::class, $data['step2'] ?? null),
  72.             => $this->createForm(UserRegistrationType::class, $data['user'] ?? null),
  73.             default => throw $this->createNotFoundException('Cette étape n\'existe pas.'),
  74.         };
  75.     }
  76.     private function handleFormSubmission(
  77.         int $step,
  78.         array $formData,
  79.         array $data,
  80.         SessionInterface $session,
  81.         EntityManagerInterface $em,
  82.         UserPasswordHasherInterface $passwordHasher,
  83.         $form,
  84.         UserAuthenticatorInterface $userAuthenticator,
  85.         AppCustomAuthenticator $authenticator,
  86.         Request $request,
  87.         MailerInterface $mailer
  88.     ) {
  89.         switch ($step) {
  90.             case 1:
  91.                 $formData $this->handleLogoUpload($form$formData);
  92.                 $data['step1'] = $formData;
  93.                 $session->set('company_wizard'$data);
  94.                 return $this->redirectToRoute('company_wizard', ['step' => 2]);
  95.             case 2:
  96.                 $data['step2'] = $formData;
  97.                 $session->set('company_wizard'$data);
  98.                 return $this->redirectToRoute('company_wizard', ['step' => 3]);
  99.             case 3:
  100.                 $data['user'] = $formData;
  101.                 $existingUser $em->getRepository(User::class)->findOneBy(['email' => $formData['email']]);
  102.                 if ($existingUser) {
  103.                     $this->addFlash('error''Cet email est déjà utilisé.');
  104.         
  105.                     $referer $request->headers->get('referer');
  106.         
  107.                     // Si le referer n'est pas défini, définir une route par défaut
  108.                     $url $referer ?: $this->generateUrl('company_wizard');
  109.                 
  110.                     return $this->redirect($url);
  111.                  
  112.         
  113.                 }
  114.                 $user =$this->persistCompanyAndUser($data$em$passwordHasher,$mailer);
  115.                 $session->remove('company_wizard');
  116.                 $this->addFlash('success''Entreprise et administrateur créés avec succès.');
  117.                 //return $this->redirectToRoute('app_login');
  118.                 // Authentification immédiate
  119.                 $response $userAuthenticator->authenticateUser(
  120.                     $user,
  121.                     $authenticator,
  122.                     $request
  123.                 );
  124.               
  125.         
  126.                 // Par sécurité si l’authenticator ne renvoie rien
  127.                 return $response ?? $this->redirectToRoute('app_souscription_abonnement', ['id'=> $this->getUser()->getId()], Response::HTTP_SEE_OTHER);
  128.         }
  129.     }
  130.     private function handleLogoUpload($form, array $formData): array
  131.     {
  132.         $logoFile $form->get('logoFile')->getData();
  133.         if ($logoFile) {
  134.             $newFilename uniqid() . '.' $logoFile->guessExtension();
  135.             try {
  136.                 $logoFile->move(
  137.                     $this->getParameter('company_logos_directory'),
  138.                     $newFilename
  139.                 );
  140.                 $formData['logoFilename'] = $newFilename;
  141.             } catch (FileException $e) {
  142.                 $this->addFlash('error''Une erreur est survenue lors du téléchargement du logo.');
  143.             }
  144.         }
  145.         return $formData;
  146.     }
  147.     private function persistCompanyAndUser(
  148.         array $data,
  149.         EntityManagerInterface $em,
  150.         UserPasswordHasherInterface $passwordHasher,
  151.         MailerInterface $mailer
  152.     ): User {
  153.         $s1 $data['step1'] ?? [];
  154.         $s2 $data['step2'] ?? [];
  155.         $u $data['user'] ?? [];
  156. //dd($u['plainPassword']['second']);
  157.         // Création de l'entreprise
  158.         $company = new Entreprise();
  159.         $company
  160.             ->setNom($s1['nom'] ?? '')
  161.             ->setNinea($s1['ninea'] ?? '')
  162.             ->setLogoFilename($s1['logoFilename'] ?? null)
  163.             ->setAdresse($s1['adresse'] ?? '')
  164.             ->setLongitude($s1['longitude'] ?? '')
  165.             ->setLatitude($s1['latitude'] ?? '')
  166.             ->setCity($s2['ville'] ?? '')
  167.             ->setPostalCode($s2['codePostal'] ?? '')
  168.             ->setCountry($s2['pays'] ?? '')
  169.             ->setPhone($s2['telephone'] ?? '')
  170.             ->setWebsite($s2['siteWeb'] ?? '');
  171.         $em->persist($company);
  172.         // Création de l'utilisateur admin
  173.         $user = new User();
  174.         $plainPassword  is_array($u['plainPassword'] ?? null)
  175.         ? ($u['plainPassword']['first'] ?? '')
  176.         : ($u['plainPassword'] ?? '');
  177.       //  dd($plainPassword );
  178.         $user
  179.             ->setEmail($u['email'])
  180.             ->setNom($u['lastName'] ?? '')
  181.             ->setPrenom($u['firstName'] ?? $u[''])
  182.             ->setTelephone1($s2['telephone'] ?? '')
  183.             ->setAdresse($s1['adresse'] ?? '')
  184.             ->setUsername($u['username'] ?? $u['email'])
  185.             ->setEntreprise($company)
  186.             ->setRoles(['ROLE_ADMIN'])
  187.             ->setAdresse($s1['adresse'] ?? '')
  188.             ->setConfirmationToken(Uuid::v4()->toRfc4122())
  189.             ->setIsVerified(true)
  190.             ->setPassword($passwordHasher->hashPassword(
  191.                 $user$plainPassword
  192.                // $u['plainPassword']  ?? ''
  193.             ));
  194.         
  195.         $em->persist($user);     
  196.         
  197.        
  198.         $company->setCreatedBy($user);
  199.         $user->setUsername($u['lastName'].$user->getId());
  200.         $em->flush();
  201.         $emailUser strtolower($user->getEmail());
  202.         $username  strtolower($user->getUsername());
  203.         $email = (new Email())
  204.         ->from(new Address('no-reply@cassaclock.com''Cassa Clock'))
  205.         
  206.         //->from('papadembinho@gmail.com')
  207.         ->to($user->getEmail())
  208.         ->replyTo('no-reply@cassaclock.com')
  209.         ->subject('Cassa Clock : Inscription !')
  210.         ->html("Bonjour {$user->getNom()},<br/><br/>
  211.         Votre Compte employeur et votre entreprise sont créés avec succès ! <br/><br/>
  212.         Vos Identifiants:<br/><br/>
  213.         Email: {$emailUser}<br/> ou <br/>
  214.         Username: {$username}<br/>
  215.         Password: Le mot de passe que vous avez mis lors de l\'inscription<br/><br/>
  216.         Pour gérer votre espace, voici votre espace de gestion des pointages:<br/>
  217.         <a href='https://cassaclock.com/admin'>Accéder à mon espace</a>
  218.         <br/><br/>Cdt, Cassa Clock<br/>");
  219.         
  220.         $mailer->send($email);
  221.         
  222.         
  223.         return $user;
  224.     }
  225. }