<?phpnamespace App\Controller\Blog;use App\Entity\Core\Reservations;use App\Entity\Pages\Pages;use App\Form\ReservationForm;use App\Services\Core\Translations;use Sensio\Bundle\FrameworkExtraBundle\Configuration\Cache;use Sensio\Bundle\FrameworkExtraBundle\Configuration\IsGranted;use Sensio\Bundle\FrameworkExtraBundle\Configuration\ParamConverter;use Symfony\Bundle\FrameworkBundle\Controller\AbstractController;use Symfony\Component\EventDispatcher\EventDispatcherInterface;use Symfony\Component\HttpFoundation\Request;use Symfony\Component\HttpFoundation\Response;use Symfony\Component\Routing\Annotation\Route;use Symfony\Component\Routing\Generator\UrlGeneratorInterface;use Symfony\Component\Security\Core\Encoder\UserPasswordEncoderInterface;use Symfony\Component\Security\Http\Authentication\AuthenticationUtils;use Symfony\Component\HttpFoundation\RedirectResponse;use Symfony\Component\HttpFoundation\RequestStack;use Doctrine\ORM\EntityManagerInterface;use Knp\Component\Pager\PaginatorInterface;use Symfony\Component\HttpFoundation\Cookie;use Symfony\Component\Security\Csrf\TokenGenerator\TokenGeneratorInterface;use Symfony\Component\Routing\RouterInterface;use Symfony\Component\DependencyInjection\ParameterBag\ParameterBagInterface;use Symfony\Component\HttpFoundation\Session\SessionInterface;use Symfony\Contracts\HttpClient\HttpClientInterface;use Symfony\Component\Security\Guard\GuardAuthenticatorHandler;use Symfony\Component\Form\Extension\Core\Type\ChoiceType;use Twig\Environment;use Symfony\Component\Mailer\Transport;use Symfony\Component\Mailer\Mailer;use Symfony\Component\Mime\Address;use Symfony\Component\Mime\Email;use Symfony\Bridge\Twig\Mime\TemplatedEmail;use Symfony\Component\Mime\Part\DataPart;class HomepageController extends AbstractController{ private $em; private $httpClient; private $twig; private $ts; public function __construct(EntityManagerInterface $em, HttpClientInterface $httpClient, Translations $translationService, Environment $twig) { $this->em = $em; $this->httpClient = $httpClient; $this->ts = $translationService; $this->twig = $twig; } /** * Accueil * @param Request $request * @return Response * @throws \DateMalformedStringException */ public function homepage(Request $request): Response { $locale = $request->getLocale(); $page = $this->em->getRepository(Pages::class)->findOneBy(['name' => 'homepage', 'locale' => $locale]); if($page == null) { $page = $this->em->getRepository(Pages::class)->findOneBy(['name' => 'homepage','locale' => "en"]); } $reservation = new Reservations(); $form = $this->createForm(ReservationForm::class, $reservation); $form->handleRequest($request); if ($form->isSubmitted() && $form->isValid()) { $data = $request->request->all(); $data = $data['reservation_form']; $reservation->setLocale($locale); $this->em->persist($reservation); $this->em->flush(); $response = $this->httpClient->request("POST",$_ENV["WEBHOOK_RESERVATION"], [ 'json' => [ 'reservation_id' => $reservation->getId(), 'start' => $data['start'], 'end' => $data['end'], ], 'headers' => [ 'Content-Type' => 'application/json', ] ]); $dataWebhook = json_decode($response->getContent()); $dispo = 0; if ($dataWebhook->available == true) { $dispo = 1; } if($dispo == 0) { if($locale == "fr") { return $this->redirectToRoute('locale_reservation_error'); } return $this->redirectToRoute('reservation_error'); } $numberOfGuests = (int)$data['persons']; $result = $this->calculateStayPrice($data['start'], $data['end'], $numberOfGuests); if($result['nights'] == 1) { if($locale == "fr") { return $this->redirectToRoute('locale_reservation_error'); } return $this->redirectToRoute('reservation_error'); } $price = null; if ($result["total_price"] > 0) { $price = $result["total_price"]; } $reservation->setLocale($locale); $reservation->setPricing($price); $this->em->persist($reservation); $this->em->flush(); $responseStripe = $this->httpClient->request("POST",$_ENV["WEBHOOK_STRIPE"], [ 'json' => [ 'reservation_id' => (string)$reservation->getId(), 'start' => $data['start'], 'end' => $data['end'], 'price' => $price, 'persons' => $data['persons'], 'locale' => $locale, ], 'headers' => [ 'Content-Type' => 'application/json', ] ]); $dataWebhookStripe = json_decode($responseStripe->getContent()); return new RedirectResponse($dataWebhookStripe->url); } return $this->render('vitrine/'.$locale.'/homepage.html.twig', [ 'form' => $form->createView(), 'page' => $page ]); } /** * Succès de la réservation * @param Request $request * @return Response */ public function reservationSuccess(Request $request): Response { $locale = $request->getLocale(); return $this->render('vitrine/'.$locale.'/reservation_success.html.twig', []); } /** * Erreur avant le paiement de la réservation * @param Request $request * @return Response */ public function reservationError(Request $request): Response { $locale = $request->getLocale(); return $this->render('vitrine/'.$locale.'/reservation_error.html.twig', []); } /** * Annuler la réservation * @param Request $request * @return Response */ public function reservationCancel(Request $request): Response { $locale = $request->getLocale(); return $this->render('vitrine/'.$locale.'/reservation_cancel.html.twig', []); } /** * Calculer les prix. * @param string $startDate * @param string $endDate * @param int $numberOfGuests Nombre de personnes * @return array * @throws \Exception */ private function calculateStayPrice(string $startDate, string $endDate, int $numberOfGuests): array { $start = new \DateTime($startDate); $end = new \DateTime($endDate); // Calculer le nombre de nuits $nights = $start->diff($end)->days; // Vérification minimum 2 nuits if ($nights < 2) { return [ 'nights' => 1, ]; } // Prix par nuit selon le nombre de personnes $pricePerNight = $this->getPricePerNight($numberOfGuests); // Calcul du prix total $totalPrice = $nights * $pricePerNight; // Application de la réduction de 10% si séjour >= 7 nuits $discountApplied = false; if ($nights >= 7) { $totalPrice = $totalPrice * 0.90; $discountApplied = true; } return [ 'total_price' => $totalPrice, 'nights' => $nights, 'price_per_night' => $pricePerNight, 'discount' => $discountApplied, 'number_of_guests' => $numberOfGuests ]; } /** * Obtenir le prix par nuit selon le nombre de personnes. * @param int $numberOfGuests * @return float * @throws \Exception */ private function getPricePerNight(int $numberOfGuests): float { if ($numberOfGuests <= 2) { return 350; } elseif ($numberOfGuests <= 4) { return 690; } elseif ($numberOfGuests <= 8) { return 890; } else { throw new \Exception("Le nombre maximum de personnes est de 8"); } } public function simulationPricing(Request $request): Response { $locale = $request->getLocale(); $start = $_POST['start']; $end = $_POST['end']; $persons = $_POST['persons']; $response = $this->httpClient->request("POST",$_ENV["WEBHOOK_RESERVATION"], [ 'json' => [ 'reservation_id' => 0, 'start' => $start, 'end' => $end, 'locale' => $locale, ], 'headers' => [ 'Content-Type' => 'application/json', ] ]); $dataWebhook = json_decode($response->getContent()); $dispo = 0; if ($dataWebhook->available == true) { $dispo = 1; } $result = $this->calculateStayPrice($start, $end, $persons); if($result['nights'] == 1) { return $this->render('vitrine/'.$locale.'/components/simulation.html.twig', [ 'nights' => $result['nights'], ]); } $discount = false; if ($result["discount"] == true) { $discount = true; } $price = null; if ($result["total_price"] > 0) { $price = $result["total_price"]; } return $this->render('vitrine/'.$locale.'/components/simulation.html.twig', [ 'price' => $price, 'dispo' => $dispo, 'discount' => $discount, 'nights' => $result['nights'], ]); } public function mentions(Request $request): Response { $locale = $request->getLocale(); return $this->render('vitrine/'.$locale.'/mentions.html.twig', []); } public function cgv(Request $request): Response { $locale = $request->getLocale(); return $this->render('vitrine/'.$locale.'/cgv.html.twig', []); }}