src/Controller/BuildingController.php line 55

  1. <?php
  2. namespace App\Controller;
  3. use App\Entity\Building;
  4. use App\Entity\City;
  5. use App\Entity\HousingCertificate;
  6. use App\Services\GoogleMapsService;
  7. use Symfony\Contracts\Translation\TranslatorInterface;
  8. use App\Entity\User;
  9. use App\Entity\BuildingDocument;
  10. use App\Entity\BuildingEquipment;
  11. use App\Entity\Residence;
  12. use App\Entity\WantedVisio;
  13. use App\Entity\Invoice;
  14. use App\Form\BuildingAddFormType;
  15. use App\Form\BuildingEditFormType;
  16. use App\Repository\BuildingRepository;
  17. use App\Repository\BuildingDocumentRepository;
  18. use App\Repository\HousingCertificateRepository;
  19. use Symfony\Component\HttpFoundation\File\UploadedFile;
  20. use App\Repository\CityRepository;
  21. use App\Repository\LikedBuildingRepository;
  22. use App\Entity\LastViewedBuilding;
  23. use App\Services\Auth\UserAuthService;
  24. use App\Services\Mails\Mails;
  25. use Doctrine\ORM\EntityManagerInterface;
  26. use Doctrine\Common\Collections\ArrayCollection;
  27. use Exception;
  28. use Symfony\Bundle\FrameworkBundle\Controller\AbstractController;
  29. use Symfony\Component\HttpFoundation\JsonResponse;
  30. use Symfony\Component\HttpFoundation\Request;
  31. use Imagine\Gd\Imagine;
  32. use Imagine\Image\Box;
  33. use Symfony\Component\HttpFoundation\Response;
  34. use Symfony\Component\HttpFoundation\Session\SessionInterface;
  35. use Symfony\Component\Routing\Annotation\Route;
  36. use Symfony\Component\Routing\Generator\UrlGeneratorInterface;
  37. use Symfony\Component\Form\FormError;
  38. use Symfony\Component\HttpKernel\Exception\NotFoundHttpException;
  39. use Psr\Log\LoggerInterface;
  40. class BuildingController extends AbstractController
  41. {
  42.     public function __construct(
  43.         private EntityManagerInterface $entityManager,
  44.         private BuildingRepository $buildingRepository,
  45.         private HousingCertificateRepository $housingCertificateRepository,
  46.         private UserAuthService $authService,
  47.         private GoogleMapsService $googleMapsService,
  48.         private LoggerInterface $logger // Inject the logger
  49.     ) {}
  50.     #[Route(path: ["fr" => "/building/{id}""en" => "/en/building/{id}"], name'detail_building')]
  51. public function index(
  52.     Building $building,
  53.     LikedBuildingRepository $likedBuildingRepository,
  54.     BuildingDocumentRepository $buildingDocumentRepository,
  55.     SessionInterface $session
  56. ): Response {
  57.     if (!$building->getIsActive() && ((!$this->getUser()) || ($this->getUser() != $building->getPropertyManager() && !in_array('ROLE_ADMIN'$this->getUser()->getRoles())))) {
  58.         return $this->render('building/not_actif.html.twig');
  59.     }
  60.     $currentUser $this->getUser();
  61.     if ($currentUser && in_array("ROLE_TENANT"$currentUser->getRoles())) {
  62.         $existing $this->entityManager->getRepository(\App\Entity\LastViewedBuilding::class)
  63.             ->findOneBy(['user' => $currentUser'building' => $building]);
  64.         if (!$existing) {
  65.             $lastViewed = new \App\Entity\LastViewedBuilding();
  66.             $lastViewed->setUser($currentUser);
  67.             $lastViewed->setBuilding($building);
  68.             $lastViewed->setViewedAt(new \DateTimeImmutable());
  69.             $this->entityManager->persist($lastViewed);
  70.         } else {
  71.             $existing->setViewedAt(new \DateTimeImmutable());
  72.         }
  73.         $this->entityManager->flush();
  74.     }
  75.     if ($currentUser) {
  76.         $lastViewedBuildings $session->get('lastViewedBuildings', []);
  77.         if (!in_array($building->getId(), array_column($lastViewedBuildings'id'))) {
  78.             if (count($lastViewedBuildings) >= 2) {
  79.                 array_shift($lastViewedBuildings);
  80.             }
  81.             $lastViewedBuildings[] = ['id' => $building->getId(), 'createdAt' => new \DateTime()];
  82.             $session->set('lastViewedBuildings'$lastViewedBuildings);
  83.         }
  84.     }
  85.     $canRequestVisio true;
  86.     if ($this->getUser() && $this->getUser()->getWantedVisios()) {
  87.         foreach ($this->getUser()->getWantedVisios() as $wantedVisio) {
  88.             if ($wantedVisio->getBuilding() === $building) {
  89.                 $now = new \DateTimeImmutable('now', new \DateTimeZone('Europe/Paris'));
  90.                 $diff $now->diff($wantedVisio->getCreatedAt());
  91.                 if ($diff->24) {
  92.                     $canRequestVisio false;
  93.                 }
  94.             }
  95.         }
  96.     }
  97.     $allowEdit false;
  98.     if (!is_null($this->getUser())) {
  99.         if (in_array("ROLE_ADMIN"$this->getUser()->getRoles())) {
  100.             $allowEdit true;
  101.         } elseif ($building->getPropertyManager() == $this->getUser()) {
  102.             $allowEdit true;
  103.         }
  104.     }
  105.     $liked $likedBuildingRepository->findOneBy(['user' => $this->getUser(), 'building' => $building]);
  106.     $documents $buildingDocumentRepository->findBy(['complexPropertyId' => $building->getComplexPropertyId()]);
  107.     $buildingsInComplex $this->buildingRepository->findByComplexPropertyId($building->getComplexPropertyId());
  108.     $similarProperties $this->buildingRepository->findSimilarProperties(
  109.         $building->getCityEntity()->getCity(),
  110.         $building->getSurface(),
  111.         $building->getRent(),
  112.         $building->getComplexPropertyId(),
  113.         $building->getId()
  114.     );
  115.     foreach ($buildingsInComplex as $complexBuilding) {
  116.         $complexBuilding->getBuildingDocuments()->initialize();
  117.     }
  118.     $lowestRent null;
  119.     foreach ($buildingsInComplex as $complexBuilding) {
  120.         if ($complexBuilding->getRent() !== null && ($lowestRent === null || $complexBuilding->getRent() < $lowestRent)) {
  121.             $lowestRent $complexBuilding->getRent();
  122.         }
  123.     }
  124.     $earlyLocation null;
  125.     foreach ($buildingsInComplex as $complexBuilding) {
  126.         if ($complexBuilding->getDateStartAt() !== null && ($earlyLocation === null || $complexBuilding->getDateStartAt() < $earlyLocation)) {
  127.             $earlyLocation $complexBuilding->getDateStartAt();
  128.         }
  129.     }
  130.     $housingCertificate $currentUser $this->housingCertificateRepository->findOneBy(['user' => $currentUser]) : null;
  131.     // Define currentBuildingId
  132.     $currentBuildingId $building->getId();
  133.     return $this->render('building/index.html.twig', [
  134.         'building' => $building,
  135.         'canRequestVisio' => $canRequestVisio,
  136.         'liked' => $liked,
  137.         'allow' => $allowEdit,
  138.         'documents' => $documents,
  139.         'certificate' => $housingCertificate,
  140.         'buildingsInComplex' => $buildingsInComplex,
  141.         'lowestRent' => $lowestRent,
  142.         'earlyLocation' => $earlyLocation,
  143.         'similarProperties' => $similarProperties,
  144.         'user' => $currentUser,
  145.         'lastViewedBuildings' => $lastViewedBuildings ?? [],
  146.         'currentBuildingId' => $currentBuildingId// Pass currentBuildingId to the template
  147.     ]);
  148. }
  149.     #[Route(path: ["fr" => "/residence/{id}""en" => "/en/residence/{id}"], name'detail_residence')]
  150.     public function indexResidence(Residence $residence)
  151.     {
  152.         $currentUser $this->getUser();
  153.         return $this->render('residence/index.html.twig', [
  154.             'residence' => $residence,
  155.             'user' => $currentUser,
  156.         ]);
  157.     }
  158.     #[Route(path: ["fr" => "/building/{id}/wantedVisio""en" => "/en/building/{id}/wantedVisio"], name'wanted_visio_building')]
  159.     public function createWantedVisio(Building $buildingRequest $requestMails $mailsUrlGeneratorInterface $urlGeneratorTranslatorInterface $translator)
  160.     {
  161.         if (!$this->getUser()) {
  162.             return $this->redirectToRoute('app_login_site');
  163.         }
  164.         $email $mails->createEmail('mails/building/visio.html.twig', ["user" => $this->getUser(), "url" => $urlGenerator->generate('detail_building', ['id' => $building->getId()], UrlGeneratorInterface::ABSOLUTE_URL)])
  165.             ->to($building->getPropertyManager()->getEmail())
  166.             ->subject('Demande de visite en visio');
  167.         $mails->send($email);
  168.         $wantedVisio = new WantedVisio();
  169.         $wantedVisio->setRequester($this->getUser())
  170.             ->setBuilding($building)
  171.             ->setCreatedAt(new \DateTimeImmutable('now', new \DateTimeZone('Europe/Paris')));
  172.         $this->entityManager->persist($wantedVisio);
  173.         $this->entityManager->flush();
  174.         $this->addFlash('notice'$translator->trans('notice.notilbailleur'));
  175.         $currentUser $this->getUser();
  176.         return $this->redirectToRoute('detail_building', ['id' => $building->getId()]);
  177.     }
  178.     #[Route(path: ["fr" => "/building/add/bailleur""en" => "/en/building/add/bailleur"], name'add_building_bailleur')]
  179.     public function addBuilding(Request $requestSessionInterface $sessionCityRepository $cityRepositoryTranslatorInterface $translator): \Symfony\Component\HttpFoundation\Response
  180.     {
  181.         if (!$this->authService->checkUserIsConnected($this->getUser())) {
  182.             return $this->redirectToRoute('app_login_site');
  183.         }
  184.         if (!in_array(User::LESSOR$this->getUser()->getRoles()) && !in_array(User::ADMIN$this->getUser()->getRoles()) && !in_array(User::RESIDENT$this->getUser()->getRoles())) {
  185.             throw $this->createNotFoundException('not good roles');
  186.         }
  187.         $building = new Building();
  188.         $cities = [];
  189.         $citiesForm = [];
  190.         $citiesData $cityRepository->findAll();
  191.         foreach ($citiesData as $city) {
  192.             $cities[] = $city->getCityName();
  193.             $citiesForm[] = $city->getCity() . "," $city->getPostalCode();
  194.         }
  195.         $form $this->createForm(BuildingAddFormType::class, $building, ['cities' => $citiesForm]);
  196.         $form->handleRequest($request);
  197.         if ($form->isSubmitted() && $form->isValid()) {
  198.             $cityEntity $form->get('cityEntity')->getData();
  199.             if (is_null($form->get('minIncome')->getData())) {
  200.                 $rent $form->get('rent')->getData();
  201.                 $building->setMinIncome($rent 100);
  202.             }
  203.             $arrayCity explode(','$cityEntity);
  204.             $city $arrayCity[0];
  205.             $streetNumber $form->get('streetNumber')->getData();
  206.             $street $form->get('street')->getData();
  207.             if (count($arrayCity) <= 1) {
  208.                 $postalCode "";
  209.                 $dataGoogleMap $this->googleMapsService->geocodeAddress(
  210.                     $streetNumber " " $street ", " $city
  211.                 );
  212.                 $cityEntity $cityRepository->findOneBy(['name' => $city]);
  213.                 if ($cityEntity) {
  214.                     $building->setCityEntity($cityEntity);
  215.                 }
  216.                 foreach ($dataGoogleMap['0']['address_components'] as $component) {
  217.                     if (in_array("postal_code"$component['types'])) {
  218.                         $postalCode $component['long_name'];
  219.                     }
  220.                 }
  221.             } else {
  222.                 $postalCode $arrayCity[1];
  223.             }
  224.             $building->setPostalCode($postalCode);
  225.             $city $cityRepository->findOneBy(['city' => $city'postalCode' => $postalCode]);
  226.             $building->setCityEntity($city);
  227.             $building->setIsActive(true);
  228.             $building->setIsBlocked(false);
  229.             $building->setIsEnd(true);
  230.             $uniqueId $this->generateUniqueFileName();
  231.             $building->setUniqueId($uniqueId);
  232.             $building->setPropertyManager($this->getUser());
  233.             $building->setRent($building->getRent() * 100);
  234.             $building->setSecurityDeposit($building->getSecurityDeposit() * 100);
  235.             $building->setExpenses($building->getExpenses() * 100);
  236.             $this->entityManager->persist($building);
  237.             $this->entityManager->flush();
  238.             $persistedBuilding $this->buildingRepository->findOneBy(['uniqueId' => $building->getUniqueId()]);
  239.             $persistedBuilding->setNumberId(sprintf('N°%s%s%s%s'$persistedBuilding->getCreatedAt()->format('Y'), $persistedBuilding->getCreatedAt()->format('m'), $persistedBuilding->getCreatedAt()->format('d'), str_pad($persistedBuilding->getId(), 8'0'STR_PAD_LEFT)));
  240.             $this->saveFileWithForm($form$building);
  241.             $this->saveEquipment($form->get('interior')->getData(), $building);
  242.             if ($form->get('exterior')->getData()) {
  243.                 $this->saveEquipment($form->get('exterior')->getData(), $building);
  244.             }
  245.             $this->entityManager->persist($building);
  246.             $this->entityManager->flush();
  247.             $persistedBuilding $this->buildingRepository->findOneBy(['uniqueId' => $building->getUniqueId()]);
  248.             $persistedBuilding->setNumberId(sprintf('N°%s%s%s%s'$persistedBuilding->getCreatedAt()->format('Y'), $persistedBuilding->getCreatedAt()->format('m'), $persistedBuilding->getCreatedAt()->format('d'), str_pad($persistedBuilding->getId(), 8'0'STR_PAD_LEFT)));
  249.             $this->entityManager->persist($building);
  250.             $this->entityManager->flush();
  251.             $this->addFlash('notice'$translator->trans('notice.ajoutBien'));
  252.             $currentUser $this->getUser();
  253.             return $this->redirectToRoute('building_edit', ['id' => $persistedBuilding->getId()]);
  254.         } elseif ($form->isSubmitted()) {
  255.             return $this->render('building/add.html.twig', [
  256.                 'form' => $form->createView(),
  257.                 'cities' => $cities,
  258.                 'user' => $currentUser,
  259.             ]);
  260.         }
  261.         return $this->render('building/add.html.twig', [
  262.             'form' => $form->createView(),
  263.             'cities' => $cities,
  264.             'user' => $currentUser,
  265.         ]);
  266.     }
  267.     #[Route(path: ["fr" => "/building/{id}/validation""en" => "/en/building/{id}/validation"], name'detail_building_before_validation')]
  268.     public function detailBuildingBeforeValidation(Building $building)
  269.     {
  270.         if (!$this->authService->checkUserIsConnected($this->getUser())) {
  271.             return $this->redirectToRoute('app_login_site');
  272.         }
  273.         $this->CheckUserPerm($building);
  274.         $currentUser $this->getUser();
  275.         return $this->render('building/detail_before_validation.html.twig', [
  276.             'building' => $building,
  277.             'user' => $currentUser,
  278.         ]);
  279.     }
  280.     #[Route(path: ["fr" => "/building/{id}/validate""en" => "/en/building/{id}/validate"], name'validate_building')]
  281.     public function validateBuilding(Building $building)
  282.     {
  283.         if (!$this->authService->checkUserIsConnected($this->getUser())) {
  284.             return $this->redirectToRoute('app_login_site');
  285.         }
  286.         $this->CheckUserPerm($building);
  287.         $building->setIsActive(true);
  288.         $building->setIsEnd(true);
  289.         $this->entityManager->persist($building);
  290.         $this->entityManager->flush();
  291.         $currentUser $this->getUser();
  292.         return $this->redirectToRoute('detail_building', ['id' => $building->getId()]);
  293.     }
  294.     #[Route(path: ["fr" => "/building/{id}/edit""en" => "/en/building/{id}/edit"], name'building_edit')]
  295.     public function editBuilding(Building $buildingRequest $requestCityRepository $cityRepositoryTranslatorInterface $translator)
  296.     {
  297.         if (!$this->authService->checkUserIsConnected($this->getUser())) {
  298.             return $this->redirectToRoute('app_login_site');
  299.         }
  300.         $this->CheckUserPerm($building);
  301.         $cities = [];
  302.         $citiesData $cityRepository->findAll();
  303.         foreach ($citiesData as $city) {
  304.             $cities[] = $city->getCityName();
  305.         }
  306.         $complexPropertyId $building->getComplexPropertyId();
  307.         $building->setRent($building->getRent() / 100);
  308.         $building->setSecurityDeposit($building->getSecurityDeposit() / 100);
  309.         $building->setExpenses($building->getExpenses() / 100);
  310.         $form $this->createForm(BuildingEditFormType::class, $building);
  311.         $equipments = [];
  312.         foreach ($building->getBuildingEquipment() as $buildingEquipment) {
  313.             $equipments[] = $buildingEquipment->getName();
  314.         }
  315.         $form->handleRequest($request);
  316.         $pictures1 false;
  317.         $pictures2 false;
  318.         $pictures3 false;
  319.         $pictures4 false;
  320.         $pictures5 false;
  321.         $pictures6 false;
  322.         $pictures7 false;
  323.         $pictures8 false;
  324.         foreach ($building->getBuildingDocuments() as $buildingDocument) {
  325.             if ($buildingDocument->getName() == "base") {
  326.                 // Supprimer la photo de base
  327.                 //$this->entityManager->remove($buildingDocument);
  328.             } elseif ($buildingDocument->getName() == "file2") {
  329.                 $pictures2 $buildingDocument->getImageFile();
  330.             } elseif ($buildingDocument->getName() == "file3") {
  331.                 $pictures3 $buildingDocument->getImageFile();
  332.             } elseif ($buildingDocument->getName() == "file4") {
  333.                 $pictures4 $buildingDocument->getImageFile();
  334.             } elseif ($buildingDocument->getName() == "file5") {
  335.                 $pictures5 $buildingDocument->getImageFile();
  336.             } elseif ($buildingDocument->getName() == "file6") {
  337.                 $pictures6 $buildingDocument->getImageFile();
  338.             } elseif ($buildingDocument->getName() == "file7") {
  339.                 $pictures7 $buildingDocument->getImageFile();
  340.             } elseif ($buildingDocument->getName() == "file8") {
  341.                 $pictures8 $buildingDocument->getImageFile();
  342.             } else {
  343.                 $pictures1 $buildingDocument->getImageFile();
  344.             }
  345.         }
  346.         if ($form->isSubmitted() && !$form->isValid()) {
  347.             $this->addFlash('error'$translator->trans('notice.error'));
  348.         }
  349.         if ($form->isSubmitted() && $form->isValid()) {
  350.             foreach ($building->getBuildingDocuments() as $buildingDocument) {
  351.                 if (strpos($buildingDocument->getName(), "imagesComplexe") === 0) {
  352.                     $buildingDocument->setComplexPropertyId($complexPropertyId);
  353.                 }
  354.                 if (strpos($buildingDocument->getName(), "base") === 0) {
  355.                     $buildingDocument->setComplexPropertyId($complexPropertyId);
  356.                 }
  357.                 if (strpos($buildingDocument->getName(), "file") === 0) {
  358.                     $buildingDocument->setComplexPropertyId($complexPropertyId);
  359.                 }
  360.             }
  361.             $this->entityManager->persist($buildingDocument);
  362.             $this->entityManager->flush();
  363.             $cityEntity $form->get('city')->getData();
  364.             $postalCode $form->get('postalCode')->getData();
  365.             $city $cityRepository->findOneBy(['city' => $cityEntity'postalCode' => $postalCode]);
  366.             $building->setCityEntity($city);
  367.             $this->removeBuildingEquipment($building);
  368.             $this->saveFileWithForm($form$building);
  369.             $this->saveEquipment($form->get('interior')->getData(), $building);
  370.             if ($form->get('exterior')->getData()) {
  371.                 $this->saveEquipment($form->get('exterior')->getData(), $building);
  372.             }
  373.             $building->setRent($building->getRent() * 100);
  374.             $building->setSecurityDeposit($building->getSecurityDeposit() * 100);
  375.             $building->setExpenses($building->getExpenses() * 100);
  376.             $building->setIsEnd(true);
  377.             $this->entityManager->persist($building);
  378.             $this->entityManager->flush();
  379.             foreach ($building->getBuildingDocuments() as $buildingDocument) {
  380.                 if (strpos($buildingDocument->getName(), "imagesComplexe") === 0) {
  381.                     $buildingDocument->setComplexPropertyId($complexPropertyId);
  382.                 }
  383.                 if (strpos($buildingDocument->getName(), "base") === 0) {
  384.                     $buildingDocument->setComplexPropertyId($complexPropertyId);
  385.                 }
  386.                 if (strpos($buildingDocument->getName(), "file") === 0) {
  387.                     $buildingDocument->setComplexPropertyId($complexPropertyId);
  388.                 }
  389.             }
  390.             if ($building->getComplexProperty()) {
  391.                 $buildingDocuments $building->getBuildingDocuments();
  392.                 $buildingsInComplex $this->buildingRepository->findByComplexPropertyId($building->getComplexPropertyId());
  393.                 foreach ($buildingsInComplex as $complexBuilding) {
  394.                     $complexBuilding->getBuildingDocuments()->initialize();
  395.                     foreach ($buildingDocuments as $buildingDocument) {
  396.                         if (strpos($buildingDocument->getName(), "imagesComplexe") === 0) {
  397.                             $documentExists false;
  398.                             foreach ($complexBuilding->getBuildingDocuments() as $complexBuildingDocument) {
  399.                                 if ($complexBuildingDocument->getName() === $buildingDocument->getName()) {
  400.                                     $complexBuildingDocument->setImageFile($buildingDocument->getImageFile());
  401.                                     $documentExists true;
  402.                                     break;
  403.                                 }
  404.                             }
  405.                             if (!$documentExists) {
  406.                                 $newDocument = new BuildingDocument();
  407.                                 $fileName pathinfo($buildingDocument->getImageFile(), PATHINFO_BASENAME);
  408.                                 $newDocument->setName($buildingDocument->getName());
  409.                                 $newDocument->setImageFile($fileName);
  410.                                 $newDocument->setBuilding($complexBuilding);
  411.                                 $newDocument->setComplexPropertyId($complexBuilding->getComplexPropertyId());
  412.                                 $this->entityManager->persist($newDocument);
  413.                             }
  414.                         }
  415.                     }
  416.                     $this->entityManager->persist($complexBuilding);
  417.                     $this->entityManager->flush();
  418.                 }
  419.             }
  420.             $this->entityManager->persist($buildingDocument);
  421.             $this->entityManager->flush();
  422.             $this->addFlash('notice'$translator->trans('notice.validModif'));
  423.             return $this->redirectToRoute('detail_building', ['id' => $building->getId()]);
  424.         }
  425.         return $this->render('building/edit.html.twig', [
  426.             'building' => $building,
  427.             'form' => $form->createView(),
  428.             'cities' => $cities,
  429.             'liked' => false,
  430.             'equipments' => $equipments,
  431.             'pictures1' => $pictures1,
  432.             'pictures2' => $pictures2,
  433.             'pictures3' => $pictures3,
  434.             'pictures4' => $pictures4,
  435.             'pictures5' => $pictures5,
  436.             'pictures6' => $pictures6,
  437.             'pictures7' => $pictures7,
  438.             'pictures8' => $pictures8,
  439.         ]);
  440.     }
  441.     public function saveEquipment(array $equipmentsBuilding $building)
  442.     {
  443.         if (!empty($equipments)) {
  444.             foreach ($equipments as $equipment) {
  445.                 $buildingEquipment = new BuildingEquipment();
  446.                 $buildingEquipment->setBuilding($building)
  447.                     ->setName($equipment)
  448.                     ->setValue(1)
  449.                     ->setResidence(null);
  450.                 $building->addBuildingEquipment($buildingEquipment);
  451.                 $this->entityManager->persist($buildingEquipment);
  452.             }
  453.         }
  454.     }
  455.     public function saveFileWithForm($form$building)
  456.     {
  457.         $files $this->formFilesToArray($form);
  458.         foreach ($files as $key => $file) {
  459.             if ($file) {
  460.                 foreach ($building->getBuildingDocuments() as $buildingDocument) {
  461.                     if ($buildingDocument->getName() === $key || ($buildingDocument->getName() == "base" && $key == "file1")) {
  462.                         // Supprimer l'ancienne photo
  463.                         $building->removeBuildingDocument($buildingDocument);
  464.                         $this->entityManager->remove($buildingDocument);
  465.                     }
  466.                 }
  467.                 $this->entityManager->flush();
  468.                 $fileName $this->generateUniqueFileName() . '.' $file->guessExtension();
  469.                 $file->move(
  470.                     $this->getParameter('building_directory'),
  471.                     $fileName
  472.                 );
  473.                 $buildingDocument = new BuildingDocument();
  474.                 if ($key === "houseRules") {
  475.                     $buildingDocument->setName("houseRules");
  476.                 } else {
  477.                     $buildingDocument->setName($key);
  478.                 }
  479.                 $buildingDocument->setBuilding($building)
  480.                     ->setImageFile($fileName);
  481.                 $building->addBuildingDocument($buildingDocument);
  482.                 $this->entityManager->persist($buildingDocument);
  483.             }
  484.         }
  485.     }
  486.     public function formFilesToArray($form): array
  487.     {
  488.         $files = [];
  489.         foreach ($form->all() as $key => $value) {
  490.             if ($value->getConfig()->getType()->getBlockPrefix() === 'file') {
  491.                 $files[$key] = $value->getData();
  492.             }
  493.         }
  494.         return $files;
  495.     }
  496.     private function generateUniqueFileName(): string
  497.     {
  498.         return md5(uniqid());
  499.     }
  500.     private function removeBuildingEquipment(Building $building)
  501.     {
  502.         foreach ($building->getBuildingEquipment() as $buildingEquipment) {
  503.             $this->entityManager->remove($buildingEquipment);
  504.         }
  505.         $this->entityManager->flush();
  506.     }
  507.     /**
  508.      * @Route("/cities/search", name="cities_search")
  509.      */
  510.     public function searchAction(Request $requestCityRepository $cityRepository): JsonResponse
  511.     {
  512.         $q $request->query->get('term'); // use "term" for jQuery UI
  513.         $limit $request->query->get('limit');
  514.         $cities $cityRepository
  515.             ->findByTerm($q$limit);
  516.         $formattedCities = [];
  517.         foreach ($cities as $city) {
  518.             $formattedCities[] = [
  519.                 'label' => $city->getCity(),
  520.                 'postalCode' => $city->getPostalCode(),
  521.                 'value' => $city->getId()
  522.             ];
  523.         }
  524.         return new JsonResponse($formattedCities);
  525.     }
  526.     private function checkUserExist()
  527.     {
  528.         if (is_null($this->getUser())) {
  529.             return $this->redirectToRoute('app_login_site');
  530.         }
  531.     }
  532.     private function CheckUserPerm($building)
  533.     {
  534.         $this->checkUserExist();
  535.         if (!in_array("ROLE_ADMIN"$this->getUser()->getRoles())) {
  536.             if ($building->getPropertyManager() != $this->getUser()) {
  537.                 throw $this->createNotFoundException('not good user');
  538.             }
  539.         }
  540.     }
  541.     public function toggleFavorite(Request $request$id): JsonResponse
  542. {
  543.     $user $this->getUser();
  544.     $building $this->getDoctrine()->getRepository(Building::class)->find($id);
  545.     if (!$user || !$building) {
  546.         return new JsonResponse(['message' => 'Erreur'], 400);
  547.     }
  548.     $isFavorite $user->getFavorites()->contains($building);
  549.     
  550.     if ($isFavorite) {
  551.         $user->removeFavorite($building);
  552.         $message 'building.retirefav';
  553.     } else {
  554.         $user->addFavorite($building);
  555.         $message 'building.ajoutfav';
  556.     }
  557.     $this->getDoctrine()->getManager()->flush();
  558.     return new JsonResponse([
  559.         'message' => $message,
  560.         'isFavorite' => !$isFavorite // Renvoie le nouvel état
  561.     ]);
  562. }
  563. }