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.     // dd($building->getPropertyManager()->getId());
  134.     return $this->render('building/index.html.twig', [
  135.         'building' => $building,
  136.         'canRequestVisio' => $canRequestVisio,
  137.         'liked' => $liked,
  138.         'allow' => $allowEdit,
  139.         'documents' => $documents,
  140.         'certificate' => $housingCertificate,
  141.         'buildingsInComplex' => $buildingsInComplex,
  142.         'lowestRent' => $lowestRent,
  143.         'earlyLocation' => $earlyLocation,
  144.         'similarProperties' => $similarProperties,
  145.         'user' => $currentUser,
  146.         'lastViewedBuildings' => $lastViewedBuildings ?? [],
  147.         'currentBuildingId' => $currentBuildingId// Pass currentBuildingId to the template
  148.     ]);
  149. }
  150.     #[Route(path: ["fr" => "/residence/{id}""en" => "/en/residence/{id}"], name'detail_residence')]
  151.     public function indexResidence(Residence $residence)
  152.     {
  153.         $currentUser $this->getUser();
  154.         return $this->render('residence/index.html.twig', [
  155.             'residence' => $residence,
  156.             'user' => $currentUser,
  157.         ]);
  158.     }
  159.     #[Route(path: ["fr" => "/building/{id}/wantedVisio""en" => "/en/building/{id}/wantedVisio"], name'wanted_visio_building')]
  160.     public function createWantedVisio(Building $buildingRequest $requestMails $mailsUrlGeneratorInterface $urlGeneratorTranslatorInterface $translator)
  161.     {
  162.         if (!$this->getUser()) {
  163.             return $this->redirectToRoute('app_login_site');
  164.         }
  165.         $email $mails->createEmail('mails/building/visio.html.twig', ["user" => $this->getUser(), "url" => $urlGenerator->generate('detail_building', ['id' => $building->getId()], UrlGeneratorInterface::ABSOLUTE_URL)])
  166.             ->to($building->getPropertyManager()->getEmail())
  167.             ->subject('Demande de visite en visio');
  168.         $mails->send($email);
  169.         $wantedVisio = new WantedVisio();
  170.         $wantedVisio->setRequester($this->getUser())
  171.             ->setBuilding($building)
  172.             ->setCreatedAt(new \DateTimeImmutable('now', new \DateTimeZone('Europe/Paris')));
  173.         $this->entityManager->persist($wantedVisio);
  174.         $this->entityManager->flush();
  175.         $this->addFlash('notice'$translator->trans('notice.notilbailleur'));
  176.         $currentUser $this->getUser();
  177.         return $this->redirectToRoute('detail_building', ['id' => $building->getId()]);
  178.     }
  179.     #[Route(path: ["fr" => "/building/add/bailleur""en" => "/en/building/add/bailleur"], name'add_building_bailleur')]
  180.     public function addBuilding(Request $requestSessionInterface $sessionCityRepository $cityRepositoryTranslatorInterface $translator): \Symfony\Component\HttpFoundation\Response
  181.     {
  182.         if (!$this->authService->checkUserIsConnected($this->getUser())) {
  183.             return $this->redirectToRoute('app_login_site');
  184.         }
  185.         if (!in_array(User::LESSOR$this->getUser()->getRoles()) && !in_array(User::ADMIN$this->getUser()->getRoles()) && !in_array(User::RESIDENT$this->getUser()->getRoles())) {
  186.             throw $this->createNotFoundException('not good roles');
  187.         }
  188.         $building = new Building();
  189.         $cities = [];
  190.         $citiesForm = [];
  191.         $citiesData $cityRepository->findAll();
  192.         foreach ($citiesData as $city) {
  193.             $cities[] = $city->getCityName();
  194.             $citiesForm[] = $city->getCity() . "," $city->getPostalCode();
  195.         }
  196.         $form $this->createForm(BuildingAddFormType::class, $building, ['cities' => $citiesForm]);
  197.         $form->handleRequest($request);
  198.         if ($form->isSubmitted() && $form->isValid()) {
  199.             $cityEntity $form->get('cityEntity')->getData();
  200.             if (is_null($form->get('minIncome')->getData())) {
  201.                 $rent $form->get('rent')->getData();
  202.                 $building->setMinIncome($rent 100);
  203.             }
  204.             $arrayCity explode(','$cityEntity);
  205.             $city $arrayCity[0];
  206.             $streetNumber $form->get('streetNumber')->getData();
  207.             $street $form->get('street')->getData();
  208.             if (count($arrayCity) <= 1) {
  209.                 $postalCode "";
  210.                 $dataGoogleMap $this->googleMapsService->geocodeAddress(
  211.                     $streetNumber " " $street ", " $city
  212.                 );
  213.                 $cityEntity $cityRepository->findOneBy(['name' => $city]);
  214.                 if ($cityEntity) {
  215.                     $building->setCityEntity($cityEntity);
  216.                 }
  217.                 foreach ($dataGoogleMap['0']['address_components'] as $component) {
  218.                     if (in_array("postal_code"$component['types'])) {
  219.                         $postalCode $component['long_name'];
  220.                     }
  221.                 }
  222.             } else {
  223.                 $postalCode $arrayCity[1];
  224.             }
  225.             $building->setPostalCode($postalCode);
  226.             $city $cityRepository->findOneBy(['city' => $city'postalCode' => $postalCode]);
  227.             $building->setCityEntity($city);
  228.             $building->setIsActive(true);
  229.             $building->setIsBlocked(false);
  230.             $building->setIsEnd(true);
  231.             $uniqueId $this->generateUniqueFileName();
  232.             $building->setUniqueId($uniqueId);
  233.             $building->setPropertyManager($this->getUser());
  234.             $building->setRent($building->getRent() * 100);
  235.             $building->setSecurityDeposit($building->getSecurityDeposit() * 100);
  236.             $building->setExpenses($building->getExpenses() * 100);
  237.             $this->entityManager->persist($building);
  238.             $this->entityManager->flush();
  239.             $persistedBuilding $this->buildingRepository->findOneBy(['uniqueId' => $building->getUniqueId()]);
  240.             $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)));
  241.             $this->saveFileWithForm($form$building);
  242.             $this->saveEquipment($form->get('interior')->getData(), $building);
  243.             if ($form->get('exterior')->getData()) {
  244.                 $this->saveEquipment($form->get('exterior')->getData(), $building);
  245.             }
  246.             $this->entityManager->persist($building);
  247.             $this->entityManager->flush();
  248.             $persistedBuilding $this->buildingRepository->findOneBy(['uniqueId' => $building->getUniqueId()]);
  249.             $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)));
  250.             $this->entityManager->persist($building);
  251.             $this->entityManager->flush();
  252.             $this->addFlash('notice'$translator->trans('notice.ajoutBien'));
  253.             $currentUser $this->getUser();
  254.             return $this->redirectToRoute('building_edit', ['id' => $persistedBuilding->getId()]);
  255.         } elseif ($form->isSubmitted()) {
  256.             return $this->render('building/add.html.twig', [
  257.                 'form' => $form->createView(),
  258.                 'cities' => $cities,
  259.                 'user' => $currentUser,
  260.             ]);
  261.         }
  262.         return $this->render('building/add.html.twig', [
  263.             'form' => $form->createView(),
  264.             'cities' => $cities,
  265.             'user' => $currentUser,
  266.         ]);
  267.     }
  268.     #[Route(path: ["fr" => "/building/{id}/validation""en" => "/en/building/{id}/validation"], name'detail_building_before_validation')]
  269.     public function detailBuildingBeforeValidation(Building $building)
  270.     {
  271.         if (!$this->authService->checkUserIsConnected($this->getUser())) {
  272.             return $this->redirectToRoute('app_login_site');
  273.         }
  274.         $this->CheckUserPerm($building);
  275.         $currentUser $this->getUser();
  276.         return $this->render('building/detail_before_validation.html.twig', [
  277.             'building' => $building,
  278.             'user' => $currentUser,
  279.         ]);
  280.     }
  281.     #[Route(path: ["fr" => "/building/{id}/validate""en" => "/en/building/{id}/validate"], name'validate_building')]
  282.     public function validateBuilding(Building $building)
  283.     {
  284.         if (!$this->authService->checkUserIsConnected($this->getUser())) {
  285.             return $this->redirectToRoute('app_login_site');
  286.         }
  287.         $this->CheckUserPerm($building);
  288.         $building->setIsActive(true);
  289.         $building->setIsEnd(true);
  290.         $this->entityManager->persist($building);
  291.         $this->entityManager->flush();
  292.         $currentUser $this->getUser();
  293.         return $this->redirectToRoute('detail_building', ['id' => $building->getId()]);
  294.     }
  295.     #[Route(path: ["fr" => "/building/{id}/edit""en" => "/en/building/{id}/edit"], name'building_edit')]
  296.     public function editBuilding(Building $buildingRequest $requestCityRepository $cityRepositoryTranslatorInterface $translator)
  297.     {
  298.         if (!$this->authService->checkUserIsConnected($this->getUser())) {
  299.             return $this->redirectToRoute('app_login_site');
  300.         }
  301.         $this->CheckUserPerm($building);
  302.         $cities = [];
  303.         $citiesData $cityRepository->findAll();
  304.         foreach ($citiesData as $city) {
  305.             $cities[] = $city->getCityName();
  306.         }
  307.         $complexPropertyId $building->getComplexPropertyId();
  308.         $building->setRent($building->getRent() / 100);
  309.         $building->setSecurityDeposit($building->getSecurityDeposit() / 100);
  310.         $building->setExpenses($building->getExpenses() / 100);
  311.         $form $this->createForm(BuildingEditFormType::class, $building);
  312.         $equipments = [];
  313.         foreach ($building->getBuildingEquipment() as $buildingEquipment) {
  314.             $equipments[] = $buildingEquipment->getName();
  315.         }
  316.         $form->handleRequest($request);
  317.         $pictures1 false;
  318.         $pictures2 false;
  319.         $pictures3 false;
  320.         $pictures4 false;
  321.         $pictures5 false;
  322.         $pictures6 false;
  323.         $pictures7 false;
  324.         $pictures8 false;
  325.         foreach ($building->getBuildingDocuments() as $buildingDocument) {
  326.             if ($buildingDocument->getName() == "base") {
  327.                 // Supprimer la photo de base
  328.                 //$this->entityManager->remove($buildingDocument);
  329.             } elseif ($buildingDocument->getName() == "file2") {
  330.                 $pictures2 $buildingDocument->getImageFile();
  331.             } elseif ($buildingDocument->getName() == "file3") {
  332.                 $pictures3 $buildingDocument->getImageFile();
  333.             } elseif ($buildingDocument->getName() == "file4") {
  334.                 $pictures4 $buildingDocument->getImageFile();
  335.             } elseif ($buildingDocument->getName() == "file5") {
  336.                 $pictures5 $buildingDocument->getImageFile();
  337.             } elseif ($buildingDocument->getName() == "file6") {
  338.                 $pictures6 $buildingDocument->getImageFile();
  339.             } elseif ($buildingDocument->getName() == "file7") {
  340.                 $pictures7 $buildingDocument->getImageFile();
  341.             } elseif ($buildingDocument->getName() == "file8") {
  342.                 $pictures8 $buildingDocument->getImageFile();
  343.             } else {
  344.                 $pictures1 $buildingDocument->getImageFile();
  345.             }
  346.         }
  347.         if ($form->isSubmitted() && !$form->isValid()) {
  348.             $this->addFlash('error'$translator->trans('notice.error'));
  349.         }
  350.         if ($form->isSubmitted() && $form->isValid()) {
  351.             foreach ($building->getBuildingDocuments() as $buildingDocument) {
  352.                 if (strpos($buildingDocument->getName(), "imagesComplexe") === 0) {
  353.                     $buildingDocument->setComplexPropertyId($complexPropertyId);
  354.                 }
  355.                 if (strpos($buildingDocument->getName(), "base") === 0) {
  356.                     $buildingDocument->setComplexPropertyId($complexPropertyId);
  357.                 }
  358.                 if (strpos($buildingDocument->getName(), "file") === 0) {
  359.                     $buildingDocument->setComplexPropertyId($complexPropertyId);
  360.                 }
  361.             }
  362.             $this->entityManager->persist($buildingDocument);
  363.             $this->entityManager->flush();
  364.             $cityEntity $form->get('city')->getData();
  365.             $postalCode $form->get('postalCode')->getData();
  366.             $city $cityRepository->findOneBy(['city' => $cityEntity'postalCode' => $postalCode]);
  367.             $building->setCityEntity($city);
  368.             $this->removeBuildingEquipment($building);
  369.             $this->saveFileWithForm($form$building);
  370.             $this->saveEquipment($form->get('interior')->getData(), $building);
  371.             if ($form->get('exterior')->getData()) {
  372.                 $this->saveEquipment($form->get('exterior')->getData(), $building);
  373.             }
  374.             $building->setRent($building->getRent() * 100);
  375.             $building->setSecurityDeposit($building->getSecurityDeposit() * 100);
  376.             $building->setExpenses($building->getExpenses() * 100);
  377.             $building->setIsEnd(true);
  378.             $this->entityManager->persist($building);
  379.             $this->entityManager->flush();
  380.             foreach ($building->getBuildingDocuments() as $buildingDocument) {
  381.                 if (strpos($buildingDocument->getName(), "imagesComplexe") === 0) {
  382.                     $buildingDocument->setComplexPropertyId($complexPropertyId);
  383.                 }
  384.                 if (strpos($buildingDocument->getName(), "base") === 0) {
  385.                     $buildingDocument->setComplexPropertyId($complexPropertyId);
  386.                 }
  387.                 if (strpos($buildingDocument->getName(), "file") === 0) {
  388.                     $buildingDocument->setComplexPropertyId($complexPropertyId);
  389.                 }
  390.             }
  391.             if ($building->getComplexProperty()) {
  392.                 $buildingDocuments $building->getBuildingDocuments();
  393.                 $buildingsInComplex $this->buildingRepository->findByComplexPropertyId($building->getComplexPropertyId());
  394.                 foreach ($buildingsInComplex as $complexBuilding) {
  395.                     $complexBuilding->getBuildingDocuments()->initialize();
  396.                     foreach ($buildingDocuments as $buildingDocument) {
  397.                         if (strpos($buildingDocument->getName(), "imagesComplexe") === 0) {
  398.                             $documentExists false;
  399.                             foreach ($complexBuilding->getBuildingDocuments() as $complexBuildingDocument) {
  400.                                 if ($complexBuildingDocument->getName() === $buildingDocument->getName()) {
  401.                                     $complexBuildingDocument->setImageFile($buildingDocument->getImageFile());
  402.                                     $documentExists true;
  403.                                     break;
  404.                                 }
  405.                             }
  406.                             if (!$documentExists) {
  407.                                 $newDocument = new BuildingDocument();
  408.                                 $fileName pathinfo($buildingDocument->getImageFile(), PATHINFO_BASENAME);
  409.                                 $newDocument->setName($buildingDocument->getName());
  410.                                 $newDocument->setImageFile($fileName);
  411.                                 $newDocument->setBuilding($complexBuilding);
  412.                                 $newDocument->setComplexPropertyId($complexBuilding->getComplexPropertyId());
  413.                                 $this->entityManager->persist($newDocument);
  414.                             }
  415.                         }
  416.                     }
  417.                     $this->entityManager->persist($complexBuilding);
  418.                     $this->entityManager->flush();
  419.                 }
  420.             }
  421.             $this->entityManager->persist($buildingDocument);
  422.             $this->entityManager->flush();
  423.             $this->addFlash('notice'$translator->trans('notice.validModif'));
  424.             return $this->redirectToRoute('detail_building', ['id' => $building->getId()]);
  425.         }
  426.         return $this->render('building/edit.html.twig', [
  427.             'building' => $building,
  428.             'form' => $form->createView(),
  429.             'cities' => $cities,
  430.             'liked' => false,
  431.             'equipments' => $equipments,
  432.             'pictures1' => $pictures1,
  433.             'pictures2' => $pictures2,
  434.             'pictures3' => $pictures3,
  435.             'pictures4' => $pictures4,
  436.             'pictures5' => $pictures5,
  437.             'pictures6' => $pictures6,
  438.             'pictures7' => $pictures7,
  439.             'pictures8' => $pictures8,
  440.         ]);
  441.     }
  442.     public function saveEquipment(array $equipmentsBuilding $building)
  443.     {
  444.         if (!empty($equipments)) {
  445.             foreach ($equipments as $equipment) {
  446.                 $buildingEquipment = new BuildingEquipment();
  447.                 $buildingEquipment->setBuilding($building)
  448.                     ->setName($equipment)
  449.                     ->setValue(1)
  450.                     ->setResidence(null);
  451.                 $building->addBuildingEquipment($buildingEquipment);
  452.                 $this->entityManager->persist($buildingEquipment);
  453.             }
  454.         }
  455.     }
  456.     public function saveFileWithForm($form$building)
  457.     {
  458.         $files $this->formFilesToArray($form);
  459.         foreach ($files as $key => $file) {
  460.             if ($file) {
  461.                 foreach ($building->getBuildingDocuments() as $buildingDocument) {
  462.                     if ($buildingDocument->getName() === $key || ($buildingDocument->getName() == "base" && $key == "file1")) {
  463.                         // Supprimer l'ancienne photo
  464.                         $building->removeBuildingDocument($buildingDocument);
  465.                         $this->entityManager->remove($buildingDocument);
  466.                     }
  467.                 }
  468.                 $this->entityManager->flush();
  469.                 $fileName $this->generateUniqueFileName() . '.' $file->guessExtension();
  470.                 $file->move(
  471.                     $this->getParameter('building_directory'),
  472.                     $fileName
  473.                 );
  474.                 $buildingDocument = new BuildingDocument();
  475.                 if ($key === "houseRules") {
  476.                     $buildingDocument->setName("houseRules");
  477.                 } else {
  478.                     $buildingDocument->setName($key);
  479.                 }
  480.                 $buildingDocument->setBuilding($building)
  481.                     ->setImageFile($fileName);
  482.                 $building->addBuildingDocument($buildingDocument);
  483.                 $this->entityManager->persist($buildingDocument);
  484.             }
  485.         }
  486.     }
  487.     public function formFilesToArray($form): array
  488.     {
  489.         $files = [];
  490.         foreach ($form->all() as $key => $value) {
  491.             if ($value->getConfig()->getType()->getBlockPrefix() === 'file') {
  492.                 $files[$key] = $value->getData();
  493.             }
  494.         }
  495.         return $files;
  496.     }
  497.     private function generateUniqueFileName(): string
  498.     {
  499.         return md5(uniqid());
  500.     }
  501.     private function removeBuildingEquipment(Building $building)
  502.     {
  503.         foreach ($building->getBuildingEquipment() as $buildingEquipment) {
  504.             $this->entityManager->remove($buildingEquipment);
  505.         }
  506.         $this->entityManager->flush();
  507.     }
  508.     /**
  509.      * @Route("/cities/search", name="cities_search")
  510.      */
  511.     public function searchAction(Request $requestCityRepository $cityRepository): JsonResponse
  512.     {
  513.         $q $request->query->get('term'); // use "term" for jQuery UI
  514.         $limit $request->query->get('limit');
  515.         $cities $cityRepository
  516.             ->findByTerm($q$limit);
  517.         $formattedCities = [];
  518.         foreach ($cities as $city) {
  519.             $formattedCities[] = [
  520.                 'label' => $city->getCity(),
  521.                 'postalCode' => $city->getPostalCode(),
  522.                 'value' => $city->getId()
  523.             ];
  524.         }
  525.         return new JsonResponse($formattedCities);
  526.     }
  527.     private function checkUserExist()
  528.     {
  529.         if (is_null($this->getUser())) {
  530.             return $this->redirectToRoute('app_login_site');
  531.         }
  532.     }
  533.     private function CheckUserPerm($building)
  534.     {
  535.         $this->checkUserExist();
  536.         if (!in_array("ROLE_ADMIN"$this->getUser()->getRoles())) {
  537.             if ($building->getPropertyManager() != $this->getUser()) {
  538.                 throw $this->createNotFoundException('not good user');
  539.             }
  540.         }
  541.     }
  542.     public function toggleFavorite(Request $request$id): JsonResponse
  543. {
  544.     $user $this->getUser();
  545.     $building $this->getDoctrine()->getRepository(Building::class)->find($id);
  546.     if (!$user || !$building) {
  547.         return new JsonResponse(['message' => 'Erreur'], 400);
  548.     }
  549.     $isFavorite $user->getFavorites()->contains($building);
  550.     
  551.     if ($isFavorite) {
  552.         $user->removeFavorite($building);
  553.         $message 'building.retirefav';
  554.     } else {
  555.         $user->addFavorite($building);
  556.         $message 'building.ajoutfav';
  557.     }
  558.     $this->getDoctrine()->getManager()->flush();
  559.     return new JsonResponse([
  560.         'message' => $message,
  561.         'isFavorite' => !$isFavorite // Renvoie le nouvel état
  562.     ]);
  563. }
  564. }