<?php
// src/Controller/CompanyWizardController.php
namespace App\Controller;
use App\Entity\Entreprise;
use App\Entity\User;
use App\Form\CompanyStep1Type;
use App\Form\CompanyStep2Type;
use App\Form\UserRegistrationType;
use Doctrine\ORM\EntityManagerInterface;
use Symfony\Bundle\FrameworkBundle\Controller\AbstractController;
use Symfony\Component\HttpFoundation\Request;
use Symfony\Component\HttpFoundation\Session\SessionInterface;
use Symfony\Component\Routing\Annotation\Route;
use Symfony\Component\PasswordHasher\Hasher\UserPasswordHasherInterface;
use Symfony\Component\HttpFoundation\File\Exception\FileException;
use Symfony\Component\Uid\Uuid;
use Symfony\Component\Security\Http\Authentication\UserAuthenticatorInterface;
use App\Security\AppCustomAuthenticator;
use Symfony\Component\HttpFoundation\Response;
class CompanyWizardController extends AbstractController
{
#[Route('/register/company/step/{step}', name: 'company_wizard', requirements: ['step' => '\d+'])]
public function wizard(
Request $request,
SessionInterface $session,
EntityManagerInterface $em,
UserPasswordHasherInterface $passwordHasher,
UserAuthenticatorInterface $userAuthenticator,
AppCustomAuthenticator $authenticator,
int $step = 1
) {
// Vérification que l'étape est valide (1, 2 ou 3)
if ($step < 1 || $step > 3) {
throw $this->createNotFoundException('Cette étape n\'existe pas.');
}
// Récupère les données du wizard depuis la session ou un tableau vide
$data = $session->get('company_wizard', []);
// Crée le formulaire selon l'étape
$form = $this->createFormForStep($step, $data);
$form->handleRequest($request);
if ($form->isSubmitted() && $form->isValid()) {
return $this->handleFormSubmission(
$step,
$form->getData(),
$data,
$session,
$em,
$passwordHasher,
$form,
$userAuthenticator,
$authenticator,
$request
);
}
return $this->render('register/wizard.html.twig', [
'form' => $form->createView(),
'step' => $step,
'totalSteps' => 3,
]);
}
private function createFormForStep(int $step, array $data)
{
return match ($step) {
1 => $this->createForm(CompanyStep1Type::class, $data['step1'] ?? null),
2 => $this->createForm(CompanyStep2Type::class, $data['step2'] ?? null),
3 => $this->createForm(UserRegistrationType::class, $data['user'] ?? null),
default => throw $this->createNotFoundException('Cette étape n\'existe pas.'),
};
}
private function handleFormSubmission(
int $step,
array $formData,
array $data,
SessionInterface $session,
EntityManagerInterface $em,
UserPasswordHasherInterface $passwordHasher,
$form,
UserAuthenticatorInterface $userAuthenticator,
AppCustomAuthenticator $authenticator,
Request $request
) {
switch ($step) {
case 1:
$formData = $this->handleLogoUpload($form, $formData);
$data['step1'] = $formData;
$session->set('company_wizard', $data);
return $this->redirectToRoute('company_wizard', ['step' => 2]);
case 2:
$data['step2'] = $formData;
$session->set('company_wizard', $data);
return $this->redirectToRoute('company_wizard', ['step' => 3]);
case 3:
$data['user'] = $formData;
$user =$this->persistCompanyAndUser($data, $em, $passwordHasher);
$session->remove('company_wizard');
$this->addFlash('success', 'Entreprise et administrateur créés avec succès.');
//return $this->redirectToRoute('app_login');
// Authentification immédiate
$response = $userAuthenticator->authenticateUser(
$user,
$authenticator,
$request
);
// Par sécurité si l’authenticator ne renvoie rien
return $response ?? $this->redirectToRoute('app_souscription_abonnement', ['id'=> $this->getUser()->getId()], Response::HTTP_SEE_OTHER);
}
}
private function handleLogoUpload($form, array $formData): array
{
$logoFile = $form->get('logoFile')->getData();
if ($logoFile) {
$newFilename = uniqid() . '.' . $logoFile->guessExtension();
try {
$logoFile->move(
$this->getParameter('company_logos_directory'),
$newFilename
);
$formData['logoFilename'] = $newFilename;
} catch (FileException $e) {
$this->addFlash('error', 'Une erreur est survenue lors du téléchargement du logo.');
}
}
return $formData;
}
private function persistCompanyAndUser(
array $data,
EntityManagerInterface $em,
UserPasswordHasherInterface $passwordHasher
): User {
$s1 = $data['step1'] ?? [];
$s2 = $data['step2'] ?? [];
$u = $data['user'] ?? [];
//dd($u['plainPassword']['second']);
// Création de l'entreprise
$company = new Entreprise();
$company
->setNom($s1['nom'] ?? '')
->setNinea($s1['ninea'] ?? '')
->setLogoFilename($s1['logoFilename'] ?? null)
->setAdresse($s1['adresse'] ?? '')
->setLongitude($s1['longitude'] ?? '')
->setLatitude($s1['latitude'] ?? '')
->setCity($s2['ville'] ?? '')
->setPostalCode($s2['codePostal'] ?? '')
->setCountry($s2['pays'] ?? '')
->setPhone($s2['telephone'] ?? '')
->setWebsite($s2['siteWeb'] ?? '');
$em->persist($company);
// Création de l'utilisateur admin
$user = new User();
$plainPassword = is_array($u['plainPassword'] ?? null)
? ($u['plainPassword']['first'] ?? '')
: ($u['plainPassword'] ?? '');
$user
->setEmail($u['email'])
->setNom($u['lastName'] ?? '')
->setPrenom($u['firstName'] ?? $u[''])
->setTelephone1($s2['telephone'] ?? '')
->setAdresse($s1['adresse'] ?? '')
->setUsername($u['username'] ?? $u['email'])
->setEntreprise($company)
->setRoles(['ROLE_ADMIN'])
->setAdresse($s1['adresse'] ?? '')
->setConfirmationToken(Uuid::v4()->toRfc4122())
->setIsVerified(true)
->setPassword($passwordHasher->hashPassword(
$user, $plainPassword
// $u['plainPassword'] ?? ''
));
$em->persist($user);
$company->setCreatedBy($user);
$em->flush();
return $user;
}
}