<?php
namespace App\Controller\Adherent\Registration;
use App\Entity\Person;
use App\Entity\Registration;
use App\Security\Voter\PersonVoter;
use App\Service\Mailer\Email\NewRegistration;
use App\Service\Mailer\Email\NewUser;
use App\Service\Mailer\MailerManager;
use App\Service\Mailer\RegistrationMailManager;
use App\Service\Registration\OrderManager;
use Exception;
use Sensio\Bundle\FrameworkExtraBundle\Configuration\IsGranted;
use Symfony\Component\HttpFoundation\Request;
use Symfony\Component\HttpFoundation\Response;
use Symfony\Component\Routing\Annotation\Route;
use Symfony\Component\Security\Core\Authentication\Token\Storage\TokenStorageInterface;
#[Route(path: '/inscription', name: 'registration_')]
class RegistrationController extends AbstractRegistrationController
{
#[Route(path: '/dump', name: 'dump')]
public function dump()
{
$this->registrationSession->dump(true);
}
#[Route(name: 'home')]
public function home(): Response
{
return $this->redirectToRoute('registration_user');
}
#[Route(path: '/reinitialiser', name: 'reset')]
public function reset(Request $request, TokenStorageInterface $tokenStorage): Response
{
$family = $this->getUser()?->getPerson()?->getFamily();
$this->registrationSession->reset();
if ($family) {
return $this->redirectToRoute('dashboard');
}
return $this->redirectToRoute('registration_home');
}
#[Route(path: '/nouvelle-inscription/{uuid}', name: 'existing_person')]
#[IsGranted(PersonVoter::EDIT, 'person')]
public function existingPerson(Person $person): Response
{
$this->registrationSession->reset();
$this->registrationSession
->setFamily($person->getFamily())
->setPerson($person)
->setStep(3);
return $this->redirectToRoute('registration_person');
}
#[Route(path: '/nouveau-membre', name: 'new_person')]
public function newPerson(): Response
{
$this->registrationSession->reset();
$this->registrationSession
->setFamily($this->getUser()->getPerson()->getFamily())
->setStep(3);
return $this->redirectToRoute('registration_person');
}
#[Route(path: '/finalisation', name: 'finalize')]
public function finalize(Request $request, OrderManager $orderManager, MailerManager $mailer): Response
{
$step = 9;
if ($step > $this->registrationSession->getStep()) {
return $this->redirectToRoute('registration_user');
}
$season = $this->registrationSession->getSeason();
$person = $this->registrationSession->getPerson();
$user = $this->getUser();
$registration = (new Registration())
->setPerson($person)
->setSeason($season);
if ($donation = $this->registrationSession->getDonation()) {
$orderManager->updateDonation($registration, $donation);
}
$this->em->persist($registration);
$isTemporary = $user->isIsTemporary();
$user->setIsTemporary(false);
try {
$this->em->flush();
$recipients = RegistrationMailManager::getRegistrationRecipients($registration);
foreach ($recipients as $recipient) {
$email = new NewRegistration($registration, $recipient);
$mailer->sendEmail($email);
}
if ($isTemporary) {
$email = new NewUser($user);
$mailer->sendEmail($email);
}
} catch (Exception $e) {
$message = "Une erreur s'est produite lors de l'enregistrement de votre inscription. Merci de bien vouloir réessayer";
$request->getSession()->getFlashBag()->add('error', $message);
return $this->redirectToRoute('registration_user_validation');
}
$this->registrationSession->reset();
return $this->redirectToRoute('dashboard');
}
}