src/Controller/Blog/HomepageController.php line 303

Open in your IDE?
  1. <?php
  2. namespace App\Controller\Blog;
  3. use App\Entity\Core\Reservations;
  4. use App\Entity\Pages\Pages;
  5. use App\Form\ReservationForm;
  6. use App\Services\Core\Translations;
  7. use Sensio\Bundle\FrameworkExtraBundle\Configuration\Cache;
  8. use Sensio\Bundle\FrameworkExtraBundle\Configuration\IsGranted;
  9. use Sensio\Bundle\FrameworkExtraBundle\Configuration\ParamConverter;
  10. use Symfony\Bundle\FrameworkBundle\Controller\AbstractController;
  11. use Symfony\Component\EventDispatcher\EventDispatcherInterface;
  12. use Symfony\Component\HttpFoundation\Request;
  13. use Symfony\Component\HttpFoundation\Response;
  14. use Symfony\Component\Routing\Annotation\Route;
  15. use Symfony\Component\Routing\Generator\UrlGeneratorInterface;
  16. use Symfony\Component\Security\Core\Encoder\UserPasswordEncoderInterface;
  17. use Symfony\Component\Security\Http\Authentication\AuthenticationUtils;
  18. use Symfony\Component\HttpFoundation\RedirectResponse;
  19. use Symfony\Component\HttpFoundation\RequestStack;
  20. use Doctrine\ORM\EntityManagerInterface;
  21. use Knp\Component\Pager\PaginatorInterface;
  22. use Symfony\Component\HttpFoundation\Cookie;
  23. use Symfony\Component\Security\Csrf\TokenGenerator\TokenGeneratorInterface;
  24. use Symfony\Component\Routing\RouterInterface;
  25. use Symfony\Component\DependencyInjection\ParameterBag\ParameterBagInterface;
  26. use Symfony\Component\HttpFoundation\Session\SessionInterface;
  27. use Symfony\Contracts\HttpClient\HttpClientInterface;
  28. use Symfony\Component\Security\Guard\GuardAuthenticatorHandler;
  29. use Symfony\Component\Form\Extension\Core\Type\ChoiceType;
  30. use Twig\Environment;
  31. use Symfony\Component\Mailer\Transport;
  32. use Symfony\Component\Mailer\Mailer;
  33. use Symfony\Component\Mime\Address;
  34. use Symfony\Component\Mime\Email;
  35. use Symfony\Bridge\Twig\Mime\TemplatedEmail;
  36. use Symfony\Component\Mime\Part\DataPart;
  37. class HomepageController extends AbstractController
  38. {
  39. private $em;
  40. private $httpClient;
  41. private $twig;
  42. private $ts;
  43. public function __construct(EntityManagerInterface $em, HttpClientInterface $httpClient, Translations $translationService, Environment $twig) {
  44. $this->em = $em;
  45. $this->httpClient = $httpClient;
  46. $this->ts = $translationService;
  47. $this->twig = $twig;
  48. }
  49. /**
  50. * Accueil
  51. * @param Request $request
  52. * @return Response
  53. * @throws \DateMalformedStringException
  54. */
  55. public function homepage(Request $request): Response
  56. {
  57. $locale = $request->getLocale();
  58. $page = $this->em->getRepository(Pages::class)->findOneBy(['name' => 'homepage', 'locale' => $locale]);
  59. if($page == null) {
  60. $page = $this->em->getRepository(Pages::class)->findOneBy(['name' => 'homepage','locale' => "en"]);
  61. }
  62. $reservation = new Reservations();
  63. $form = $this->createForm(ReservationForm::class, $reservation);
  64. $form->handleRequest($request);
  65. if ($form->isSubmitted() && $form->isValid()) {
  66. $data = $request->request->all();
  67. $data = $data['reservation_form'];
  68. $reservation->setLocale($locale);
  69. $this->em->persist($reservation);
  70. $this->em->flush();
  71. $response = $this->httpClient->request("POST",$_ENV["WEBHOOK_RESERVATION"], [
  72. 'json' => [
  73. 'reservation_id' => $reservation->getId(),
  74. 'start' => $data['start'],
  75. 'end' => $data['end'],
  76. ],
  77. 'headers' => [
  78. 'Content-Type' => 'application/json',
  79. ]
  80. ]);
  81. $dataWebhook = json_decode($response->getContent());
  82. $dispo = 0;
  83. if ($dataWebhook->available == true) {
  84. $dispo = 1;
  85. }
  86. if($dispo == 0) {
  87. if($locale == "fr") {
  88. return $this->redirectToRoute('locale_reservation_error');
  89. }
  90. return $this->redirectToRoute('reservation_error');
  91. }
  92. $numberOfGuests = (int)$data['persons'];
  93. $result = $this->calculateStayPrice($data['start'], $data['end'], $numberOfGuests);
  94. if($result['nights'] == 1) {
  95. if($locale == "fr") {
  96. return $this->redirectToRoute('locale_reservation_error');
  97. }
  98. return $this->redirectToRoute('reservation_error');
  99. }
  100. $price = null;
  101. if ($result["total_price"] > 0) {
  102. $price = $result["total_price"];
  103. }
  104. $reservation->setLocale($locale);
  105. $reservation->setPricing($price);
  106. $this->em->persist($reservation);
  107. $this->em->flush();
  108. $responseStripe = $this->httpClient->request("POST",$_ENV["WEBHOOK_STRIPE"], [
  109. 'json' => [
  110. 'reservation_id' => (string)$reservation->getId(),
  111. 'start' => $data['start'],
  112. 'end' => $data['end'],
  113. 'price' => $price,
  114. 'persons' => $data['persons'],
  115. 'locale' => $locale,
  116. ],
  117. 'headers' => [
  118. 'Content-Type' => 'application/json',
  119. ]
  120. ]);
  121. $dataWebhookStripe = json_decode($responseStripe->getContent());
  122. return new RedirectResponse($dataWebhookStripe->url);
  123. }
  124. return $this->render('vitrine/'.$locale.'/homepage.html.twig', [
  125. 'form' => $form->createView(),
  126. 'page' => $page
  127. ]);
  128. }
  129. /**
  130. * Succès de la réservation
  131. * @param Request $request
  132. * @return Response
  133. */
  134. public function reservationSuccess(Request $request): Response
  135. {
  136. $locale = $request->getLocale();
  137. return $this->render('vitrine/'.$locale.'/reservation_success.html.twig', []);
  138. }
  139. /**
  140. * Erreur avant le paiement de la réservation
  141. * @param Request $request
  142. * @return Response
  143. */
  144. public function reservationError(Request $request): Response
  145. {
  146. $locale = $request->getLocale();
  147. return $this->render('vitrine/'.$locale.'/reservation_error.html.twig', []);
  148. }
  149. /**
  150. * Annuler la réservation
  151. * @param Request $request
  152. * @return Response
  153. */
  154. public function reservationCancel(Request $request): Response
  155. {
  156. $locale = $request->getLocale();
  157. return $this->render('vitrine/'.$locale.'/reservation_cancel.html.twig', []);
  158. }
  159. /**
  160. * Calculer les prix.
  161. * @param string $startDate
  162. * @param string $endDate
  163. * @param int $numberOfGuests Nombre de personnes
  164. * @return array
  165. * @throws \Exception
  166. */
  167. private function calculateStayPrice(string $startDate, string $endDate, int $numberOfGuests): array
  168. {
  169. $start = new \DateTime($startDate);
  170. $end = new \DateTime($endDate);
  171. // Calculer le nombre de nuits
  172. $nights = $start->diff($end)->days;
  173. // Vérification minimum 2 nuits
  174. if ($nights < 2) {
  175. return [
  176. 'nights' => 1,
  177. ];
  178. }
  179. // Prix par nuit selon le nombre de personnes
  180. $pricePerNight = $this->getPricePerNight($numberOfGuests);
  181. // Calcul du prix total
  182. $totalPrice = $nights * $pricePerNight;
  183. // Application de la réduction de 10% si séjour >= 7 nuits
  184. $discountApplied = false;
  185. if ($nights >= 7) {
  186. $totalPrice = $totalPrice * 0.90;
  187. $discountApplied = true;
  188. }
  189. return [
  190. 'total_price' => $totalPrice,
  191. 'nights' => $nights,
  192. 'price_per_night' => $pricePerNight,
  193. 'discount' => $discountApplied,
  194. 'number_of_guests' => $numberOfGuests
  195. ];
  196. }
  197. /**
  198. * Obtenir le prix par nuit selon le nombre de personnes.
  199. * @param int $numberOfGuests
  200. * @return float
  201. * @throws \Exception
  202. */
  203. private function getPricePerNight(int $numberOfGuests): float
  204. {
  205. if ($numberOfGuests <= 2) {
  206. return 350;
  207. } elseif ($numberOfGuests <= 4) {
  208. return 690;
  209. } elseif ($numberOfGuests <= 8) {
  210. return 890;
  211. } else {
  212. throw new \Exception("Le nombre maximum de personnes est de 8");
  213. }
  214. }
  215. public function simulationPricing(Request $request): Response
  216. {
  217. $locale = $request->getLocale();
  218. $start = $_POST['start'];
  219. $end = $_POST['end'];
  220. $persons = $_POST['persons'];
  221. $response = $this->httpClient->request("POST",$_ENV["WEBHOOK_RESERVATION"], [
  222. 'json' => [
  223. 'reservation_id' => 0,
  224. 'start' => $start,
  225. 'end' => $end,
  226. 'locale' => $locale,
  227. ],
  228. 'headers' => [
  229. 'Content-Type' => 'application/json',
  230. ]
  231. ]);
  232. $dataWebhook = json_decode($response->getContent());
  233. $dispo = 0;
  234. if ($dataWebhook->available == true) {
  235. $dispo = 1;
  236. }
  237. $result = $this->calculateStayPrice($start, $end, $persons);
  238. if($result['nights'] == 1) {
  239. return $this->render('vitrine/'.$locale.'/components/simulation.html.twig', [
  240. 'nights' => $result['nights'],
  241. ]);
  242. }
  243. $discount = false;
  244. if ($result["discount"] == true) {
  245. $discount = true;
  246. }
  247. $price = null;
  248. if ($result["total_price"] > 0) {
  249. $price = $result["total_price"];
  250. }
  251. return $this->render('vitrine/'.$locale.'/components/simulation.html.twig', [
  252. 'price' => $price,
  253. 'dispo' => $dispo,
  254. 'discount' => $discount,
  255. 'nights' => $result['nights'],
  256. ]);
  257. }
  258. public function mentions(Request $request): Response
  259. {
  260. $locale = $request->getLocale();
  261. return $this->render('vitrine/'.$locale.'/mentions.html.twig', []);
  262. }
  263. public function cgv(Request $request): Response
  264. {
  265. $locale = $request->getLocale();
  266. return $this->render('vitrine/'.$locale.'/cgv.html.twig', []);
  267. }
  268. }