<?php
namespace App\Controller;
use App\Entity\Articles;
use App\Entity\Categories;
use App\Entity\Images;
use App\Entity\Immeubles;
use App\Entity\ImmeubleVariable;
use App\Repository\ArticlesRepository;
use App\Repository\CategoriesRepository;
use App\Repository\ImagesRepository;
use App\Repository\ImmeublesRepository;
use App\Repository\QuartiersRepository;
use App\Repository\UserRepository;
use App\Repository\VariableConstantsRepository;
use App\Repository\VariablesRepository;
use App\Repository\VillesRepository;
use App\services\ImageOptimizer;
use Doctrine\ORM\EntityManagerInterface;
use JetBrains\PhpStorm\Immutable;
use Knp\Component\Pager\PaginatorInterface;
use phpDocumentor\Reflection\Types\Boolean;
use Symfony\Bundle\FrameworkBundle\Controller\AbstractController;
use Symfony\Component\HttpFoundation\File\Exception\FileException;
use Symfony\Component\HttpFoundation\Request;
use Symfony\Component\HttpFoundation\Response;
use Symfony\Component\Notifier\Notification\Notification;
use Symfony\Component\Notifier\NotifierInterface;
use Symfony\Component\Routing\Annotation\Route;
#[Route('/immeuble', name: 'app_immeuble')]
class ImmeubleController extends AbstractController
{
private CategoriesRepository $categoriesRepository;
private VariablesRepository $variablesRepository ;
private VariableConstantsRepository $variableConstantsRepository;
private VillesRepository $villesRepository ;
private QuartiersRepository $quartiersRepository ;
private ImmeublesRepository $immeublesRepository ;
private UserRepository $userRepository ;
private ImagesRepository $imagesRepository;
private ImageOptimizer $imageOptimizer ;
/**
* @param CategoriesRepository $categoriesRepository
* @param VariablesRepository $variablesRepository
* @param VariableConstantsRepository $variableConstantsRepository
* @param VillesRepository $villesRepository
* @param QuartiersRepository $quartiersRepository
* @param ImmeublesRepository $immeublesRepository
* @param UserRepository $userRepository
* @param ImagesRepository $imagesRepository
*/
public function __construct(CategoriesRepository $categoriesRepository, VariablesRepository $variablesRepository,
VariableConstantsRepository $variableConstantsRepository, VillesRepository $villesRepository,
QuartiersRepository $quartiersRepository, ImmeublesRepository $immeublesRepository,
UserRepository $userRepository, ImagesRepository $imagesRepository, ImageOptimizer $imageOptimizer)
{
$this->categoriesRepository = $categoriesRepository;
$this->variablesRepository = $variablesRepository;
$this->variableConstantsRepository = $variableConstantsRepository;
$this->villesRepository = $villesRepository;
$this->quartiersRepository = $quartiersRepository;
$this->immeublesRepository = $immeublesRepository;
$this->userRepository = $userRepository;
$this->ImagesRepository = $imagesRepository;
$this->imageOptimizer = $imageOptimizer;
}
#[Route('/', name: 'index')]
public function index(Request $request, PaginatorInterface $paginator): Response
{
$search = false ;
$donnees=[];
$lastImmeubles = $this->immeublesRepository->findBy(["status"=> UtilsFunctions::PUBLICATION_STATUS], ["pubDate"=>"DESC"],6);
if($request->isMethod("POST")){
$search = true ;
$categs = $_POST["categs"] ?? null;
$villes = $_POST["villes"] ?? null;
$quartiers = $_POST["quartiers"] ?? null;
$res= $this->immeublesRepository->searchImmeuble($request,$villes, $quartiers, $categs);
foreach ($res as $key=>$value){
$donnees[] = $this->convertToImmeuble($value);
}
}else{
$donnees = $this->immeublesRepository->findBy(["status"=> UtilsFunctions::PUBLICATION_STATUS], ["pubDate"=>"DESC",], 1000);
}
$immeubles=null;
if(count($donnees) > 0){
$immeubles = $paginator->paginate(
$donnees,
$request->query->getInt('page', 1),15);
}
return $this->render('immeuble/index.html.twig', [
'immeubles' => $immeubles,
'lastImmeubles'=> $lastImmeubles,
'search'=> $search
]);
}
#[Route('search/{slugCategorie}', name: 'categorie')]
public function searchByCategorie(Request $request, PaginatorInterface $paginator, $slugCategorie): Response
{
$search = true ;
$categories = $this->categoriesRepository->findOneBy(["slug"=>trim($slugCategorie)]);
$donnees=[];
$searchCategorie = $categories ;
$lastImmeubles = $this->immeublesRepository->findBy(["status"=> UtilsFunctions::PUBLICATION_STATUS], ["pubDate"=>"DESC"],6);
if($request->isMethod("POST")){
$categs = $_POST["categs"] ?? null;
$villes = $_POST["villes"] ?? null;
$quartiers = $_POST["quartiers"] ?? null;
$res= $this->immeublesRepository->searchImmeuble($request,$villes, $quartiers, $categs);
foreach ($res as $key=>$value){
$donnees[] = $this->convertToImmeuble($value);
}
}else if(UtilsFunctions::IMMO_CODE == $categories->getCode()) {
$donnees = $this->immeublesRepository->findBy([], ["pubDate"=>"DESC",], 1000);
}else{
$donnees = $this->immeublesRepository->findBy(["categorie"=>$categories], ["pubDate"=>"DESC",], 1000);
}
$immeubles=null;
if(count($donnees) > 0){
$immeubles = $paginator->paginate(
$donnees,
$request->query->getInt('page', 1),15);
}
return $this->render('immeuble/index.html.twig', [
'immeubles' => $immeubles,
'searchCategorie'=>$searchCategorie,
'lastImmeubles'=> $lastImmeubles,
'search'=> $search
]);
}
#[Route('add', name: 'add')]
public function add(Request $request, EntityManagerInterface $entityManager): Response
{
if(!$this->getUser()){
return $this->redirectToRoute('app_login');
}
$categorie = $this->categoriesRepository->findOneBy(["code"=>UtilsFunctions::IMMO_CODE]);
$sousCateg= $this->categoriesRepository->findBy(["parent"=>$categorie],["libelle"=>'ASC']);
$variables = $this->variablesRepository->findBy(["Categorie"=>$categorie]);
$villes = $this->villesRepository->findAll() ;
$immeuble = new Immeubles();
if($request->isMethod("POST") && ($this->isCsrfTokenValid('add-immeuble', $request->request->get('token')))) {
if(isset($_POST["variableValue"]))
$variableValue = $_POST["variableValue"];
$immeuble = $this->buildImmeuble($request);
$photofile = $request->files->get("photo");
$newFilename = "";
$destination = "";
if (!empty($photofile)) {
$destination = $this->getParameter('kernel.project_dir') . '/public/uploads/immeubles/' . trim($immeuble->getCode());
$newFilename = uniqid() . "-" . $immeuble->getCode() . '.' . $photofile->guessExtension();
$immeuble->setPhoto($newFilename);
}
if ($this->immeubleCheck($immeuble)) {
try {
$photofile->move($destination, $newFilename);
$this->imageOptimizer->resize($destination.'/'.$newFilename);
} catch (FileException $ex) {
}
$entityManager->persist($immeuble);
$entityManager->flush();
//save Variable value
if(isset($_POST["variableValue"]))
foreach($variableValue as $key => $value)
{
$v =$this->variablesRepository->findOneBy(["code"=>$key]);
$immeubleVariable = new ImmeubleVariable();
$immeubleVariable->setImmeuble($immeuble);
$immeubleVariable->setVariable($v);
$immeubleVariable->setValeur($value);
$entityManager->persist($immeubleVariable);
$entityManager->flush();
}
return $this->redirectToRoute('app_immeubledetail',['id'=>$immeuble->getId()]);
}
}
return $this->render('immeuble/add.html.twig', [
'sousCategories' => $sousCateg,
'variables'=> $variables,
'villes'=>$villes
]);
}
#[Route('detail/{id}', name: 'detail')]
public function detail(ImagesRepository $imagesRepository, Immeubles $immeuble):Response
{
return $this->render('immeuble/detail.html.twig', [
'immeuble' => $immeuble
]);
}
#[Route('quartier', name: 'quartier')]
public function listquatierByville(Request $request,VillesRepository $villesRepository, QuartiersRepository $quartiersRepository)
{
$ouptut= array();
$idville= $request->request->get('id');
$ville= $villesRepository->findBy(["id"=>$idville]);
$quartiers = $quartiersRepository->findBy(["ville"=>$ville]);
foreach($quartiers as $q ){
array_push($ouptut,array($q->getId(),$q->getNom()));
}
return new \Symfony\Component\HttpFoundation\JsonResponse($ouptut);
}
#[Route('detailslug/{slug}', name: 'detailslug')]
public function detailSlug(ImagesRepository $imagesRepository, Immeubles $immeuble):Response
{
$immeubles = $this->immeublesRepository->findBy(["categorie"=>$immeuble->getCategorie()], ["pubDate"=>"DESC"], 12);
return $this->render('immeuble/public-detail.html.twig', [
'immeuble' => $immeuble,
'immeubles'=>$immeubles
]);
}
#[Route('publier/{id}', name: 'publication')]
public function publierImmeuble(ImmeublesRepository $immeublesRepository, Immeubles $immeubles, EntityManagerInterface $entityManager,NotifierInterface $notifier): Response
{
if ($immeubles->getId() > 0) {
$immeubles->setStatus(UtilsFunctions::PUBLICATION_STATUS);
$immeubles->setPubDate(new \DateTimeImmutable());
$entityManager->persist($immeubles);
$entityManager->flush();
$notifier->send(new Notification("Operation réussie publication effectuée",['browser']));
} else {
return $this->render('errorrs/notfound.html.twig', [
'immeuble' => $immeubles
]);
}
return $this->render('immeuble/detail.html.twig', [
'immeuble' => $immeubles
]);
}
#[Route('suspendre/{id}', name: 'suspension')]
public function suspendreImmeuble(ImmeublesRepository $immeublesRepository, Immeubles $immeubles, EntityManagerInterface $entityManager, NotifierInterface $notifier): Response{
if($immeubles->getId() > 0){
$immeubles->setStatus(UtilsFunctions::NO_PUBLICATION_STATUS);
$immeubles->setPubDate(new \DateTimeImmutable());
$entityManager->persist($immeubles);
$entityManager->flush();
$notifier->send(new Notification("Operation réussie l'immeuble est suspendu",['browser']));
}else{
return $this->render('errorrs/notfound.html.twig', [
'immeubles' => $immeubles
]);
}
return $this->render('vehicule/detail.html.twig', [
'immeubles' => $immeubles
]);
}
#[Route('delete/{id}', name: 'supprimer')]
public function supprimerImmeuble(ImmeublesRepository $immeublesRepository, Immeubles $immeubles, EntityManagerInterface $entityManager): Response{
if($immeubles->getId() > 0){
$immeubles->setStatus(UtilsFunctions::DELETE_STATUS);
$entityManager->persist($immeubles);
$entityManager->flush();
}else{
return $this->render('errorrs/notfound.html.twig', [
'immeubles' => $immeubles
]);
}
return $this->redirectToRoute('app_vendor_home_index');
}
#[Route('image/{id}', name: 'addimage')]
public function addImage(Request $request, EntityManagerInterface $entityManager,ImmeublesRepository $immeublesRepository, Immeubles $immeubles){
if($request->isMethod("POST") && ($this->isCsrfTokenValid('add-immeuble', $request->request->get('token')))) {
$immeublesId = $request->request->get('id');
$immeubleForImage = $immeublesRepository->find($immeublesId);
$image1 = $request->files->get("image1");
$image2 = $request->files->get("image2");
$image3 = $request->files->get("image3");
$image4 = $request->files->get("image4");
$this->deleteOldImage($immeubleForImage);
$this->saveImage($immeubleForImage,$image1, $entityManager);
$this->saveImage($immeubleForImage,$image2,$entityManager);
$this->saveImage($immeubleForImage,$image3, $entityManager);
$this->saveImage($immeubleForImage,$image4, $entityManager);
return $this->redirectToRoute('app_immeubledetail',['id'=>$immeublesId]);
}
return $this->render('immeuble/add-image.html.twig', [
'immeuble' => $immeubles
]);
}
public function saveImage(Immeubles $immeuble, $imageFile, EntityManagerInterface $entityManager){
$imageTosave = new Images();
if (!empty($imageFile)) {
$destination = $this->getParameter('kernel.project_dir') . '/public/uploads/immeubles/' . trim($immeuble->getCode());
$code = UtilsFunctions::generateRandomString(4);
$newFilename = uniqid() . "-" .$code . '.' . $imageFile->guessExtension();
$imageTosave->setCode($code);
$imageTosave->setNom($newFilename);
$imageTosave->setImmeuble($immeuble);
try {
$imageFile->move($destination, $newFilename);
$this->imageOptimizer->resize($destination.'/'.$newFilename);
$entityManager->persist($imageTosave);
$entityManager->flush();
} catch (FileException $ex) {
throw new \Exception('Erreur enregistrement du fichier image');
}
}
}
public function deleteOldImage(Immeubles $immeuble){
$images = $immeuble->getImages() ;
if(!$images->isEmpty()){
for($i=0; $i < $images->count() ; $i++){
$image = $images->get($i);
$this->imagesRepository->remove($image);
}
}
}
public function buildImmeuble($request):Immeubles
{
$immeuble = new Immeubles();
$immeuble->setLibelle($request->request->get('libelle'));
$immeuble->setDescription($request->request->get('description'));
$prix = !empty($request->request->get('prix'))?$request->request->get('prix'):0 ;
$immeuble->setPrix($prix);
$isnoprice= !empty($request->request->get('isNoprice'));
$immeuble->setIsNoprice($isnoprice);
$immeuble->setStatus(UtilsFunctions::NO_PUBLICATION_STATUS);
$immeuble->setCategorie($this->categoriesRepository->find($request->request->get('categorie')));
$immeuble->setVille($this->villesRepository->find($request->request->get('ville')));
$quartierId = $request->request->get("quartier");
if(!empty($quartierId)){
$quartier = $this->quartiersRepository->find($quartierId);
if($quartier != null)
$immeuble->setQuartier($quartier);
}
$immeuble->setVendeur($this->getUser());
$immeuble->setSlug(substr($immeuble->getLibelle(),0,6)."-".UtilsFunctions::generateRandomString(5));
$immeuble->setCode(UtilsFunctions::generateRandomString(8));
$immeuble->setTypeoperation($request->request->get("typeoperation"));
$immeuble->setCreatedAt(new \DateTimeImmutable());
return $immeuble;
}
private function immeubleCheck($immeuble):bool
{
return true;
}
private function convertToImmeuble($value):Immeubles{
$immeuble = new Immeubles();
$immeuble->setId($value["id"]);
$immeuble->setVendeur($this->userRepository->find($value["vendeur_id"]));
$immeuble->setLibelle($value['libelle']);
$immeuble->setDescription($value["description"]);
$immeuble->setSlug($value["slug"]);
$immeuble->setCode($value["code"]);
$immeuble->setTypeoperation($value["typeoperation"]);
$immeuble->setStatus($value["status"]);
$immeuble->setPrix($value["prix"]);
$immeuble->setIsNoprice($value["is_noprice"]);
$immeuble->setPhoto($value["photo"]);
$immeuble->setVille($this->villesRepository->find($value["ville_id"]));
if(!empty($value["quartier_id"]))
$immeuble->setQuartier($this->quartiersRepository->find($value["quartier_id"]));
$immeuble->setCreatedAt( new \DateTimeImmutable($value["created_at"]));
$immeuble->setPubDate( new \DateTimeImmutable($value["pub_date"]));
$immeuble->setCategorie($this->categoriesRepository->find($value["categorie_id"]));
return $immeuble ;
}
}