src/Controller/ImmeubleController.php line 107

  1. <?php
  2. namespace App\Controller;
  3. use App\Entity\Articles;
  4. use App\Entity\Categories;
  5. use App\Entity\Images;
  6. use App\Entity\Immeubles;
  7. use App\Entity\ImmeubleVariable;
  8. use App\Repository\ArticlesRepository;
  9. use App\Repository\BoutiquesRepository;
  10. use App\Repository\CategoriesRepository;
  11. use App\Repository\ImagesRepository;
  12. use App\Repository\ImmeublesRepository;
  13. use App\Repository\QuartiersRepository;
  14. use App\Repository\UserRepository;
  15. use App\Repository\VariableConstantsRepository;
  16. use App\Repository\VariablesRepository;
  17. use App\Repository\VillesRepository;
  18. use App\services\ImageOptimizer;
  19. use Doctrine\ORM\EntityManagerInterface;
  20. use JetBrains\PhpStorm\Immutable;
  21. use Knp\Component\Pager\PaginatorInterface;
  22. use phpDocumentor\Reflection\Types\Boolean;
  23. use Symfony\Bundle\FrameworkBundle\Controller\AbstractController;
  24. use Symfony\Component\HttpFoundation\File\Exception\FileException;
  25. use Symfony\Component\HttpFoundation\Request;
  26. use Symfony\Component\HttpFoundation\Response;
  27. use Symfony\Component\Notifier\Notification\Notification;
  28. use Symfony\Component\Notifier\NotifierInterface;
  29. use Symfony\Component\Routing\Annotation\Route;
  30. #[Route('/immeuble'name'app_immeuble')]
  31. class ImmeubleController extends AbstractController
  32. {
  33.     private CategoriesRepository $categoriesRepository;
  34.     private VariablesRepository $variablesRepository ;
  35.     private VariableConstantsRepository $variableConstantsRepository;
  36.     private VillesRepository $villesRepository ;
  37.     private QuartiersRepository $quartiersRepository ;
  38.     private ImmeublesRepository $immeublesRepository ;
  39.     private UserRepository $userRepository ;
  40.     private ImagesRepository $imagesRepository;
  41.     private ImageOptimizer $imageOptimizer ;
  42.     private BoutiquesRepository $boutiqueRepository;
  43.     /**
  44.      * @param CategoriesRepository $categoriesRepository
  45.      * @param VariablesRepository $variablesRepository
  46.      * @param VariableConstantsRepository $variableConstantsRepository
  47.      * @param VillesRepository $villesRepository
  48.      * @param QuartiersRepository $quartiersRepository
  49.      * @param ImmeublesRepository $immeublesRepository
  50.      * @param UserRepository $userRepository
  51.      * @param ImagesRepository $imagesRepository
  52.      */
  53.     public function __construct(CategoriesRepository $categoriesRepositoryVariablesRepository $variablesRepository,
  54.                                 VariableConstantsRepository $variableConstantsRepositoryVillesRepository $villesRepository,
  55.                                 QuartiersRepository $quartiersRepositoryImmeublesRepository $immeublesRepository,
  56.                                 UserRepository $userRepositoryImagesRepository $imagesRepositoryImageOptimizer $imageOptimizerBoutiquesRepository $boutiqueRepository)
  57.     {
  58.         $this->categoriesRepository $categoriesRepository;
  59.         $this->variablesRepository $variablesRepository;
  60.         $this->variableConstantsRepository $variableConstantsRepository;
  61.         $this->villesRepository $villesRepository;
  62.         $this->quartiersRepository $quartiersRepository;
  63.         $this->immeublesRepository $immeublesRepository;
  64.         $this->userRepository $userRepository;
  65.         $this->ImagesRepository $imagesRepository;
  66.         $this->imageOptimizer $imageOptimizer;
  67.         $this->boutiqueRepository $boutiqueRepository;
  68.     }
  69.     #[Route('/'name'index')]
  70.     public function index(Request $requestPaginatorInterface $paginator): Response
  71.     {
  72.         $search false ;
  73.         $donnees=[];
  74.         $lastImmeubles $this->immeublesRepository->findBy(["status"=> UtilsFunctions::PUBLICATION_STATUS], ["pubDate"=>"DESC"],6);
  75.         if($request->isMethod("POST")){
  76.             $search true ;
  77.             $categs $_POST["categs"] ?? null;
  78.             $villes $_POST["villes"] ?? null;
  79.             $quartiers $_POST["quartiers"] ?? null;
  80.             $res=  $this->immeublesRepository->searchImmeuble($request,$villes$quartiers$categs);
  81.             foreach ($res as $key=>$value){
  82.                 $donnees[] = $this->convertToImmeuble($value);
  83.             }
  84.         }else{
  85.             $donnees $this->immeublesRepository->findBy(["status"=> UtilsFunctions::PUBLICATION_STATUS], ["pubDate"=>"DESC",], 1000);
  86.         }
  87.         $immeubles=null;
  88.         if(count($donnees) > 0){
  89.             $immeubles $paginator->paginate(
  90.                 $donnees,
  91.                 $request->query->getInt('page'1),15);
  92.         }
  93.         return $this->render('immeuble/index.html.twig', [
  94.             'immeubles' => $immeubles,
  95.             'lastImmeubles'=> $lastImmeubles,
  96.             'search'=> $search 
  97.         ]);
  98.     }
  99.     #[Route('search/{slugCategorie}'name'categorie')]
  100.     public function searchByCategorie(Request $requestPaginatorInterface $paginator$slugCategorie): Response
  101.     {
  102.         $search true ;
  103.         $categories $this->categoriesRepository->findOneBy(["slug"=>trim($slugCategorie)]);
  104.         $donnees=[];
  105.         $searchCategorie $categories ;
  106.         $lastImmeubles $this->immeublesRepository->findBy(["status"=> UtilsFunctions::PUBLICATION_STATUS], ["pubDate"=>"DESC"],6);
  107.         
  108.         if($request->isMethod("POST")){
  109.             $categs $_POST["categs"] ?? null;
  110.             $villes $_POST["villes"] ?? null;
  111.             $quartiers $_POST["quartiers"] ?? null;
  112.             $res=  $this->immeublesRepository->searchImmeuble($request,$villes$quartiers$categs);
  113.             foreach ($res as $key=>$value){
  114.                 $donnees[] = $this->convertToImmeuble($value);
  115.             }
  116.         }else if(UtilsFunctions::IMMO_CODE == $categories->getCode()) {
  117.             $donnees $this->immeublesRepository->findBy([], ["pubDate"=>"DESC",], 1000);
  118.         }else{
  119.             $donnees $this->immeublesRepository->findBy(["categorie"=>$categories], ["pubDate"=>"DESC",], 1000);
  120.         }
  121.         $immeubles=null;
  122.         if(count($donnees) > 0){
  123.             $immeubles $paginator->paginate(
  124.                 $donnees,
  125.                 $request->query->getInt('page'1),15);
  126.         }
  127.         return $this->render('immeuble/index.html.twig', [
  128.             'immeubles' => $immeubles,
  129.             'searchCategorie'=>$searchCategorie,
  130.             'lastImmeubles'=> $lastImmeubles,
  131.             'search'=> $search 
  132.           
  133.         ]);
  134.     }
  135.     #[Route('add'name'add')]
  136.     public function add(Request $request,  EntityManagerInterface $entityManager): Response
  137.     {
  138.         if(!$this->getUser()){
  139.             return $this->redirectToRoute('app_login');
  140.         }
  141.         $categorie $this->categoriesRepository->findOneBy(["code"=>UtilsFunctions::IMMO_CODE]);
  142.         $sousCateg$this->categoriesRepository->findBy(["parent"=>$categorie],["libelle"=>'ASC']);
  143.         $variables $this->variablesRepository->findBy(["Categorie"=>$categorie]);
  144.         $villes =  $this->villesRepository->findAll() ;
  145.         $immeuble = new Immeubles();
  146.         if($request->isMethod("POST") && ($this->isCsrfTokenValid('add-immeuble'$request->request->get('token')))) {
  147.             if(isset($_POST["variableValue"]))
  148.                 $variableValue $_POST["variableValue"];
  149.             $immeuble $this->buildImmeuble($request);
  150.             $photofile $request->files->get("photo");
  151.             $newFilename "";
  152.             $destination "";
  153.             if (!empty($photofile)) {
  154.                 $destination $this->getParameter('kernel.project_dir') . '/public/uploads/immeubles/' trim($immeuble->getCode());
  155.                 $newFilename uniqid() . "-" $immeuble->getCode() . '.' $photofile->guessExtension();
  156.                 $immeuble->setPhoto($newFilename);
  157.             }
  158.             if ($this->immeubleCheck($immeuble)) {
  159.                 try {
  160.                     $photofile->move($destination$newFilename);
  161.                     $this->imageOptimizer->resize($destination.'/'.$newFilename);
  162.                 } catch (FileException $ex) {
  163.                 }
  164.                 $entityManager->persist($immeuble);
  165.                 $entityManager->flush();
  166.                 //save Variable value
  167.                 if(isset($_POST["variableValue"]))
  168.                 foreach($variableValue as $key => $value)
  169.                 {
  170.                     $v =$this->variablesRepository->findOneBy(["code"=>$key]);
  171.                    $immeubleVariable = new ImmeubleVariable();
  172.                    $immeubleVariable->setImmeuble($immeuble);
  173.                    $immeubleVariable->setVariable($v);
  174.                    $immeubleVariable->setValeur($value);
  175.                    $entityManager->persist($immeubleVariable);
  176.                    $entityManager->flush();
  177.                 }
  178.                 return $this->redirectToRoute('app_immeubledetail',['id'=>$immeuble->getId()]);
  179.             }
  180.         }
  181.             return $this->render('immeuble/add.html.twig', [
  182.             'sousCategories' => $sousCateg,
  183.             'variables'=> $variables,
  184.                 'villes'=>$villes
  185.         ]);
  186.     }
  187.     #[Route('detail/{id}'name'detail')]
  188.     public function detail(ImagesRepository $imagesRepositoryImmeubles $immeuble):Response
  189.     {
  190.         return $this->render('immeuble/detail.html.twig', [
  191.             'immeuble' => $immeuble
  192.         ]);
  193.     }
  194.     #[Route('quartier'name'quartier')]
  195.     public function listquatierByville(Request $request,VillesRepository $villesRepositoryQuartiersRepository $quartiersRepository)
  196.     {
  197.             $ouptut= array();
  198.             $idville$request->request->get('id');
  199.             $ville$villesRepository->findBy(["id"=>$idville]);
  200.             $quartiers $quartiersRepository->findBy(["ville"=>$ville]);
  201.            
  202.             foreach($quartiers as $q ){
  203.                 
  204.                array_push($ouptut,array($q->getId(),$q->getNom()));
  205.             }
  206.            
  207.             return  new \Symfony\Component\HttpFoundation\JsonResponse($ouptut);
  208.       
  209.        
  210.     }
  211.     #[Route('detailslug/{slug}'name'detailslug')]
  212.     public function detailSlug(ImagesRepository $imagesRepositoryImmeubles $immeuble):Response
  213.     {
  214.         $immeubles $this->immeublesRepository->findBy(["categorie"=>$immeuble->getCategorie()], ["pubDate"=>"DESC"], 12);
  215.         $boutique $immeuble->getVendeur()->getShop();
  216.         return $this->render('immeuble/public-detail.html.twig', [
  217.             'immeuble' => $immeuble,
  218.             'immeubles'=>$immeubles,
  219.             'boutique'=>$boutique,
  220.         ]);
  221.     }
  222.     #[Route('publier/{id}'name'publication')]
  223.     public function publierImmeuble(ImmeublesRepository $immeublesRepositoryImmeubles $immeublesEntityManagerInterface $entityManager,NotifierInterface $notifier): Response
  224.     {
  225.         if ($immeubles->getId() > 0) {
  226.             $immeubles->setStatus(UtilsFunctions::PUBLICATION_STATUS);
  227.             $immeubles->setPubDate(new \DateTimeImmutable());
  228.             $entityManager->persist($immeubles);
  229.             $entityManager->flush();
  230.             $notifier->send(new Notification("Operation réussie  publication effectuée",['browser']));
  231.         } else {
  232.             return $this->render('errorrs/notfound.html.twig', [
  233.                 'immeuble' => $immeubles
  234.             ]);
  235.         }
  236.         return $this->render('immeuble/detail.html.twig', [
  237.             'immeuble' => $immeubles
  238.         ]);
  239.     }
  240.     #[Route('suspendre/{id}'name'suspension')]
  241.     public function suspendreImmeuble(ImmeublesRepository $immeublesRepository,  Immeubles $immeublesEntityManagerInterface $entityManagerNotifierInterface $notifier): Response{
  242.         if($immeubles->getId() > 0){
  243.             $immeubles->setStatus(UtilsFunctions::NO_PUBLICATION_STATUS);
  244.             $immeubles->setPubDate(new \DateTimeImmutable());
  245.             $entityManager->persist($immeubles);
  246.             $entityManager->flush();
  247.             $notifier->send(new Notification("Operation réussie  l'immeuble est suspendu",['browser']));
  248.         }else{
  249.             return $this->render('errorrs/notfound.html.twig', [
  250.                 'immeubles' => $immeubles
  251.             ]);
  252.         }
  253.         return $this->render('vehicule/detail.html.twig', [
  254.             'immeubles' => $immeubles
  255.         ]);
  256.     }
  257.     #[Route('delete/{id}'name'supprimer')]
  258.     public function supprimerImmeuble(ImmeublesRepository $immeublesRepositoryImmeubles $immeublesEntityManagerInterface $entityManager): Response{
  259.         if($immeubles->getId() > 0){
  260.             $immeubles->setStatus(UtilsFunctions::DELETE_STATUS);
  261.             $entityManager->persist($immeubles);
  262.             $entityManager->flush();
  263.         }else{
  264.             return $this->render('errorrs/notfound.html.twig', [
  265.                 'immeubles' => $immeubles
  266.             ]);
  267.         }
  268.         return $this->redirectToRoute('app_vendor_home_index');
  269.     }
  270.     #[Route('image/{id}'name'addimage')]
  271.     public function addImage(Request $request,  EntityManagerInterface $entityManager,ImmeublesRepository $immeublesRepositoryImmeubles $immeubles){
  272.         if($request->isMethod("POST") && ($this->isCsrfTokenValid('add-immeuble'$request->request->get('token')))) {
  273.             $immeublesId $request->request->get('id');
  274.             $immeubleForImage $immeublesRepository->find($immeublesId);
  275.             $image1 $request->files->get("image1");
  276.             $image2 $request->files->get("image2");
  277.             $image3 $request->files->get("image3");
  278.             $image4 $request->files->get("image4");
  279.             $this->deleteOldImage($immeubleForImage);
  280.             $this->saveImage($immeubleForImage,$image1$entityManager);
  281.             $this->saveImage($immeubleForImage,$image2,$entityManager);
  282.             $this->saveImage($immeubleForImage,$image3$entityManager);
  283.             $this->saveImage($immeubleForImage,$image4$entityManager);
  284.             return $this->redirectToRoute('app_immeubledetail',['id'=>$immeublesId]);
  285.         }
  286.         return $this->render('immeuble/add-image.html.twig', [
  287.             'immeuble' => $immeubles
  288.         ]);
  289.     }
  290.     public function saveImage(Immeubles $immeuble$imageFileEntityManagerInterface $entityManager){
  291.         $imageTosave = new Images();
  292.         if (!empty($imageFile)) {
  293.             $destination $this->getParameter('kernel.project_dir') . '/public/uploads/immeubles/' trim($immeuble->getCode());
  294.             $code UtilsFunctions::generateRandomString(4);
  295.             $newFilename uniqid() . "-" .$code '.' $imageFile->guessExtension();
  296.             $imageTosave->setCode($code);
  297.             $imageTosave->setNom($newFilename);
  298.             $imageTosave->setImmeuble($immeuble);
  299.             try {
  300.                 $imageFile->move($destination$newFilename);
  301.                 $this->imageOptimizer->resize($destination.'/'.$newFilename);
  302.                 $entityManager->persist($imageTosave);
  303.                 $entityManager->flush();
  304.             } catch (FileException $ex) {
  305.                 throw new \Exception('Erreur enregistrement du fichier image');   
  306.             }
  307.         }
  308.     }
  309.     public function deleteOldImage(Immeubles $immeuble){
  310.         $images $immeuble->getImages() ;
  311.         if(!$images->isEmpty()){
  312.             for($i=0$i $images->count() ; $i++){
  313.                 $image $images->get($i);
  314.                 $this->imagesRepository->remove($image);
  315.             }
  316.         }
  317.     }
  318.     public  function buildImmeuble($request):Immeubles
  319.     {
  320.         $immeuble = new Immeubles();
  321.         $immeuble->setLibelle($request->request->get('libelle'));
  322.         $immeuble->setDescription($request->request->get('description'));
  323.         $prix = !empty($request->request->get('prix'))?$request->request->get('prix'):;
  324.         $immeuble->setPrix($prix);
  325.         $isnoprice= !empty($request->request->get('isNoprice'));
  326.         $immeuble->setIsNoprice($isnoprice);
  327.         $immeuble->setStatus(UtilsFunctions::NO_PUBLICATION_STATUS);
  328.         $immeuble->setCategorie($this->categoriesRepository->find($request->request->get('categorie')));
  329.         $immeuble->setVille($this->villesRepository->find($request->request->get('ville')));
  330.         $quartierId $request->request->get("quartier");
  331.         if(!empty($quartierId)){
  332.             $quartier $this->quartiersRepository->find($quartierId);
  333.             if($quartier != null)
  334.                 $immeuble->setQuartier($quartier);
  335.         }
  336.         $immeuble->setVendeur($this->getUser());
  337.         $immeuble->setSlug(substr($immeuble->getLibelle(),0,6)."-".UtilsFunctions::generateRandomString(5));
  338.         $immeuble->setCode(UtilsFunctions::generateRandomString(8));
  339.         $immeuble->setTypeoperation($request->request->get("typeoperation"));
  340.         $immeuble->setCreatedAt(new \DateTimeImmutable());
  341.         return  $immeuble;
  342.     }
  343.     private function immeubleCheck($immeuble):bool
  344.     {
  345.         return true;
  346.     }
  347.     private function  convertToImmeuble($value):Immeubles{
  348.         $immeuble = new Immeubles();
  349.         $immeuble->setId($value["id"]);
  350.         $immeuble->setVendeur($this->userRepository->find($value["vendeur_id"]));
  351.         $immeuble->setLibelle($value['libelle']);
  352.         $immeuble->setDescription($value["description"]);
  353.         $immeuble->setSlug($value["slug"]);
  354.         $immeuble->setCode($value["code"]);
  355.         $immeuble->setTypeoperation($value["typeoperation"]);
  356.         $immeuble->setStatus($value["status"]);
  357.         $immeuble->setPrix($value["prix"]);
  358.         $immeuble->setIsNoprice($value["is_noprice"]);
  359.         $immeuble->setPhoto($value["photo"]);
  360.         $immeuble->setVille($this->villesRepository->find($value["ville_id"]));
  361.         if(!empty($value["quartier_id"]))
  362.             $immeuble->setQuartier($this->quartiersRepository->find($value["quartier_id"]));
  363.         $immeuble->setCreatedAt( new \DateTimeImmutable($value["created_at"]));
  364.         $immeuble->setPubDate( new \DateTimeImmutable($value["pub_date"]));
  365.         $immeuble->setCategorie($this->categoriesRepository->find($value["categorie_id"]));
  366.         return $immeuble ;
  367.     }
  368. }