<?php
namespace App\Controller;
use App\Entity\Contact;
use App\Entity\Privatisation;
use App\Form\PrivatisationType;
use App\Service\ContactService;
use App\Service\ExtraReservationService;
use App\Service\HcaptchaService;
use App\Service\PrivatisationService;
use Symfony\Component\HttpFoundation\Request;
use Symfony\Component\HttpFoundation\Response;
use Symfony\Component\Routing\Annotation\Route;
use Symfony\Bundle\FrameworkBundle\Controller\AbstractController;
use Symfony\Contracts\Cache\CacheInterface;
class PrivatisationController extends AbstractController
{
public function __construct(
private HcaptchaService $hcaptchaService,
private ContactService $contactService,
private CacheInterface $cache
) {}
#[Route(path: '/privatisation', name: 'privatisation_tunnel')]
public function tunnelPrivatisation(Request $request, ExtraReservationService $extraReservationService, PrivatisationService $privatisationService): Response
{
$privatisation = new Privatisation;
$extraReservationService->generateExtraReservations($privatisation);
$form = $this->createForm(PrivatisationType::class, $privatisation);
$form->handleRequest($request);
if ($form->isSubmitted() && $form->isValid()) {
// Validate hCaptcha before processing the form
if (!$this->hcaptchaService->validateHcaptcha($request)) {
$this->addFlash('error', 'Le captcha n\'a pas été validé, veuillez réessayer.');
return $this->redirectToRoute('privatisation_tunnel');
}
// Handle contact creation/retrieval
$contactData = $form->get('contactData')->getData();
$contact = $this->findOrCreateContact($contactData);
// Handle newsletter preference from form
$checkedAcceptPromotion = $form->get('checkedAcceptPromotion')->getData();
if ($checkedAcceptPromotion !== null) {
$contact->setNewsletter($checkedAcceptPromotion);
$this->contactService->save($contact);
}
$privatisation->setContact($contact);
// Manually set nbParticipants since it's not mapped in the form
$nbParticipants = $form->get('nbParticipants')->getData();
if ($nbParticipants !== null) {
$privatisation->setNbParticipants($nbParticipants);
}
// Ensure resteAPayer is set to total price when creating from tunnel
$prices = $privatisationService->computePrices($privatisation);
$privatisation->setResteAPayer($prices['totalTTC']);
if(!$privatisationService->save($privatisation)) {
$this->addFlash('error', 'Une erreur est survenue, veuillez réessayer.');
return $this->redirectToRoute('privatisation_tunnel');
}
// Clear the pending privatisation count cache since we created a new one with pending status
$this->cache->delete('pending_privatisation_count');
$privatisationService->sendPrivatisationNotificationToClient($privatisation);
$privatisationService->sendPrivatisationNotificationToTaaka($privatisation);
return $this->render('privatisation/confirmation.html.twig');
}
$siteKeyHcaptcha = $this->getParameter('hcaptcha_site_key');
return $this->renderForm('privatisation/tunnel.html.twig', [
'form' => $form,
'siteKeyHcaptcha' => $siteKeyHcaptcha,
]);
}
private function findOrCreateContact(array $contactData): Contact
{
// Try to find existing contact by email
$contact = $this->contactService->findOneByEmail($contactData['email']);
if (!$contact) {
// Create new contact
$contact = new Contact();
}
// Update contact data
$contact->setPrenom($contactData['firstname']);
$contact->setNom($contactData['lastname']);
$contact->setEmail($contactData['email']);
$contact->setTelephone($contactData['phoneNumber'] ?? '');
$contact->setAdresse($contactData['address'] ?? '');
$contact->setVille($contactData['city'] ?? '');
$contact->setCodePostal($contactData['postalCode'] ?? '');
$contact->setPays($contactData['country'] ?? 'FR');
$contact->setCompany($contactData['company'] ?? '');
$this->contactService->save($contact);
return $contact;
}
#[Route(path: '/admin/privatisation/view/{privatisation}', name: 'app_privatisation_view')]
public function update(Privatisation $privatisation, PrivatisationService $privatisationService)
{
return $this->renderForm('privatisation/view.html.twig', [
'privatisation' => $privatisation,
'prices' => $privatisationService->computePrices($privatisation),
]);
}
#[Route(path: '/admin/privatisation/send/{privatisation}', name: 'app_privatisation_send')]
public function send(Privatisation $privatisation, PrivatisationService $privatisationService)
{
$privatisationService->sendPrivatisationNotificationToTaaka($privatisation);
$privatisationService->sendPrivatisationNotificationToClient($privatisation);
$this->addFlash('success', 'Email envoyé');
return $this->redirectToRoute('admin_privatisation_index');
}
}