src/Controller/BookingController.php line 1030

Open in your IDE?
  1. <?php
  2. namespace App\Controller;
  3. use DateTime;
  4. use App\Entity\Booking;
  5. use App\Service\Mailjet;
  6. use App\Service\SwiklyService;
  7. use App\Form\BookingType;
  8. use App\Service\StaticData;
  9. use App\Service\CheckRecaptcha;
  10. use App\Entity\ProcessLogs;
  11. use App\Form\CheckAvailabilityType;
  12. use App\Repository\BookingRepository;
  13. use Symfony\Component\Form\FormError;
  14. use App\Repository\PageHeaderRepository;
  15. use Doctrine\ORM\EntityManagerInterface;
  16. use Symfony\Component\HttpFoundation\Request;
  17. use Symfony\Component\HttpFoundation\Response;
  18. use App\Repository\BookingConstraintRepository;
  19. use Symfony\Component\Routing\Annotation\Route;
  20. use Symfony\Component\Routing\Generator\UrlGeneratorInterface;
  21. use App\Repository\BookingConstraintSaisonRepository;
  22. use App\Repository\BookingContractRepository;
  23. use App\Repository\BookingMailRepository;
  24. use DateTimeImmutable;
  25. use Symfony\Bundle\FrameworkBundle\Controller\AbstractController;
  26. use Symfony\Component\HttpFoundation\JsonResponse;
  27. use Symfony\Component\HttpFoundation\Session\Session;
  28. use Spipu\Html2Pdf\Html2Pdf;
  29. use Symfony\Contracts\Translation\TranslatorInterface;
  30. /**
  31.  * Gestion des réservation et des disponibilités
  32.  */
  33. class BookingController extends AbstractController
  34. {
  35.     private $manager;
  36.     private $statics;
  37.     private $pageRepo;
  38.     private $constraint;
  39.     private $translator;
  40.     public function __construct(EntityManagerInterface $managerTranslatorInterface $translatorStaticData $staticsPageHeaderRepository $pageRepoBookingConstraintRepository $bookingConstraintRepo)
  41.     {
  42.         $this->manager $manager;
  43.         $this->statics $statics->getStaticData();
  44.         $this->pageRepo $pageRepo;
  45.         $this->constraint $bookingConstraintRepo->findOneBy([]);
  46.         $this->translator $translator;
  47.     }
  48.     /**
  49.      * Permet de prendre en charge une réservation
  50.      * 
  51.      * @Route("/{_locale}/booking", name="booking_index")
  52.      *
  53.      * @param Request $request
  54.      * @param CheckRecaptcha $recaptcha
  55.      * @param PageHeaderRepository $pageRepo
  56.      * @param BookingConstraintRepository $bookingConstraintRepo
  57.      * @return Response
  58.      */
  59.     public function index(Request $requestCheckRecaptcha $recaptchaBookingConstraintRepository $bookingConstraintRepoBookingContractRepository $bookingContractRepoSession $sessionBookingRepository $bookingRepoBookingMailRepository $bookingMailRepoSwiklyService $swiklyService): Response
  60.     {
  61.         #   Variables de travail
  62.         $page $this->pageRepo->findOneBy(['page' => 'booking']);
  63.         $locale $request->getLocale();
  64.         $constraint $this->constraint;
  65.         $contract $bookingContractRepo->findOneBy([]);
  66.         $endDate $this->getEndDate();
  67.         if (is_string($endDate)) {
  68.             $endDate DateTime::createFromFormat('d/m/Y'$endDate);
  69.         }
  70.         #   Variables du formulaire
  71.         $bookingEntity = new Booking();
  72.         #   Inserssion de données en provenance d'une autre page
  73.         if (array_key_exists('startDate'$_GET)) {
  74.             $startDate DateTime::createFromFormat('d/m/Y'$_GET['startDate']);
  75.             $endDate DateTime::createFromFormat('d/m/Y'$_GET['endDate']);
  76.             $bookingEntity
  77.                 ->setStartDate($startDate)
  78.                 ->setEndDate($endDate)
  79.                 ->setNumber($_GET['number']);
  80.         }
  81.         $bookingForm $this->createForm(BookingType::class, $bookingEntity);
  82.         $bookingForm->handleRequest($request);
  83.         # Soumission du formulaire
  84.         if ($bookingForm->isSubmitted() && $bookingForm->isValid()) {
  85.             define('SITE_KEY''6LecwkQsAAAAAJ2fiCGD_CZeXV-v5UlIpBG57OmE');
  86.             define('SECRETE_KEY''6LecwkQsAAAAAEPV_YSvd_jWoaaKZG4ja_l4PS6c');
  87.             #   Google Recaptcha
  88.             if ($recaptcha->check($_POST['booking-recaptcha_response'], SECRETE_KEY)) {
  89.                 #   Récupération des données
  90.                 $data $bookingForm->getData();
  91.                 #   Formatage des données
  92.                 #   Formatage des dates selectionnées par le client
  93.                 $formatedStartDate str_replace('/''-'date_format($data->getStartDate(), 'd/m/Y'));
  94.                 $formatedEndDate str_replace('/''-'date_format($data->getEndDate(), 'd/m/Y'));
  95.                 // $formatedStartDate = str_replace('/', '-', $data->getStartDate());
  96.                 $startDate = new DateTime($formatedStartDate);
  97.                 $startDate1 = new DateTime($formatedStartDate);
  98.                 $startDate2 = new DateTime($formatedStartDate);
  99.                 // $formatedEndDate = str_replace('/', '-', $data->getEndDate());
  100.                 $endDate = new DateTime($formatedEndDate);
  101.                 $now = new DateTime();
  102.                 $uid "R" date('U');
  103.                 #   On test si on se trouve dans le cas d'une reservation iminente : si aujourd'hui est supérieur la start date moins le delai donnée pour regler le reliquat
  104.                 if (date('U'strtotime($now->format('Y-m-d'))) >= date('U'strtotime('-' . ($constraint->getBalancePaymentDeadline() + 10) . ' day'date('U'strtotime($startDate->format('Y-m-d')))))) {
  105.                     #   On défini qu'il s'agit d'une reservation iminente et on change l'etat des acompte pour ne pas envoi d'alerte d'acompte dans ce cas de figure
  106.                     $isSoonBooking true;
  107.                     $isAdvancePayed true;
  108.                     $advanceAlerte1 true;
  109.                     $advanceAlerte2 true;
  110.                     #   On défini la deadlines de paiement : now + délai de paiement pour réservation iminente (ex : now + 3)
  111.                     $paymentDelay $constraint->getSoonBookingPaymentDelay();
  112.                     $paymentDeadline $now->modify('+' $paymentDelay ' day');
  113.                     $advancePaymentDeadline $paymentDeadline;
  114.                     $balancePaymentDeadline $paymentDeadline;
  115.                     $cautionPaymentDeadline $paymentDeadline;
  116.                     #   On récupère le mail 
  117.                     $recapMail $bookingMailRepo->findOneBy(['title' => 'Récapitulatif : Réservation imminente']);
  118.                 } else {
  119.                     $isSoonBooking false;
  120.                     $isAdvancePayed false;
  121.                     $advanceAlerte1 false;
  122.                     $advanceAlerte2 false;
  123.                     #   On défini les deadlines
  124.                     $advancePaymentDeadline $now->modify('+' $constraint->getAdvancePaymentDeadline() . ' day');
  125.                     $balancePaymentDeadline $startDate1->modify('-' $constraint->getBalancePaymentDeadline() . ' day');
  126.                     $cautionPaymentDeadline $now->modify('+' $constraint->getCautionPaymentDelay() . ' day');
  127.                     #   On récupère le mail 
  128.                     $recapMail $bookingMailRepo->findOneBy(['title' => 'Récapitulatif : Réservation classique']);
  129.                 }
  130.                 $bookingEntity
  131.                     ->setUniqId($uid)
  132.                     ->setStartDate(new DateTime($formatedStartDate))
  133.                     ->setEndDate(new DateTime($formatedEndDate))
  134.                     ->setDeposit($constraint->getDeposit())
  135.                     ->setAdvancePaymentDeadline($advancePaymentDeadline)
  136.                     ->setPaymentMethod($data->getPaymentMethod())
  137.                     ->setBalancePaymentDeadline($balancePaymentDeadline)
  138.                     ->setCautionPaymentDeadline($cautionPaymentDeadline)
  139.                     ->setBookingConstraint($constraint)
  140.                     ->setIsForSoon($isSoonBooking)
  141.                     ->setIsAdvancePayed($isAdvancePayed)
  142.                     ->setIsAdvancePaymentAlert1($advanceAlerte1)
  143.                     ->setIsAdvancePaymentAlert2($advanceAlerte2)
  144.                     ->setTracking(true)
  145.                     ->setlocale($locale)
  146.                     ->setContract('contrat-' $uid '.pdf');
  147.                 #   On ajoute une réduction si il s'agit d'un long séjour
  148.                 if ($constraint->getLongStayDiscount() > && $bookingEntity->getDuration() >= 7) {
  149.                     $bookingEntity->setDiscount($constraint->getLongStayDiscount());
  150.                 }
  151.                 ### Vérification de la validité de informations soumises avec le formulaire
  152.                 #   On test si la date de départ est supérieure à la date d'arrivé
  153.                 if (strtotime($formatedStartDate) > strtotime($formatedEndDate)) {
  154.                     #   On créer l'erreur
  155.                     $bookingForm->get('startDate')->addError(new FormError($this->translator->trans("Vous ne pouvez pas partir avant d'être arrivé")));
  156.                     $bookingForm->get('endDate')->addError(new FormError($this->translator->trans("Vous ne pouvez pas partir avant d'être arrivé")));
  157.                     #   Flash
  158.                     $this->addFlash(
  159.                         'warning',
  160.                         $this->translator->trans("Vous ne pouvez pas partir avant d'être arrivé")
  161.                     );
  162.                     #   Check si les dates choisies sont disponibles
  163.                 } elseif (!$bookingEntity->isBookableDates()) {
  164.                     #   On créer l'erreur
  165.                     $bookingForm->get('startDate')->addError(new FormError($this->translator->trans('Les dates choisies ne sont pas disponibles')));
  166.                     $bookingForm->get('endDate')->addError(new FormError($this->translator->trans('Les dates choisies ne sont pas disponibles')));
  167.                     #   Flash
  168.                     $this->addFlash(
  169.                         'warning',
  170.                         $this->translator->trans("Les dates que vous avez choisi ne sont pas disponibles.")
  171.                     );
  172.                 } elseif (strtotime($formatedStartDate) >= strtotime($endDate->format('Y-m-d'))) {
  173.                     #   On créer l'erreur
  174.                     $bookingForm->get('startDate')->addError(new FormError($this->translator->trans('Les dates choisies ne sont pas disponibles')));
  175.                     $bookingForm->get('endDate')->addError(new FormError($this->translator->trans('Les dates choisies ne sont pas disponibles')));
  176.                     #   Flash
  177.                     $this->addFlash(
  178.                         'warning',
  179.                         $this->translator->trans("Les dates que vous avez choisi ne sont pas disponibles.")
  180.                     );
  181.                 } else {
  182.                     #   Préparation des données à envoyer au différent template
  183.                     $statics $this->statics['data'];
  184.                     #   Enregistrement de la réservation en BDD
  185.                     $this->manager->persist($bookingEntity);
  186.                     #   SWIKLY GENERATION (Moved here to ensure entity is fully hydrated)
  187.                     #   Generate link for ALL bookings so they can pay deposit immediately if they wish.
  188.                     if (!$bookingEntity->getSwiklyUrl()) {
  189.                         error_log("Attempting to create Swikly deposit for booking UID: " $bookingEntity->getUniqId());
  190.                         $successUrl $this->generateUrl('swikly_accept', ['uid' => $bookingEntity->getUniqId()], UrlGeneratorInterface::ABSOLUTE_URL);
  191.                         $errorUrl $this->generateUrl('swikly_decline', ['uid' => $bookingEntity->getUniqId()], UrlGeneratorInterface::ABSOLUTE_URL);
  192.                         $res $swiklyService->createDeposit($bookingEntity$successUrl$errorUrl);
  193.                         error_log("Swikly Response: " print_r($restrue));
  194.                         if ($res && isset($res['request']['link'])) {
  195.                             $bookingEntity->setSwiklyUrl($res['request']['link'] . "?cs=se");
  196.                             $bookingEntity->setSwiklyRequestId($res['request']['id'] ?? null);
  197.                             // No flush needed here as flush comes right after
  198.                         } elseif (isset($res['error'])) {
  199.                             $msg 'Erreur création caution Swikly : ' $res['error'];
  200.                             $this->addFlash('danger'$msg);
  201.                         } else {
  202.                             // Fallback, log the unknown response but don't crash, maybe show a generic error
  203.                             error_log("Swikly Unexpected Response: " json_encode($res));
  204.                             $this->addFlash('warning''La demande de caution n\'a pas pu être initialisée automatiquement.');
  205.                         }
  206.                     }
  207.                     $this->manager->flush();
  208.                     # Gestion du contrat de location
  209.                     $templateContract_bailleur $this->replaceVar($contract->translate($locale)->getContent(), $bookingEntity$constraint"bailleur");
  210.                     $templateContract_locataire $this->replaceVar($contract->translate($locale)->getContent(), $bookingEntity$constraint"locataire");
  211.                     $contractMaker_bailleur $this->makePdf($uid$templateContract_bailleur$request'bailleur');
  212.                     $contractMaker_locataire $this->makePdf($uid$templateContract_locataire$request'locataire');
  213.                     $contract_bailleur base64_encode(file_get_contents('/home/maxappu/www/gite-colombine.fr/v3/public/file/contrats/contrat-' $uid '-bailleur.pdf'));
  214.                     $contract_locataire base64_encode(file_get_contents('/home/maxappu/www/gite-colombine.fr/v3/public/file/contrats/contrat-' $uid '-locataire.pdf'));
  215.                     ##   Envoi d'email MailJet 
  216.                     #   Client
  217.                     $mailjet = new Mailjet();
  218.                     $mail_content $this->replaceVar($recapMail->translate($locale)->getContent(), $bookingEntity$constraint);
  219.                     $mailjet->send("caurettemarc@gmail.com""gite-colombine.fr"$data->getEmail(), $data->getFirstName() . " " $data->getLastName(), $recapMail->translate($locale)->getSubject(), $mail_content$contract_locataire$bookingEntity7650701);
  220.                     #   Propriétaire
  221.                     $mailjet = new Mailjet();
  222.                     $mail_content $this->renderView('components/mail/_booking.html.twig'compact('data''statics''bookingEntity''constraint'));
  223.                     $mailjet->send("caurettemarc@gmail.com""gite-colombine.fr""maximeavril.dev@gmail.com"$data->getFirstName() . " " $data->getLastName(), "Réservation"$mail_content$contract_bailleur$bookingEntity7650701);
  224.                     #   Flash
  225.                     $this->addFlash(
  226.                         'success',
  227.                         $this->translator->trans("Réservation enregistrée")
  228.                     );
  229.                     #   Redirection vers une page de validation reprennant les details de la réservation
  230.                     return $this->redirectToRoute('booking_validation', [
  231.                         'uid' => $bookingEntity->getUniqId()
  232.                     ]);
  233.                 }
  234.             } else {
  235.                 #   Flash
  236.                 $this->addFlash(
  237.                     'warning',
  238.                     $this->translator->trans("Erreur liée au Recaptcha...")
  239.                 );
  240.                 #   Redirection sur la page de validation de réservation
  241.                 return $this->render('booking/index.html.twig', [
  242.                     'statics' => $this->statics['data'],
  243.                     'page' => $page,
  244.                     'constraint' => $constraint,
  245.                     'endDate' => $endDate,
  246.                     'bookingForm' => $bookingForm->createView()
  247.                 ]);
  248.             }
  249.         }
  250.         #   Redirection sur la page de validation de réservation
  251.         return $this->render('booking/index.html.twig', [
  252.             'statics' => $this->statics['data'],
  253.             'page' => $page,
  254.             'constraint' => $constraint,
  255.             'endDate' => $endDate,
  256.             'bookingForm' => $bookingForm->createView()
  257.         ]);
  258.     }
  259.     /**
  260.      * Permet de check la disponibilité 
  261.      * 
  262.      * @Route("/{_locale}/check-availability", name="booking_check_avail")
  263.      *
  264.      * @param BookingConstraintRepository $bookingConstraintRepo
  265.      * @return void
  266.      */
  267.     public function checkAvailability(BookingConstraintRepository $bookingConstraintRepoRequest $request)
  268.     {
  269.         #   Variables de travail
  270.         $constraint $bookingConstraintRepo->findOneBy([]);
  271.         #   Variables du formulaire
  272.         $bookingEntity = new Booking();
  273.         $bookingForm $this->createForm(CheckAvailabilityType::class, $bookingEntity);
  274.         $bookingForm->handleRequest($request);
  275.         #   Soumission du formulaire
  276.         if ($bookingForm->isSubmitted()) {
  277.             #   Récupération des données
  278.             $data $bookingForm->getData();
  279.             #   Formatage des dates selectionnées par le client
  280.             $formatedStartDate str_replace('/''-'date_format($data->getStartDate(), 'd/m/Y'));
  281.             $formatedEndDate str_replace('/''-'date_format($data->getEndDate(), 'd/m/Y'));
  282.             #   Insertion des donnée formatées dans l'entity
  283.             $bookingEntity
  284.                 ->setStartDate(new DateTime($formatedStartDate))
  285.                 ->setEndDate(new DateTime($formatedEndDate))
  286.                 ->setDeposit($constraint->getDeposit() / 100)
  287.                 ->setBookingConstraint($constraint);
  288.             #   On test si la date de départ est supérieure à la date d'arrivé
  289.             if ($data->getStartDate() > $data->getEndDate()) {
  290.                 #   Ajax Flash
  291.                 $flashbag = [
  292.                     'label' => "warning",
  293.                     'title' => "Oups...",
  294.                     'message' => $this->translator->trans("Vous ne pouvez pas partir avant d'être arrivé") . ' <i class="fas fa-smile-wink"></i> <br> <strong>' $data->getStartDate()->format("d/m/Y") . '</strong> < <strong>' $data->getEndDate()->format("d/m/Y") . '</strong>',
  295.                     'btnText' => $this->translator->trans("Je recommence"),
  296.                     'btnPath' => "#"
  297.                 ];
  298.                 return $this->render('components/flash/ajax_check_avail.html.twig', [
  299.                     'flashbag' => $flashbag,
  300.                 ]);
  301.             }
  302.             #   On test si le client essaye de reservé pour une date anterieur ou trop proche d'aujourd'hui
  303.             $minDate = (new \DateTime())->modify('+1 day')->setTime(000);
  304.             if ($data->getStartDate() < $minDate || $data->getEndDate() < $minDate) {
  305.                 #   Ajax Flash
  306.                 $flashbag = [
  307.                     'label' => "warning",
  308.                     'title' => $this->translator->trans("Bien essayé..."),
  309.                     'message' => $data->getStartDate()->format('d/m/Y') . " " $data->getEndDate()->format('d/m/Y'),
  310.                     'btnText' => $this->translator->trans("Je recommence"),
  311.                     'btnPath' => "#"
  312.                 ];
  313.                 return $this->render('components/flash/ajax_check_avail.html.twig', [
  314.                     'flashbag' => $flashbag,
  315.                 ]);
  316.             }
  317.             #   Check si les dates choisies sont disponibles
  318.             if (!$bookingEntity->isBookableDates()) {
  319.                 #   Ajax Flash
  320.                 $flashbag = [
  321.                     'label' => "warning",
  322.                     'title' => $this->translator->trans("Désolé..."),
  323.                     'message' => $this->translator->trans("La période du") . " <strong>" $data->getStartDate()->format('d/m/Y') . "</strong> " $this->translator->trans("au") . " <strong>" $data->getEndDate()->format('d/m/Y') . "</strong> " $this->translator->trans("pour") . " <strong>" $data->getNumber() . "</strong> " $this->translator->trans("personnes n'est pas disponible à la réservation") . ".",
  324.                     'btnText' => $this->translator->trans("Je recommence"),
  325.                     'btnPath' => "#"
  326.                 ];
  327.                 return $this->render('components/flash/ajax_check_avail.html.twig', [
  328.                     'flashbag' => $flashbag,
  329.                 ]);
  330.             }
  331.             #   Check si le nombre de personnes ne dépasse pas la limite 
  332.             if ($data->getNumber() > $constraint->getMaxNumber()) {
  333.                 #   Ajax flash 
  334.                 $flashbag = [
  335.                     'label' => "warning",
  336.                     'title' => "Oups...",
  337.                     'message' => $this->translator->trans("Vous avez dépassé le nombre maximum de personnes") . " <br> " $this->translator->trans("Le nombre maximum est de") . " " $constraint->getMaxNumber() . " " $this->translator->trans("personnes") . "",
  338.                     'btnText' => $this->translator->trans("Je recommence"),
  339.                     'btnPath' => "#"
  340.                 ];
  341.                 return $this->render('components/flash/ajax_check_avail.html.twig', [
  342.                     'flashbag' => $flashbag,
  343.                 ]);
  344.             }
  345.             #   Sinon, validation du checking
  346.             #   Ajax flash 
  347.             $flashbag = [
  348.                 'label' => "success",
  349.                 'title' => $this->translator->trans("C'est bon"),
  350.                 'message' => $this->translator->trans("La période du") . " <strong>" $data->getStartDate()->format('d/m/Y') . "</strong> " $this->translator->trans("au") . " <strong>" $data->getEndDate()->format('d/m/Y') . "</strong> " $this->translator->trans("pour") . " <strong>" $data->getNumber() . "</strong> " $this->translator->trans("personnes est disponible à la réservation") . ".",
  351.                 'btnText' => $this->translator->trans("Je réserve"),
  352.                 'btnPath' => $this->generateUrl('booking_index', [
  353.                     'startDate' => $data->getStartDate()->format('d/m/Y'),
  354.                     'endDate' => $data->getEndDate()->format('d/m/Y'),
  355.                     'number' => $data->getNumber()
  356.                 ])
  357.             ];
  358.             return $this->render('components/flash/ajax_check_avail.html.twig', [
  359.                 'flashbag' => $flashbag,
  360.             ]);
  361.         } else {
  362.             return $this->json(false);
  363.         }
  364.     }
  365.     /**
  366.      * Affiche la page de validation d'une réservation
  367.      *
  368.      * @Route("/{_locale}/booking/{uid}", name="booking_validation")
  369.      * 
  370.      * @param Booking $booking
  371.      */
  372.     public function validation($uidRequest $requestBookingRepository $bookingRepoBookingConstraintRepository $bookingConstraintRepoBookingMailRepository $bookingMailRepo)
  373.     {
  374.         $page $this->pageRepo->findOneBy(['page' => 'validation']);
  375.         $booking $bookingRepo->findOneBy(["uniqId" => $uid]);
  376.         $constraint $bookingConstraintRepo->findOneBy([]);
  377.         $locale $request->getLocale();
  378.         if ($booking->getIsForSoon() == true) {
  379.             #   On récupère le contenu de la page de validation 
  380.             $validationContent $bookingMailRepo->findOneBy(['title' => 'Validation : Réservation imminente']);
  381.         } else {
  382.             #   On récupère le contenu de la page de validation 
  383.             $validationContent $bookingMailRepo->findOneBy(['title' => 'Validation : Réservation classique']);
  384.         }
  385.         return $this->render('booking/validation.html.twig', [
  386.             'statics' => $this->statics['data'],
  387.             'page' => $page,
  388.             'booking' => $booking,
  389.             'constraint' => $constraint,
  390.             'content' => $this->replaceVar($validationContent->translate($locale)->getContent(), $booking$constraint)
  391.         ]);
  392.     }
  393.     /**
  394.      * Permet de connaitre la saison de la réservation
  395.      *
  396.      * @Route("/booking/get-saison", name="booking_get_saison")
  397.      * 
  398.      * @return JsonResponce
  399.      */
  400.     public function checkSaison(BookingConstraintSaisonRepository $bookingConstraintSaisonRepo)
  401.     {
  402.         if (array_key_exists('start'$_GET)) {
  403.             $formatedStartDate date('Y-m-d'strtotime($_GET['start']));
  404.             $formatedEndDate date('Y-m-d'strtotime($_GET['end']));
  405.             $start date('U'strtotime($formatedStartDate));
  406.             $end date('U'strtotime($formatedEndDate ' -1 day'));
  407.             $bookingDays = [
  408.                 'start' => $start,
  409.                 'end' => $end
  410.             ];
  411.             $saisonConstraints $bookingConstraintSaisonRepo->findAll();
  412.             $saisons $this->getSaison($bookingDays);
  413.             $temp = [];
  414.             $temp['count'] = 0;
  415.             $temp['price'] = 0;
  416.             foreach ($saisonConstraints as $saisonConstraint) {
  417.                 foreach ($saisons as $key => $saison) {
  418.                     #   On récupère les saisons dans les quel on se trouve 
  419.                     if ($saisonConstraint->translate('fr')->getTitle() == $saison['saison']) {
  420.                         #   On incrémente le prix et le nombre de jour à chaque boucle
  421.                         $temp['count'] += 1;
  422.                         $temp['price'] += $saisonConstraint->getPrice();
  423.                     }
  424.                 }
  425.             }
  426.             $mediumPrice ceil($temp['price'] / $temp['count']);
  427.             return $this->json([
  428.                 'price' => $mediumPrice
  429.             ]);
  430.         }
  431.     }
  432.     public function getSaison($bookingDays)
  433.     {
  434.         $saisons $this->constraint->getSaisons();
  435.         $periods_days = [];
  436.         foreach ($saisons as $key => $saison) {
  437.             foreach ($saison->getPeriods() as $key => $period) {
  438.                 $resultat range(
  439.                     $period->getStartDate()->getTimestamp(),
  440.                     $period->getEndDate()->getTimestamp(),
  441.                     24 60 60
  442.                 );
  443.                 $days array_map(function ($dayTimestamp) {
  444.                     return new \DateTime(date('Y-m-d'$dayTimestamp));
  445.                 }, $resultat);
  446.                 $periods_days[$saison->translate('fr')->getTitle()][$key] = $days;
  447.             }
  448.         }
  449.         $resultat range(
  450.             $bookingDays['start'],
  451.             $bookingDays['end'],
  452.             24 60 60
  453.         );
  454.         $bookingDays array_map(function ($dayTimestamp) {
  455.             return new \DateTime(date('Y-m-d'$dayTimestamp));
  456.         }, $resultat);
  457.         $formatDays = function ($day) {
  458.             return $day->format('Y-m-d');
  459.         };
  460.         //Tableau des strings de mes journées à reserver
  461.         $daysToReserve array_map($formatDays$bookingDays);
  462.         //Tableau des jours diférentes saisons
  463.         foreach ($periods_days as $saison_key => $array) {
  464.             foreach ($array as $key => $item) {
  465.                 $saisonsDays[$saison_key][$key] = array_map($formatDays$item);
  466.             }
  467.         }
  468.         //Pour chaques journées à reserver je regarde si elle se trouve dans les journées d'une saison
  469.         $temp = [];
  470.         foreach ($daysToReserve as $day) {
  471.             foreach ($saisonsDays as $saison_key => $saison) {
  472.                 foreach ($saison as $key => $item) {
  473.                     if (array_search($day$item) !== false) {
  474.                         $temp[] = [
  475.                             'day' => $day,
  476.                             'saison' => $saison_key,
  477.                         ];
  478.                     }
  479.                 }
  480.             }
  481.         }
  482.         return $temp;
  483.     }
  484.     /**
  485.      * CRONJOB
  486.      * Permet de vérifier l'état des paiements pour chaque réservation
  487.      * 
  488.      * @Route("/booking/check-payment", name="booking_check_payment") 
  489.      */
  490.     public function checkPayments(BookingRepository $bookingRepoBookingMailRepository $bookingMailRepoSwiklyService $swiklyService)
  491.     {
  492.         $now date('Y-m-d');
  493.         $bookings $bookingRepo->findFutures($now);
  494.         $statics $this->statics['data'];
  495.         $logs = [];
  496.         $logs['advance']['title'] = 'CRON du paiement de l\'acompte';
  497.         $logs['balance']['title'] = 'CRON du paiement du reliquat';
  498.         $logs['caution']['title'] = 'CRON du paiement du dépôt';
  499.         foreach ($bookings as $key => $booking) {
  500.             $advancePaymentDeadline $booking->getAdvancePaymentDeadline();
  501.             $balancePaymentDeadline $booking->getBalancePaymentDeadline();
  502.             $cautionPaymentDeadline $booking->getCautionPaymentDeadline();
  503.             $isForSoon $booking->getIsForSoon();
  504.             $bookingCreatedAt $booking->getCreatedAt();
  505.             $constraint $booking->getBookingConstraint();
  506.             ###   On check si le tracking est activé sur la réservation
  507.             if ($booking->getTracking() == true && date('U'strtotime($now)) < date('U'strtotime($booking->getStartDate()->format('Y-m-d')))) {
  508.                 ### Alerte 1 acompte
  509.                 #   On check si il s'agit d'une reservation imminente et si les alerte n'ont pas déja été envoyées
  510.                 if ($booking->getIsAdvancePaymentAlert1() != true && $booking->getIsAdvancePayed() != true && $isForSoon != true) {
  511.                     #   Pour chaque reservation on vérifie si la advancePaymentDeadline/3 est dépassée pour envoyer une 1ere alerte au client
  512.                     if ((date('U'strtotime($now))) > (date('U'strtotime($advancePaymentDeadline->format('Y-m-d'))) - ((ceil($constraint->getAdvancePaymentDeadline() / 3) * 86400)))) {
  513.                         #   Logs de process
  514.                         $logs['advance'][1][$key]['process'] = 'Vérification N°1 du paiement de l\'accompte';
  515.                         $logs['advance'][1][$key]['reference'] = $booking->getUniqId();
  516.                         #   Récupéreration du contenu du mail
  517.                         $templateMail_locataire $bookingMailRepo->findOneBy(['title' => 'Alerte acompte N°1']);
  518.                         ##  Envoi d'email d'alerte MailJet 
  519.                         #   Client
  520.                         $mailjet = new Mailjet();
  521.                         $mail_content_c $this->replaceVar($templateMail_locataire->translate($booking->getLocale())->getContent(), $booking$constraint);
  522.                         $mailjet->send("caurettemarc@gmail.com""gite-colombine.fr"$booking->getEmail(), $booking->getFirstName() . " " $booking->getLastName(), $this->translator->trans("Votre réservation") . " N°" $booking->getUniqId(), $mail_content_cfalsefalse7650701);
  523.                         #   Propriétaire
  524.                         $mailjet = new Mailjet();
  525.                         $mail_content_p $this->renderView('components/mail/_booking_advance_alert_1_p.html.twig'compact('booking''statics''constraint'));
  526.                         $mailjet->send("caurettemarc@gmail.com""gite-colombine.fr""maximeavril.dev@gmail.com"$booking->getFirstName() . " " $booking->getLastName(), "Alerte réservation N°" $booking->getUniqId(), $mail_content_pfalsefalse7650701);
  527.                         $logs['advance'][1][$key]['content'] = $mail_content_c;
  528.                         $booking->setIsAdvancePaymentAlert1(true);
  529.                         $this->manager->persist($booking);
  530.                         $ProcessLogs = new ProcessLogs();
  531.                         $ProcessLogs
  532.                             ->setTitle($logs['advance']['title'])
  533.                             ->setProcess($logs['advance'][1][$key]['process'])
  534.                             ->setReference($logs['advance'][1][$key]['reference'])
  535.                             ->setContent($logs['advance'][1][$key]['content'])
  536.                             ->setCreatedAt(new DateTimeImmutable());
  537.                         $this->manager->persist($ProcessLogs);
  538.                     }
  539.                 }
  540.                 ###   Alerte 2 acompte
  541.                 if ($booking->getIsAdvancePaymentAlert2() != true && $booking->getIsAdvancePaymentAlert1() == true && $booking->getIsAdvancePayed() != true && $isForSoon != true) {
  542.                     #   Pour chaque reservation on vérifie si la advancePaymentDeadline est dépasser pour envoyer une 1ere alerte au client
  543.                     if ((date('U'strtotime($now))) > (date('U'strtotime($advancePaymentDeadline->format('Y-m-d'))) + 86400)) {
  544.                         #   Logs de process
  545.                         $logs['advance'][2][$key]['process'] = 'Vérification N°2 du paiement de l\'accompte';
  546.                         $logs['advance'][2][$key]['reference'] = $booking->getUniqId();
  547.                         #   Récupéreration du contenu du mail
  548.                         $templateMail_locataire $bookingMailRepo->findOneBy(['title' => 'Alerte acompte N°2']);
  549.                         ##  Envoi d'email d'alerte MailJet 
  550.                         #   Client
  551.                         $mailjet = new Mailjet();
  552.                         $mail_content_c $this->replaceVar($templateMail_locataire->translate($booking->getLocale())->getContent(), $booking$constraint);
  553.                         $mailjet->send("caurettemarc@gmail.com""gite-colombine.fr"$booking->getEmail(), $booking->getFirstName() . " " $booking->getLastName(), $this->translator->trans("Votre réservation") . " N°" $booking->getUniqId(), $mail_content_cfalsefalse7650701);
  554.                         #   Propriétaire
  555.                         $mailjet = new Mailjet();
  556.                         $mail_content_p $this->renderView('components/mail/_booking_advance_alert_2_p.html.twig'compact('booking''statics''constraint'));
  557.                         $mailjet->send("caurettemarc@gmail.com""gite-colombine.fr""maximeavril.dev@gmail.com"$booking->getFirstName() . " " $booking->getLastName(), "Alerte réservation N°" $booking->getUniqId(), $mail_content_pfalsefalse7650701);
  558.                         $logs['advance'][2][$key]['content'] = $mail_content_c;
  559.                         $booking->setIsAdvancePaymentAlert2(true);
  560.                         $this->manager->persist($booking);
  561.                         $ProcessLogs = new ProcessLogs();
  562.                         $ProcessLogs
  563.                             ->setTitle($logs['advance']['title'])
  564.                             ->setProcess($logs['advance'][2][$key]['process'])
  565.                             ->setReference($logs['advance'][2][$key]['reference'])
  566.                             ->setContent($logs['advance'][2][$key]['content'])
  567.                             ->setCreatedAt(new DateTimeImmutable());
  568.                         $this->manager->persist($ProcessLogs);
  569.                     }
  570.                 }
  571.                 ###   Alerte 1 caution
  572.                 if ($booking->getIsCautionPaymentAlert1() != true && $booking->getIsCautionPayed() != true && $isForSoon == false) {
  573.                     #   Pour chaque reservation on vérifie si la cautionPaymentDeadline est dépassée pour envoyer une 1ere alerte au client
  574.                     if ((date('U'strtotime($now))) > (date('U'strtotime($cautionPaymentDeadline->format('Y-m-d'))) - ((ceil($constraint->getCautionPaymentDelay() / 3) * 86400)))) {
  575.                         #   Logs de process
  576.                         $logs['caution'][1][$key]['reference'] = $booking->getUniqId();
  577.                         #   Récupéreration du contenu du mail
  578.                         $templateMail_locataire $bookingMailRepo->findOneBy(['title' => 'Alerte caution N°1']);
  579.                         #   SWIKLY GENERATION
  580.                         if (!$booking->getSwiklyUrl()) {
  581.                             $successUrl $this->generateUrl('swikly_accept', ['uid' => $booking->getUniqId()], UrlGeneratorInterface::ABSOLUTE_URL);
  582.                             $errorUrl $this->generateUrl('swikly_decline', ['uid' => $booking->getUniqId()], UrlGeneratorInterface::ABSOLUTE_URL);
  583.                             $res $swiklyService->createDeposit($booking$successUrl$errorUrl);
  584.                             if ($res && isset($res['accept_url'])) {
  585.                                 $booking->setSwiklyUrl($res['accept_url']);
  586.                                 $booking->setSwiklyRequestId($res['swik_id'] ?? null);
  587.                                 $this->manager->persist($booking);
  588.                                 $this->manager->flush(); // Flush explicitly to save the link
  589.                             }
  590.                         }
  591.                         ##  Envoi d'email d'alerte MailJet 
  592.                         #   Client
  593.                         $mailjet = new Mailjet();
  594.                         $mail_content_c $this->replaceVar($templateMail_locataire->translate($booking->getLocale())->getContent(), $booking$constraint);
  595.                         $mailjet->send("caurettemarc@gmail.com""gite-colombine.fr"$booking->getEmail(), $booking->getFirstName() . " " $booking->getLastName(), $this->translator->trans("Votre réservation") . " N°" $booking->getUniqId(), $mail_content_cfalsefalse7650701);
  596.                         #   Propriétaire
  597.                         $mailjet = new Mailjet();
  598.                         $mail_content_p $this->renderView('components/mail/_booking_caution_alert_1_p.html.twig'compact('booking''statics''constraint'));
  599.                         $mailjet->send("caurettemarc@gmail.com""gite-colombine.fr""maximeavril.dev@gmail.com"$booking->getFirstName() . " " $booking->getLastName(), "Alerte réservation N°" $booking->getUniqId(), $mail_content_pfalsefalse7650701);
  600.                         #   Logs de process
  601.                         $logs['caution'][1][$key]['process'] = 'Vérification N°1 du paiement de la caution';
  602.                         $logs['caution'][1][$key]['content'] = $mail_content_c;
  603.                         #   Changement d'état 
  604.                         $booking->setIsCautionPaymentAlert1(true);
  605.                         $this->manager->persist($booking);
  606.                         #   Enregistrement des logs de process
  607.                         $ProcessLogs = new ProcessLogs();
  608.                         $ProcessLogs
  609.                             ->setTitle($logs['caution']['title'])
  610.                             ->setProcess($logs['caution'][1][$key]['process'])
  611.                             ->setReference($logs['caution'][1][$key]['reference'])
  612.                             ->setContent($logs['caution'][1][$key]['content'])
  613.                             ->setCreatedAt(new DateTimeImmutable());
  614.                         $this->manager->persist($ProcessLogs);
  615.                     }
  616.                 }
  617.                 ###   Alerte 2 caution
  618.                 if ($booking->getIsCautionPaymentAlert2() != true && $booking->getIsCautionPayed() != true && $isForSoon == false) {
  619.                     #   Pour chaque reservation on vérifie si la cautionPaymentDeadline est dépassée pour envoyer une 2eme alerte au client
  620.                     if ((date('U'strtotime($now))) > (date('U'strtotime($cautionPaymentDeadline->format('Y-m-d'))))) {
  621.                         #   Logs de process
  622.                         $logs['caution'][2][$key]['reference'] = $booking->getUniqId();
  623.                         #   Récupéreration du contenu du mail
  624.                         $templateMail_locataire $bookingMailRepo->findOneBy(['title' => 'Alerte caution N°2']);
  625.                         #   SWIKLY GENERATION (Reuse or create if missing)
  626.                         if (!$booking->getSwiklyUrl()) {
  627.                             $successUrl $this->generateUrl('swikly_accept', ['uid' => $booking->getUniqId()], UrlGeneratorInterface::ABSOLUTE_URL);
  628.                             $errorUrl $this->generateUrl('swikly_decline', ['uid' => $booking->getUniqId()], UrlGeneratorInterface::ABSOLUTE_URL);
  629.                             $res $swiklyService->createDeposit($booking$successUrl$errorUrl);
  630.                             if ($res && isset($res['accept_url'])) {
  631.                                 $booking->setSwiklyUrl($res['accept_url']);
  632.                                 $booking->setSwiklyRequestId($res['swik_id'] ?? null);
  633.                                 $this->manager->persist($booking);
  634.                                 $this->manager->flush();
  635.                             }
  636.                         }
  637.                         ##  Envoi d'email d'alerte MailJet 
  638.                         #   Client
  639.                         $mailjet = new Mailjet();
  640.                         $mail_content_c $this->replaceVar($templateMail_locataire->translate($booking->getLocale())->getContent(), $booking$constraint);
  641.                         $mailjet->send("caurettemarc@gmail.com""gite-colombine.fr"$booking->getEmail(), $booking->getFirstName() . " " $booking->getLastName(), $this->translator->trans("Votre réservation") . " N°" $booking->getUniqId(), $mail_content_cfalsefalse7650701);
  642.                         #   Propriétaire
  643.                         $mailjet = new Mailjet();
  644.                         $mail_content_p $this->renderView('components/mail/_booking_caution_alert_2_p.html.twig'compact('booking''statics''constraint'));
  645.                         $mailjet->send("caurettemarc@gmail.com""gite-colombine.fr""maximeavril.dev@gmail.com"$booking->getFirstName() . " " $booking->getLastName(), "Alerte réservation N°" $booking->getUniqId(), $mail_content_pfalsefalse7650701);
  646.                         #   Logs de process
  647.                         $logs['caution'][2][$key]['process'] = 'Vérification N°2 du paiement de la caution';
  648.                         $logs['caution'][2][$key]['content'] = $mail_content_c;
  649.                         #   Changement d'état 
  650.                         $booking->setIsCautionPaymentAlert1(true);
  651.                         $this->manager->persist($booking);
  652.                         #   Enregistrement des logs de process
  653.                         $ProcessLogs = new ProcessLogs();
  654.                         $ProcessLogs
  655.                             ->setTitle($logs['caution']['title'])
  656.                             ->setProcess($logs['caution'][2][$key]['process'])
  657.                             ->setReference($logs['caution'][2][$key]['reference'])
  658.                             ->setContent($logs['caution'][2][$key]['content'])
  659.                             ->setCreatedAt(new DateTimeImmutable());
  660.                         $this->manager->persist($ProcessLogs);
  661.                     }
  662.                 }
  663.                 ###   Alerte 1 reliquat
  664.                 if ($booking->getIsBalancePaymentAlert1() != true && $booking->getIsBalancePayed() != true) {
  665.                     #   Si il s'agit d'une reservation iminente
  666.                     if ($isForSoon == true) {
  667.                         #   On vérifie si nous sommes à la deadline de paiement du montant total
  668.                         if ((date('U'strtotime($now))) > (date('U'strtotime($balancePaymentDeadline->format('Y-m-d'))))) {
  669.                             #   Logs de process
  670.                             $logs['balance'][1][$key]['reference'] = $booking->getUniqId();
  671.                             #   Récupéreration du contenu du mail
  672.                             $templateMail_locataire $bookingMailRepo->findOneBy(['title' => 'Alerte solde N°1 : Réservation imminente']);
  673.                             ##  Envoi d'email d'alerte MailJet 
  674.                             #   Client
  675.                             $mailjet = new Mailjet();
  676.                             $mail_content_c $this->replaceVar($templateMail_locataire->translate($booking->getLocale())->getContent(), $booking$constraint);
  677.                             $mailjet->send("caurettemarc@gmail.com""gite-colombine.fr"$booking->getEmail(), $booking->getFirstName() . " " $booking->getLastName(), $this->translator->trans("Votre réservation") . " N°" $booking->getUniqId(), $mail_content_cfalsefalse7650701);
  678.                             #   Propriétaire
  679.                             $mailjet = new Mailjet();
  680.                             $mail_content_p $this->renderView('components/mail/_booking_balance_alert_1_p.html.twig'compact('booking''statics''constraint'));
  681.                             $mailjet->send("caurettemarc@gmail.com""gite-colombine.fr""maximeavril.dev@gmail.com"$booking->getFirstName() . " " $booking->getLastName(), "Alerte réservation N°" $booking->getUniqId(), $mail_content_pfalsefalse7650701);
  682.                             #   Logs de process
  683.                             $logs['balance'][1][$key]['process'] = 'Vérification N°1 du paiement total';
  684.                             $logs['balance'][1][$key]['content'] = $mail_content_c;
  685.                             #   Changement d'état 
  686.                             $booking->setIsBalancePaymentAlert1(true);
  687.                             $this->manager->persist($booking);
  688.                             #   Enregistrement des logs de process
  689.                             $ProcessLogs = new ProcessLogs();
  690.                             $ProcessLogs
  691.                                 ->setTitle($logs['balance']['title'])
  692.                                 ->setProcess($logs['balance'][1][$key]['process'])
  693.                                 ->setReference($logs['balance'][1][$key]['reference'])
  694.                                 ->setContent($logs['balance'][1][$key]['content'])
  695.                                 ->setCreatedAt(new DateTimeImmutable());
  696.                             $this->manager->persist($ProcessLogs);
  697.                         }
  698.                     } else {
  699.                         #   Pour chaque reservation on vérifie si la balancePaymentDeadline est dépasser pour envoyer une 1ere alerte au client
  700.                         if ((date('U'strtotime($now))) > (date('U'strtotime($balancePaymentDeadline->format('Y-m-d'))))) {
  701.                             #   Logs de process
  702.                             $logs['balance'][1][$key]['reference'] = $booking->getUniqId();
  703.                             #   Récupéreration du contenu du mail
  704.                             $templateMail_locataire $bookingMailRepo->findOneBy(['title' => 'Alerte solde N°1 : Réservation classique']);
  705.                             ##  Envoi d'email d'alerte MailJet 
  706.                             #   Client
  707.                             $mailjet = new Mailjet();
  708.                             $mail_content_c $this->replaceVar($templateMail_locataire->translate($booking->getLocale())->getContent(), $booking$constraint);
  709.                             $mailjet->send("caurettemarc@gmail.com""gite-colombine.fr"$booking->getEmail(), $booking->getFirstName() . " " $booking->getLastName(), $this->translator->trans("Votre réservation") . " N°" $booking->getUniqId(), $mail_content_cfalsefalse7650701);
  710.                             #   Propriétaire
  711.                             $mailjet = new Mailjet();
  712.                             $mail_content_p $this->renderView('components/mail/_booking_balance_alert_1_p.html.twig'compact('booking''statics''constraint'));
  713.                             $mailjet->send("caurettemarc@gmail.com""gite-colombine.fr""maximeavril.dev@gmail.com"$booking->getFirstName() . " " $booking->getLastName(), "Alerte réservation N°" $booking->getUniqId(), $mail_content_pfalsefalse7650701);
  714.                             #   Logs de process
  715.                             $logs['balance'][1][$key]['process'] = 'Vérification N°1 du paiement du recliquat';
  716.                             $logs['balance'][1][$key]['content'] = $mail_content_c;
  717.                             #   Changement d'état 
  718.                             $booking->setIsBalancePaymentAlert1(true);
  719.                             $this->manager->persist($booking);
  720.                             #   Enregistrement des logs de process
  721.                             $ProcessLogs = new ProcessLogs();
  722.                             $ProcessLogs
  723.                                 ->setTitle($logs['balance']['title'])
  724.                                 ->setProcess($logs['balance'][1][$key]['process'])
  725.                                 ->setReference($logs['balance'][1][$key]['reference'])
  726.                                 ->setContent($logs['balance'][1][$key]['content'])
  727.                                 ->setCreatedAt(new DateTimeImmutable());
  728.                             $this->manager->persist($ProcessLogs);
  729.                         }
  730.                     }
  731.                 }
  732.                 ###   Alerte 2 reliquat
  733.                 if ($booking->getIsBalancePaymentAlert2() != true && $booking->getIsBalancePaymentAlert1() == true && $booking->getIsBalancePayed() != true) {
  734.                     #   Réservation iminente
  735.                     if ($isForSoon == true) {
  736.                         #   On vérifie si nous sommes 72h après la deadline de paiement du montant total
  737.                         if ((date('U'strtotime($now))) > (date('U'strtotime($balancePaymentDeadline->format('Y-m-d')) + (84600)))) {
  738.                             #   Logs de process
  739.                             $logs['balance'][2][$key]['reference'] = $booking->getUniqId();
  740.                             #   Récupéreration du contenu du mail
  741.                             $templateMail_locataire $bookingMailRepo->findOneBy(['title' => 'Alerte solde N°2 : Réservation imminente']);
  742.                             ##  Envoi d'email d'alerte MailJet 
  743.                             #   Client
  744.                             $mailjet = new Mailjet();
  745.                             $mail_content_c $this->replaceVar($templateMail_locataire->translate($booking->getLocale())->getContent(), $booking$constraint);
  746.                             $mailjet->send("caurettemarc@gmail.com""gite-colombine.fr"$booking->getEmail(), $booking->getFirstName() . " " $booking->getLastName(), $this->translator->trans("Votre réservation") . " N°" $booking->getUniqId(), $mail_content_cfalsefalse7650701);
  747.                             #   Propriétaire
  748.                             $mailjet = new Mailjet();
  749.                             $mail_content_p $this->renderView('components/mail/_booking_balance_alert_2_p.html.twig'compact('booking''statics''constraint'));
  750.                             $mailjet->send("caurettemarc@gmail.com""gite-colombine.fr""maximeavril.dev@gmail.com"$booking->getFirstName() . " " $booking->getLastName(), "Alerte réservation N°" $booking->getUniqId(), $mail_content_pfalsefalse7650701);
  751.                             #   Logs de process
  752.                             $logs['balance'][2][$key]['process'] = 'Vérification N°1 du paiement total';
  753.                             $logs['balance'][2][$key]['content'] = $mail_content_c;
  754.                             #   Changement d'état 
  755.                             $booking
  756.                                 ->setIsBalancePaymentAlert2(true)
  757.                                 ->setTracking(false);
  758.                             $this->manager->persist($booking);
  759.                             #   Enregistrement des logs de process
  760.                             $ProcessLogs = new ProcessLogs();
  761.                             $ProcessLogs
  762.                                 ->setTitle($logs['balance']['title'])
  763.                                 ->setProcess($logs['balance'][2][$key]['process'])
  764.                                 ->setReference($logs['balance'][2][$key]['reference'])
  765.                                 ->setContent($logs['balance'][2][$key]['content'])
  766.                                 ->setCreatedAt(new DateTimeImmutable());
  767.                             $this->manager->persist($ProcessLogs);
  768.                         }
  769.                         #   Réservation normale
  770.                     } else {
  771.                         #   Pour chaque reservation on vérifie si la balancePaymentDeadline + 72h est dépasser pour envoyer une 2eme alerte au client
  772.                         if ((date('U'strtotime($now))) > (date('U'strtotime($balancePaymentDeadline->format('Y-m-d'))) + (84600))) {
  773.                             #   Logs de process
  774.                             $logs['balance'][2][$key]['reference'] = $booking->getUniqId();
  775.                             #   Récupéreration du contenu du mail
  776.                             $templateMail_locataire $bookingMailRepo->findOneBy(['title' => 'Alerte solde N°2 : Réservation classique']);
  777.                             ##  Envoi d'email d'alerte MailJet 
  778.                             #   Client
  779.                             $mailjet = new Mailjet();
  780.                             $mail_content_c $this->replaceVar($templateMail_locataire->translate($booking->getLocale())->getContent(), $booking$constraint);
  781.                             $mailjet->send("caurettemarc@gmail.com""gite-colombine.fr"$booking->getEmail(), $booking->getFirstName() . " " $booking->getLastName(), $this->translator->trans("Votre réservation") . " N°" $booking->getUniqId(), $mail_content_cfalsefalse7650701);
  782.                             #   Propriétaire
  783.                             $mailjet = new Mailjet();
  784.                             $mail_content_p $this->renderView('components/mail/_booking_balance_alert_2_p.html.twig'compact('booking''statics''constraint'));
  785.                             $mailjet->send("caurettemarc@gmail.com""gite-colombine.fr""maximeavril.dev@gmail.com"$booking->getFirstName() . " " $booking->getLastName(), "Alerte réservation N°" $booking->getUniqId(), $mail_content_pfalsefalse7650701);
  786.                             #   Logs de process
  787.                             $logs['balance'][2][$key]['process'] = 'Vérification N°1 du paiement du recliquat';
  788.                             $logs['balance'][2][$key]['content'] = $mail_content_c;
  789.                             #   Changement d'état 
  790.                             $booking
  791.                                 ->setIsBalancePaymentAlert2(true)
  792.                                 ->setTracking(false);
  793.                             $this->manager->persist($booking);
  794.                             #   Enregistrement des logs de process
  795.                             $ProcessLogs = new ProcessLogs();
  796.                             $ProcessLogs
  797.                                 ->setTitle($logs['balance']['title'])
  798.                                 ->setProcess($logs['balance'][2][$key]['process'])
  799.                                 ->setReference($logs['balance'][2][$key]['reference'])
  800.                                 ->setContent($logs['balance'][2][$key]['content'])
  801.                                 ->setCreatedAt(new DateTimeImmutable());
  802.                             $this->manager->persist($ProcessLogs);
  803.                         }
  804.                     }
  805.                 }
  806.             }
  807.         }
  808.         $this->manager->flush();
  809.         // return new Response('success', 200);
  810.         return new JsonResponse($logs);
  811.     }
  812.     /** 
  813.      * Permet de récupérer la date la plus éloignée parmis les periodes des saisons en BDD
  814.      * Afin de bloquer les reservations en ligne après cette date
  815.      * 
  816.      * @Route("/booking/get-end-date", name="booking_end_date")
  817.      */
  818.     public function getEndDate()
  819.     {
  820.         $saisons $this->constraint->getSaisons();
  821.         $endDates = [];
  822.         foreach ($saisons as $key => $saison) {
  823.             foreach ($saison->getPeriods() as $key => $period) {
  824.                 $endDates[] = date('U'strtotime($period->getEndDate()->format('Y-m-d')));
  825.             }
  826.         }
  827.         sort($endDatesSORT_NUMERIC);
  828.         $endDate date('d/m/Y'array_slice($endDates, -11)[0]);
  829.         return $endDate;
  830.     }
  831.     /** 
  832.      * Permet d'afficher la page des conditions générales
  833.      * 
  834.      * @Route("/booking/conditions-generales", name="booking_conditions")
  835.      */
  836.     public function showConditions()
  837.     {
  838.         $page $this->pageRepo->findOneBy(['page' => 'CGV']);
  839.         #   Redirection sur la page de validation de réservation
  840.         return $this->render('booking/conditions.html.twig', [
  841.             'statics' => $this->statics['data'],
  842.             'page' => $page,
  843.             'constraints' => $this->constraint,
  844.         ]);
  845.     }
  846.     /** 
  847.      * Permet de générer un PDF a partir d'un template HTML
  848.      * 
  849.      * @Route("/booking/make-pdf/{uid}", name="booking_make_pdf")
  850.      */
  851.     public function makePdf($uid$template$request$for null)
  852.     {
  853.         $locale $request->attributes->get('_locale');
  854.         $html2pdf = new Html2Pdf('p''A4'$localetrue'UTF-8', [15151515], true);
  855.         $html2pdf->writeHTML($template);
  856.         if ($for == 'bailleur') {
  857.             $html2pdf->output('/home/maxappu/www/' str_replace('https://'''$request->getSchemeAndHttpHost()) . '/v3/public/file/contrats/contrat-' $uid '-bailleur.pdf''F');
  858.         } elseif ($for == 'locataire') {
  859.             $html2pdf->output('/home/maxappu/www/' str_replace('https://'''$request->getSchemeAndHttpHost()) . '/v3/public/file/contrats/contrat-' $uid '-locataire.pdf''F');
  860.         }
  861.         return $this->json(true);
  862.     }
  863.     /** 
  864.      * Permet de remplacer les variables des templates de mail
  865.      * 
  866.      * @Route("/{_locale}/booking/replacevar", name="booking_make_pdf")
  867.      */
  868.     public function replaceVar($template$booking$constraint$for null)
  869.     {
  870.         $copyFor "";
  871.         if ($for == 'locataire') {
  872.             $copyFor "Copie pour le locataire";
  873.         } elseif ($for == 'bailleur') {
  874.             $copyFor "Copie pour le bailleur";
  875.         }
  876.         $search = [
  877.             '__uid__',
  878.             '__copyFor__',
  879.             '__a.phone__',
  880.             '__gender__',
  881.             '__firstname__',
  882.             '__lastname__',
  883.             '__advancePayment__',
  884.             '__c.advancePaymentDeadline__',
  885.             '__balance__',
  886.             '__c.balancePaymentDeadline__',
  887.             '__advancePaymentDeadline__',
  888.             '__balancePaymentDeadline__',
  889.             '__deposit__',
  890.             '__c.cautionPaymentDelay__',
  891.             '__cautionPaymentDeadline__',
  892.             '__finalAmount__',
  893.             '__rib__',
  894.             '__paypal__',
  895.             '__startdate__',
  896.             '__enddate__',
  897.             '__housework__',
  898.             '__staytax__',
  899.             '__email__',
  900.             '__phone__',
  901.             '__comment__',
  902.             '__dayprice__',
  903.             '__paymentMethod__',
  904.             '__number__',
  905.             '__duration__',
  906.             '__swikly_url__',
  907.         ];
  908.         $replace = [
  909.             $booking->getUniqId(),
  910.             $copyFor,
  911.             $this->statics['data']['about']->getPhone(),
  912.             $booking->getGender(),
  913.             $booking->getFirstName(),
  914.             $booking->getLastName(),
  915.             number_format(($booking->getAdvancePayment() / 100), 2','' '),
  916.             $constraint->getAdvancePaymentDeadline(),
  917.             number_format((($booking->getFinalAmount() - $booking->getAdvancePayment()) / 100), 2','' '),
  918.             $constraint->getBalancePaymentDeadline(),
  919.             $booking->getAdvancePaymentDeadline()->format('d/m/Y'),
  920.             $booking->getBalancePaymentDeadline()->format('d/m/Y'),
  921.             number_format(($booking->getDeposit() / 100), 2','' '),
  922.             $constraint->getCautionPaymentDelay(),
  923.             $booking->getCautionPaymentDeadline()->format('d/m/Y'),
  924.             number_format(($booking->getFinalAmount() / 100), 2','' '),
  925.             'www.gite-colombine.fr/images/profile/' $constraint->getPaymentMethods()[0]->getImg(),
  926.             $constraint->getPaymentMethods()[1]->getUrl(),
  927.             $booking->getStartDate()->format('d/m/Y'),
  928.             $booking->getEndDate()->format('d/m/Y'),
  929.             number_format(($booking->getHousework() / 100), 2','' '),
  930.             number_format(($booking->getStayTax() / 100), 2','' '),
  931.             $booking->getEmail(),
  932.             $booking->getPhone(),
  933.             html_entity_decode($booking->getComment()),
  934.             number_format(($booking->getDayPrice() / 100), 2','' '),
  935.             $booking->getPaymentMethod(),
  936.             $booking->getNumber(),
  937.             $booking->getDuration(),
  938.             $booking->getSwiklyUrl() ?? '',
  939.         ];
  940.         $template str_replace($search$replace$template);
  941.         return $template;
  942.     }
  943. }