Linux SRV-16 6.18.44-paas #1 SMP PREEMPT_DYNAMIC Thu Aug 13 10:08:12 UTC 2026 x86_64
/
srv
/
data
/
web
/
vhosts
/
716cf56cb2.url-de-test.ws
/
htdocs
/
src
/
Service
/
/srv/data/web/vhosts/716cf56cb2.url-de-test.ws/htdocs/src/Service/IcalService.php
<?php namespace App\Service; use App\Entity\Ical; use App\Entity\Booking; use App\Entity\Logement; use Psr\Log\LoggerInterface; use Eluceo\iCal\Component\Event; use App\Service\CalculPriceVisit; use App\Repository\IcalRepository; use Eluceo\iCal\Component\Calendar; use App\Repository\LogementRepository; use Doctrine\ORM\EntityManagerInterface; use Symfony\Component\HttpFoundation\Request; use Symfony\Component\HttpFoundation\Response; use Symfony\Component\Routing\RouterInterface; use Symfony\Contracts\HttpClient\HttpClientInterface; use Symfony\Component\HttpFoundation\Session\SessionInterface; use Symfony\Component\HttpFoundation\File\Exception\FileException; use Symfony\Component\DependencyInjection\ParameterBag\ParameterBagInterface; class IcalService { protected $em; protected $logementRepository; protected $icalRepository; protected $session; protected $calculatePrice; protected $logger; protected $router; protected $parameterBag; protected $client; public function __construct(EntityManagerInterface $em, LogementRepository $logementRepository, IcalRepository $icalRepository, SessionInterface $session, CalculPriceVisit $calculatePrice, LoggerInterface $logger, RouterInterface $router, ParameterBagInterface $parameterBag, HttpClientInterface $client) { $this->em = $em; $this->logementRepository = $logementRepository; $this->icalRepository = $icalRepository; $this->session = $session; $this->calculatePrice = $calculatePrice; $this->logger = $logger; $this->router = $router; $this->parameterBag = $parameterBag; $this->client = $client; } public function generate(int $id, Request $request) { $logement = $this->logementRepository->find($id); // Crée un nouvel objet Calendar $calendar = new Calendar($logement->getName()); // Ajoute chaque réservation comme un événement dans le calendrier foreach ($logement->getBookings() as $booking) { if (!$booking->isIsCancel()) { $event = new Event(); $event ->setDtStart($booking->getCheckin()) ->setDtEnd($booking->getCheckout()) ->setSummary($booking->getUserName()); // Ajoute l'événement au calendrier $calendar->addComponent($event); } } // Génère le contenu du fichier iCal $content = $calendar->render(); // Enregistre le fichier iCal dans le dossier public $filePath = $this->parameterBag->get('kernel.project_dir') . '/public/ical/'; $fileName = str_replace(' ', '', $logement->getName()) . 'reservations_' . time() . '.ics'; try { file_put_contents($filePath . $fileName, $content); } catch (FileException $e) { $this->logger->error("Une erreur lors stockage du fichier : " . $e->getMessage()); $this->logger->error("Exception complète : " . ['exception' => $e]); } $icalUrl = $this->router->generate('app_return_ical', ['id' => $logement->getId()], RouterInterface::ABSOLUTE_URL); $icalLogement = $this->icalRepository->icalGenerated($logement); if (!$icalLogement) { $ical = new Ical(); $ical->setName($logement->getName()) ->setUrl($request->getSchemeAndHttpHost() . '/ical/' . $fileName) ->setAccessLink($icalUrl) ->setIsGenerated(true) ->setLogement($logement); $this->em->persist($ical); } else { $ical = $icalLogement[0]; $ical->setUrl($request->getSchemeAndHttpHost() . '/ical/' . $fileName); $this->em->persist($ical); } $this->em->flush(); $this->session->set("ical_session", $ical); return new Response($ical->getUrl()); } public function import(Logement $logement, $icalUrl) { try { $response = $this->client->request('GET', $icalUrl); $icalContent = $response->getContent(); } catch (\Exception $e) { $this->session->getFlashBag()->add("danger", "Une erreur est survenue"); throw new \Exception($e->getMessage()); } $eventsBruts = explode("END:VEVENT", $icalContent); $events = []; foreach ($eventsBruts as $eventBrut) { $lignes = explode("\n", $eventBrut); $event = []; foreach ($lignes as $ligne) { if (strpos($ligne, 'DTSTART') !== false || strpos($ligne, 'DTEND') !== false || strpos($ligne, 'SUMMARY') !== false) { // Divisez la ligne en "NOM:" et la valeur réelle $elements = explode(':', $ligne, 2); if (count($elements) === 2) { $nom = strpos($elements[0], ";") ? explode(";", $elements[0])[0] : $elements[0]; $valeur = $elements[1]; // Ajoutez la propriété à votre tableau de données spécifique à l'événement $event[$nom] = $valeur; } } } if (count($event) > 0) { $events[] = $event; } } foreach ($events as $event) { $infos = [ 'start' => new \DateTimeImmutable($event['DTSTART']), 'end' => new \DateTimeImmutable($event['DTEND']), 'summary' => $event['SUMMARY'] ]; $existingBooking = null; foreach ($logement->getBookings() as $bookingEvent) { if ($bookingEvent->getCheckin() == $infos['start'] && $bookingEvent->getCheckout() == $infos['end']) { $existingBooking = $bookingEvent; break; } } if ($existingBooking !== null) { continue; } $price = $this->calculatePrice->totalPrice($infos, $logement); $splitPrices = $this->calculatePrice->accompte($price); $booking = new Booking(); $booking->setLogement($logement) ->setLogementName($logement->getName()) ->setLogementPrice($logement->getPrice()) ->setCheckin($infos['start']) ->setCheckout($infos['end']) ->setAdvance($splitPrices['accompte']) ->setRest($splitPrices['rest']) ->setTotalPrice($price) ->setStatusAdvance(Booking::STATUS_PAID) ->setStatusRest(Booking::STATUS_PAID) ->setIsImported(true) ->setUserName($infos['summary'] . " FROM BOOKING"); $this->em->persist($booking); } //check if booking is still in events foreach ($logement->getBookings() as $booking) { $bookingFound = false; foreach ($events as $event) { $infos = [ 'start' => new \DateTimeImmutable($event['DTSTART']), 'end' => new \DateTimeImmutable($event['DTEND']), 'summary' => $event['SUMMARY'], ]; if ($booking->getCheckin() == $infos['start'] && $booking->getCheckout() == $infos['end']) { $bookingFound = true; break; } } if (!$bookingFound && $booking->isIsImported()) { $booking->setIsCancel(true); } } if (count($events) === 0) { foreach ($logement->getBookings() as $booking) { if ($booking->isIsImported()) { $booking->setIsCancel(true); } } } $existIcalUrl = $this->icalRepository->findOneBy(['url' => $icalUrl]); if (!$existIcalUrl) { $ical = new Ical(); $ical->setLogement($logement) ->setName($logement->getName()) ->setAccessLink($icalUrl) ->setUrl($icalUrl); $this->em->persist($ical); } $this->em->flush(); } }