src/Controller/PrivatisationController.php line 32

Open in your IDE?
  1. <?php
  2. namespace App\Controller;
  3. use App\Entity\Contact;
  4. use App\Entity\Privatisation;
  5. use App\Form\PrivatisationType;
  6. use App\Service\ContactService;
  7. use App\Service\ExtraReservationService;
  8. use App\Service\HcaptchaService;
  9. use App\Service\PrivatisationService;
  10. use Symfony\Component\HttpFoundation\Request;
  11. use Symfony\Component\HttpFoundation\Response;
  12. use Symfony\Component\Routing\Annotation\Route;
  13. use Symfony\Bundle\FrameworkBundle\Controller\AbstractController;
  14. use Symfony\Contracts\Cache\CacheInterface;
  15. class PrivatisationController extends AbstractController
  16. {
  17.     public function __construct(
  18.         private HcaptchaService $hcaptchaService,
  19.         private ContactService $contactService,
  20.         private CacheInterface $cache
  21.     ) {}
  22.     
  23.     #[Route(path'/privatisation'name'privatisation_tunnel')]
  24.     public function tunnelPrivatisation(Request $requestExtraReservationService $extraReservationServicePrivatisationService $privatisationService): Response
  25.     {
  26.         $privatisation = new Privatisation;
  27.         $extraReservationService->generateExtraReservations($privatisation);
  28.         $form $this->createForm(PrivatisationType::class, $privatisation);
  29.         $form->handleRequest($request);
  30.         if ($form->isSubmitted() && $form->isValid()) {
  31.             // Validate hCaptcha before processing the form
  32.             if (!$this->hcaptchaService->validateHcaptcha($request)) {
  33.                 $this->addFlash('error''Le captcha n\'a pas été validé, veuillez réessayer.');
  34.                 return $this->redirectToRoute('privatisation_tunnel');
  35.             }
  36.             // Handle contact creation/retrieval
  37.             $contactData $form->get('contactData')->getData();
  38.             $contact $this->findOrCreateContact($contactData);
  39.             
  40.             // Handle newsletter preference from form
  41.             $checkedAcceptPromotion $form->get('checkedAcceptPromotion')->getData();
  42.             if ($checkedAcceptPromotion !== null) {
  43.                 $contact->setNewsletter($checkedAcceptPromotion);
  44.                 $this->contactService->save($contact);
  45.             }
  46.             $privatisation->setContact($contact);
  47.             
  48.             // Manually set nbParticipants since it's not mapped in the form
  49.             $nbParticipants $form->get('nbParticipants')->getData();
  50.             if ($nbParticipants !== null) {
  51.                 $privatisation->setNbParticipants($nbParticipants);
  52.             }
  53.             // Ensure resteAPayer is set to total price when creating from tunnel
  54.             $prices $privatisationService->computePrices($privatisation);
  55.             $privatisation->setResteAPayer($prices['totalTTC']);
  56.             if(!$privatisationService->save($privatisation)) {
  57.                 $this->addFlash('error''Une erreur est survenue, veuillez réessayer.');
  58.                 return $this->redirectToRoute('privatisation_tunnel');
  59.             }
  60.             // Clear the pending privatisation count cache since we created a new one with pending status
  61.             $this->cache->delete('pending_privatisation_count');
  62.             $privatisationService->sendPrivatisationNotificationToClient($privatisation);
  63.             $privatisationService->sendPrivatisationNotificationToTaaka($privatisation);
  64.             return $this->render('privatisation/confirmation.html.twig');
  65.         }
  66.         $siteKeyHcaptcha $this->getParameter('hcaptcha_site_key');
  67.         return $this->renderForm('privatisation/tunnel.html.twig', [
  68.             'form' => $form,
  69.             'siteKeyHcaptcha' => $siteKeyHcaptcha,
  70.         ]);
  71.     }
  72.     private function findOrCreateContact(array $contactData): Contact
  73.     {
  74.         // Try to find existing contact by email
  75.         $contact $this->contactService->findOneByEmail($contactData['email']);
  76.         
  77.         if (!$contact) {
  78.             // Create new contact
  79.             $contact = new Contact();
  80.         }
  81.         
  82.         // Update contact data
  83.         $contact->setPrenom($contactData['firstname']);
  84.         $contact->setNom($contactData['lastname']);
  85.         $contact->setEmail($contactData['email']);
  86.         $contact->setTelephone($contactData['phoneNumber'] ?? '');
  87.         $contact->setAdresse($contactData['address'] ?? '');
  88.         $contact->setVille($contactData['city'] ?? '');
  89.         $contact->setCodePostal($contactData['postalCode'] ?? '');
  90.         $contact->setPays($contactData['country'] ?? 'FR');
  91.         $contact->setCompany($contactData['company'] ?? '');
  92.         
  93.         $this->contactService->save($contact);
  94.         
  95.         return $contact;
  96.     }
  97.     #[Route(path'/admin/privatisation/view/{privatisation}'name'app_privatisation_view')]
  98.     public function update(Privatisation $privatisationPrivatisationService $privatisationService)
  99.     {
  100.         return $this->renderForm('privatisation/view.html.twig', [
  101.             'privatisation' => $privatisation,
  102.             'prices' => $privatisationService->computePrices($privatisation),
  103.         ]);
  104.     }
  105.     #[Route(path'/admin/privatisation/send/{privatisation}'name'app_privatisation_send')]
  106.     public function send(Privatisation $privatisationPrivatisationService $privatisationService)
  107.     {
  108.         $privatisationService->sendPrivatisationNotificationToTaaka($privatisation);
  109.         $privatisationService->sendPrivatisationNotificationToClient($privatisation);
  110.         $this->addFlash('success''Email envoyé');
  111.         return $this->redirectToRoute('admin_privatisation_index');
  112.     }
  113. }