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
/
Controller
/
Back
/
/srv/data/web/vhosts/716cf56cb2.url-de-test.ws/htdocs/src/Controller/Back/LogementController.php
<?php namespace App\Controller\Back; use App\Entity\ClosureDays; use App\Entity\Logement; use App\Entity\PricesLogements; use App\Form\ClosureDaysType; use App\Form\LogementType; use App\Form\ImportIcalType; use App\Form\PricesLogementType; use App\Repository\ClosureDaysRepository; use Psr\Log\LoggerInterface; use App\Repository\IcalRepository; use App\Repository\LogementRepository; use App\Repository\PricesLogementsRepository; use App\Service\IcalService; use App\Service\UploadImageService; use DateTime; use DateTimeImmutable; use Doctrine\ORM\EntityManagerInterface; use Symfony\Component\HttpFoundation\Request; use Symfony\Component\HttpFoundation\Response; use Symfony\Component\Routing\Annotation\Route; use Symfony\Component\HttpFoundation\Session\SessionInterface; use Symfony\Bundle\FrameworkBundle\Controller\AbstractController; use Symfony\Contracts\HttpClient\HttpClientInterface; /** * @Route("/admin/logements") */ class LogementController extends AbstractController { protected $em; protected $logementRepository; protected $icalRepository; protected $session; protected $logger; protected $icalService; protected $uploadImage; protected $pricesLogementsRepository; protected $closureDaysRepository; public function __construct(EntityManagerInterface $em, LogementRepository $logementRepository, IcalRepository $icalRepository, SessionInterface $session, LoggerInterface $logger, IcalService $icalService, UploadImageService $uploadImage, PricesLogementsRepository $pricesLogementsRepository, ClosureDaysRepository $closureDaysRepository) { $this->em = $em; $this->logementRepository = $logementRepository; $this->icalRepository = $icalRepository; $this->session = $session; $this->logger = $logger; $this->icalService = $icalService; $this->uploadImage = $uploadImage; $this->pricesLogementsRepository = $pricesLogementsRepository; $this->closureDaysRepository = $closureDaysRepository; } /** * @Route("/", name="app_search_logement") */ public function index() { $logements = $this->logementRepository->findLogementsNotDeleted(); return $this->render("Back/Logements/search.html.twig", [ "logements" => $logements ]); } /** * @Route("/create", name="app_create_logement") */ public function create(Request $request) { $logement = new Logement(); $form = $this->createForm(LogementType::class, $logement); $form->handleRequest($request); if ($form->isSubmitted() && $form->isValid()) { $image = $form->get('image')->getData(); if ($image) { $this->uploadImage->upload($image, $logement, $this->getParameter('images_logements')); } foreach ($form->get('options2')->getData() as $option) { $logement->addOption($option); } $this->em->persist($logement); $this->em->flush(); $this->addFlash('success', "Logement ajouté avec succès"); return $this->redirectToRoute("app_search_logement"); } return $this->render("Back/Logements/create.html.twig", [ "form" => $form->createView() ]); } /** * @Route("/edit/{id}", name="app_edit_logement") */ public function edit(int $id, Request $request) { $logement = $this->logementRepository->find($id); $form = $this->createForm(LogementType::class, $logement); $options2 = $logement->getOptions()->filter(function ($o) { return !$o->isIsRequired(); }); $form->get('options2')->setData($options2); $form->handleRequest($request); if ($form->isSubmitted() && $form->isValid()) { $logement->setUpdatedAt(new \DateTimeImmutable()); foreach ($form->get('options2')->getData() as $option) { $logement->addOption($option); } $this->em->persist($logement); $this->em->flush(); $this->addFlash('success', "Logement modifié avec succès"); return $this->redirectToRoute("app_search_logement"); } return $this->render("Back/Logements/edit.html.twig", [ "form" => $form->createView() ]); } /** * @Route("/delete/{id}", name="app_delete_logement") */ public function delete(int $id) { $logement = $this->logementRepository->find($id); try { $logement->setIsDelete(true); $this->em->persist($logement); $this->em->flush(); $this->addFlash('success', "Logement supprimé avec succès"); } catch (\Exception $e) { $this->addFlash('danger', 'Une erreur est survenue'); } return $this->redirectToRoute("app_search_logement"); } /** * @Route("/calendar/{id}", name="app_calendar_logement") */ public function calendar(int $id, Request $request) { $logement = $this->logementRepository->find($id); $events = []; // display booking in calendar foreach ($logement->getBookings() as $book) { if (!$book->isIsCancel()) { if ($book->isIsImported()) { $events[] = [ 'id' => $book->getId(), 'start' => $book->getCheckin()->format('Y-m-d'), 'end' => $book->getCheckout()->format('Y-m-d'), 'title' => "Nom: " . $book->getUserName() . "<br/>" . "dates: " . $book->getCheckin()->format("d-m-Y") . " au " . $book->getCheckout()->format("d-m-Y"), 'backgroundColor' => "blue" ]; } else { $events[] = [ 'id' => $book->getId(), 'start' => $book->getCheckin()->format('Y-m-d'), 'end' => $book->getCheckout()->format('Y-m-d'), 'title' => "Nom: " . $book->getUserName() . "<br/>" . "Téléphone: " . $book->getUserPhone() . "<br/>" . "Email: " . $book->getUserEmail() . "<br/>" . "Acompte: " . $book->getStatusAdvance() . " " . $book->getAdvance() / 100 . " €" . "<br/>" . "Reste: " . $book->getStatusRest() . " " . $book->getRest() / 100 . " €" . "<br/>" . "Total: " . $book->getTotalPrice() / 100 . " €", 'backgroundColor' => "green" ]; } } } // display prices for days not booked foreach ($logement->getPricesLogements() as $prices) { $priceDate = $prices->getDate()->format('Y-m-d'); $dateIsAvailable = true; foreach ($events as $event) { if ($event['start'] <= $priceDate && $priceDate < $event['end']) { $dateIsAvailable = false; break; } } if ($dateIsAvailable) { $events[] = [ 'id' => $prices->getId(), 'start' => $prices->getDate()->format('Y-m-d'), 'end' => $prices->getDate()->format('Y-m-d'), 'title' => 'Standard : ' . $prices->getPriceNight() / 100 . " € <br/>" . '+ de 7 jours : ' . $prices->getPriceWeek() / 100 . " €", 'display' => "background", 'textColor' => "black" ]; } } foreach ($logement->getClosureDays() as $closure) { $events[] = [ 'id' => $closure->getId(), 'start' => $closure->getDate()->format('Y-m-d'), 'end' => $closure->getDate()->format('Y-m-d'), 'display' => "background", 'backgroundColor' => 'red', 'textColor' => 'black' ]; } $data = json_encode($events); $ical = $this->session->get("ical_session"); $this->session->remove("ical_session"); return $this->render("Back/Logements/calendar.html.twig", [ 'logement' => $logement, 'data' => compact('data'), 'ical' => $ical ]); } /** * @Route("/display-ical/{id}", name="app_display_ical") */ public function displayIcal(int $id, Request $request) { $this->icalService->generate($id, $request); return $this->redirectToRoute("app_calendar_logement", [ 'id' => $id ]); } /** * @Route("/import-ical/{id}", name="app_import_ical") */ public function importIcal(int $id, Request $request, HttpClientInterface $client): Response { $logement = $this->logementRepository->find($id); $form = $this->createForm(ImportIcalType::class); $form->handleRequest($request); if ($form->isSubmitted() && $form->isValid()) { $icalUrl = $form->getData()['urlIcal']; foreach ($logement->getIcals() as $ical) { if ($ical->getUrl() === $icalUrl) { $this->addFlash('danger', "Ce lien à déja été importé"); return $this->redirectToRoute("app_calendar_logement", ['id' => $id]); } } $this->icalService->import($logement, $icalUrl, $client); return $this->redirectToRoute("app_calendar_logement", ['id' => $id]); } return $this->render("Back/Logements/import-ical.html.twig", [ "form" => $form->createView() ]); } /** * @Route("/synchronize-calendar/{id}", name="app_sync_calendar") */ public function synchronizeIcal(int $id): Response { $icals = $this->icalRepository->icalsLinksImported($id); $logement = $this->logementRepository->find($id); foreach ($icals as $ical) { $this->icalService->import($logement, $ical->getAccessLink()); } $this->addFlash('success', 'Calendrier synchronisé'); return $this->redirectToRoute("app_search_logement"); } /** * @Route("/{id}/addPrice", name="app_add_price") */ public function addPrice(int $id, Request $request): Response { $logement = $this->logementRepository->find($id); $form = $this->createForm(PricesLogementType::class); $form->handleRequest($request); if ($form->isSubmitted() && $form->isValid()) { $start = new DateTime($form->getData()['date']->format('d-m-Y')); $end = new DateTime($form->getData()['date2']->format('d-m-Y')); // check all prices defined for dates $existingPrices = $this->pricesLogementsRepository->findBy([ 'Logement' => $logement, ]); $existingDates = []; foreach ($existingPrices as $existingPrice) { $existingDates[$existingPrice->getDate()->format('Y-m-d')] = $existingPrice; } $currentDate = $start; while ($currentDate <= $end) { if (isset($existingDates[$currentDate->format('Y-m-d')])) { // update existing price $existingPrice = $existingDates[$currentDate->format('Y-m-d')]; $existingPrice ->setPriceNight($form->getData()['priceNight']) ->setPriceWeek($form->getData()['priceWeek']); $this->em->persist($existingPrice); } else { // create new price for date $priceLogement = new PricesLogements(); $priceLogement->setDate(new DateTimeImmutable($currentDate->format('d-m-Y'))) ->setPriceNight($form->getData()['priceNight']) ->setPriceWeek($form->getData()['priceWeek']) ->setLogement($logement); $this->em->persist($priceLogement); } $currentDate->modify('+1 day'); } $this->em->flush(); return $this->redirectToRoute("app_calendar_logement", [ 'id' => $id ]); } return $this->render("Back/Logements/addPrices.html.twig", [ "form" => $form->createView(), "id" => $id ]); } /** * @Route("/{id}/add-closure-days", name="app_add_closure") */ public function addClosureDays(int $id, Request $request): Response { $logement = $this->logementRepository->find($id); $form = $this->createForm(ClosureDaysType::class); $form->handleRequest($request); if ($form->isSubmitted() && $form->isValid()) { $start = new DateTime($form->getData()['date']->format('d-m-Y')); $end = new DateTime($form->getData()['date2']->format('d-m-Y')); // check all prices defined for dates $existingClosures = $this->closureDaysRepository->findBy([ 'logement' => $logement, ]); $existingDates = []; foreach ($existingClosures as $existingClosure) { $existingDates[$existingClosure->getDate()->format('Y-m-d')] = $existingClosure; } $currentDate = $start; while ($currentDate <= $end) { if (isset($existingDates[$currentDate->format('Y-m-d')])) { // remove existing dates if re-opened if (!$form->getData()['close']) { $this->em->remove($existingDates[$currentDate->format('Y-m-d')]); } } else { // create new closure if ($form->getData()['close']) { $closureDay = new ClosureDays(); $closureDay->setDate(new DateTimeImmutable($currentDate->format('d-m-Y'))) ->setLogement($logement); $this->em->persist($closureDay); } } $currentDate->modify('+1 day'); } $this->em->flush(); $this->addFlash('success', 'Fermetures modifiées avec succès'); return $this->redirectToRoute("app_calendar_logement", [ 'id' => $id ]); } return $this->render("Back/Logements/addClosureDays.html.twig", [ "form" => $form->createView(), "id" => $id ]); } }