src/Controller/CompanyWizardController.php line 41

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. class CompanyWizardController extends AbstractController
  21. {
  22.     #[Route('/register/company/step/{step}'name'company_wizard'requirements: ['step' => '\d+'])]
  23.     public function wizard(
  24.         Request $request,
  25.         SessionInterface $session,
  26.         EntityManagerInterface $em,
  27.         UserPasswordHasherInterface $passwordHasher,
  28.         UserAuthenticatorInterface $userAuthenticator,
  29.         AppCustomAuthenticator $authenticator,
  30.         int $step 1
  31.     ) {
  32.         // Vérification que l'étape est valide (1, 2 ou 3)
  33.         if ($step || $step 3) {
  34.             throw $this->createNotFoundException('Cette étape n\'existe pas.');
  35.         }
  36.         // Récupère les données du wizard depuis la session ou un tableau vide
  37.         $data $session->get('company_wizard', []);
  38.         // Crée le formulaire selon l'étape
  39.         $form $this->createFormForStep($step$data);
  40.         $form->handleRequest($request);
  41.         if ($form->isSubmitted() && $form->isValid()) {
  42.             return $this->handleFormSubmission(
  43.                 $step,
  44.                 $form->getData(),
  45.                 $data,
  46.                 $session,
  47.                 $em,
  48.                 $passwordHasher,
  49.                 $form,
  50.                 $userAuthenticator,
  51.                 $authenticator,
  52.                 $request
  53.             );
  54.         }
  55.         return $this->render('register/wizard.html.twig', [
  56.             'form' => $form->createView(),
  57.             'step' => $step,
  58.             'totalSteps' => 3,
  59.         ]);
  60.     }
  61.     private function createFormForStep(int $step, array $data)
  62.     {
  63.         return match ($step) {
  64.             => $this->createForm(CompanyStep1Type::class, $data['step1'] ?? null),
  65.             => $this->createForm(CompanyStep2Type::class, $data['step2'] ?? null),
  66.             => $this->createForm(UserRegistrationType::class, $data['user'] ?? null),
  67.             default => throw $this->createNotFoundException('Cette étape n\'existe pas.'),
  68.         };
  69.     }
  70.     private function handleFormSubmission(
  71.         int $step,
  72.         array $formData,
  73.         array $data,
  74.         SessionInterface $session,
  75.         EntityManagerInterface $em,
  76.         UserPasswordHasherInterface $passwordHasher,
  77.         $form,
  78.         UserAuthenticatorInterface $userAuthenticator,
  79.         AppCustomAuthenticator $authenticator,
  80.         Request $request
  81.     ) {
  82.         switch ($step) {
  83.             case 1:
  84.                 $formData $this->handleLogoUpload($form$formData);
  85.                 $data['step1'] = $formData;
  86.                 $session->set('company_wizard'$data);
  87.                 return $this->redirectToRoute('company_wizard', ['step' => 2]);
  88.             case 2:
  89.                 $data['step2'] = $formData;
  90.                 $session->set('company_wizard'$data);
  91.                 return $this->redirectToRoute('company_wizard', ['step' => 3]);
  92.             case 3:
  93.                 $data['user'] = $formData;
  94.                 $user =$this->persistCompanyAndUser($data$em$passwordHasher);
  95.                 $session->remove('company_wizard');
  96.                 $this->addFlash('success''Entreprise et administrateur créés avec succès.');
  97.                 //return $this->redirectToRoute('app_login');
  98.                 // Authentification immédiate
  99.                 $response $userAuthenticator->authenticateUser(
  100.                     $user,
  101.                     $authenticator,
  102.                     $request
  103.                 );
  104.            
  105.                 // Par sécurité si l’authenticator ne renvoie rien
  106.                 return $response ?? $this->redirectToRoute('app_souscription_abonnement', ['id'=> $this->getUser()->getId()], Response::HTTP_SEE_OTHER);
  107.         }
  108.     }
  109.     private function handleLogoUpload($form, array $formData): array
  110.     {
  111.         $logoFile $form->get('logoFile')->getData();
  112.         if ($logoFile) {
  113.             $newFilename uniqid() . '.' $logoFile->guessExtension();
  114.             try {
  115.                 $logoFile->move(
  116.                     $this->getParameter('company_logos_directory'),
  117.                     $newFilename
  118.                 );
  119.                 $formData['logoFilename'] = $newFilename;
  120.             } catch (FileException $e) {
  121.                 $this->addFlash('error''Une erreur est survenue lors du téléchargement du logo.');
  122.             }
  123.         }
  124.         return $formData;
  125.     }
  126.     private function persistCompanyAndUser(
  127.         array $data,
  128.         EntityManagerInterface $em,
  129.         UserPasswordHasherInterface $passwordHasher
  130.     ): User {
  131.         $s1 $data['step1'] ?? [];
  132.         $s2 $data['step2'] ?? [];
  133.         $u $data['user'] ?? [];
  134. //dd($u['plainPassword']['second']);
  135.         // Création de l'entreprise
  136.         $company = new Entreprise();
  137.         $company
  138.             ->setNom($s1['nom'] ?? '')
  139.             ->setNinea($s1['ninea'] ?? '')
  140.             ->setLogoFilename($s1['logoFilename'] ?? null)
  141.             ->setAdresse($s1['adresse'] ?? '')
  142.             ->setLongitude($s1['longitude'] ?? '')
  143.             ->setLatitude($s1['latitude'] ?? '')
  144.             ->setCity($s2['ville'] ?? '')
  145.             ->setPostalCode($s2['codePostal'] ?? '')
  146.             ->setCountry($s2['pays'] ?? '')
  147.             ->setPhone($s2['telephone'] ?? '')
  148.             ->setWebsite($s2['siteWeb'] ?? '');
  149.         $em->persist($company);
  150.         // Création de l'utilisateur admin
  151.         $user = new User();
  152.         $plainPassword  is_array($u['plainPassword'] ?? null)
  153.         ? ($u['plainPassword']['first'] ?? '')
  154.         : ($u['plainPassword'] ?? '');
  155.         $user
  156.             ->setEmail($u['email'])
  157.             ->setNom($u['lastName'] ?? '')
  158.             ->setPrenom($u['firstName'] ?? $u[''])
  159.             ->setTelephone1($s2['telephone'] ?? '')
  160.             ->setAdresse($s1['adresse'] ?? '')
  161.             ->setUsername($u['username'] ?? $u['email'])
  162.             ->setEntreprise($company)
  163.             ->setRoles(['ROLE_ADMIN'])
  164.             ->setAdresse($s1['adresse'] ?? '')
  165.             ->setConfirmationToken(Uuid::v4()->toRfc4122())
  166.             ->setIsVerified(true)
  167.             ->setPassword($passwordHasher->hashPassword(
  168.                 $user$plainPassword
  169.                // $u['plainPassword']  ?? ''
  170.             ));
  171.         
  172.         $em->persist($user);        
  173.         $company->setCreatedBy($user);
  174.         $em->flush();
  175.         return $user;
  176.     }
  177. }