<?php
namespace App\Controller;
use App\Service\StatisticManagement;
use Symfony\Bundle\FrameworkBundle\Controller\AbstractController;
use Symfony\Component\Routing\Annotation\Route;
use App\Entity\CompagnyInfo;
use App\Repository\CompagnyInfoRepository;
use Symfony\Component\HttpFoundation\Response;
use App\Repository\GalleryPhotoRepository;
use App\Repository\GalleryVideoRepository;
use App\Entity\GalleryPhoto;
use App\Data\SearchData;
use App\Form\SearchForm;
use Symfony\Component\HttpFoundation\Request;
use Symfony\Component\HttpFoundation\JsonResponse;
use App\Repository\PackageCompagnyRepository;
use App\Repository\DomainActivityRepository;
use App\Repository\DistrictRepository;
use App\Entity\PackageCompagny;
#[Route('/siteProfessionnal')]
class ProfessionnalController extends AbstractController
{
private CompagnyInfoRepository $compagnyInfoRepository;
private DomainActivityRepository $domainActivityRepository;
private DistrictRepository $districtRepository;
private GalleryPhotoRepository $galleryPhotoRepository;
private GalleryVideoRepository $galleryVideoRepository;
private PackageCompagnyRepository $packageCompagnyRepository;
private StatisticManagement $statisticManagement;
public function __construct(
CompagnyInfoRepository $compagnyInfoRepository,
DomainActivityRepository $domainActivityRepository,
DistrictRepository $districtRepository,
GalleryPhotoRepository $galleryPhotoRepository,
GalleryVideoRepository $galleryVideoRepository,
PackageCompagnyRepository $packageCompagnyRepository,
StatisticManagement $statisticManagement
) {
$this->compagnyInfoRepository = $compagnyInfoRepository;
$this->domainActivityRepository = $domainActivityRepository;
$this->districtRepository = $districtRepository;
$this->galleryPhotoRepository = $galleryPhotoRepository;
$this->galleryVideoRepository = $galleryVideoRepository;
$this->packageCompagnyRepository = $packageCompagnyRepository;
$this->statisticManagement = $statisticManagement;
}
#[Route('/', name: 'siteProfessionnal')]
public function index(Request $request): JsonResponse|Response
{
$data = new SearchData();
//on récupérer le numéro de page de la request ou bien on renseigne la premiére page par défaut
$data->page = $request->get('page', 1);
$formData = $this->createForm(SearchForm::class, $data);
$formData->handleRequest($request);
[$min, $max] = $this->compagnyInfoRepository->findMinMax($data);
$min = ($min != null) ? $min : 0;
$max = ($max != null) ? $max : 10000;
if ($request->get('ajax')) {
return new JsonResponse([
'content' => $this->renderView(
'clientWeb/professionnalSearch/_professionnalContent.html.twig',
[
'objectUserArray' => $this->compagnyInfoRepository->findByCompagnySearch(
$data
),
]
),
'sorting' => $this->renderView(
'clientWeb/professionnalSearch/_professionnalSorting.html.twig',
[
'objectUserArray' => $this->compagnyInfoRepository->findByCompagnySearch(
$data
),
]
),
'pagination' => $this->renderView(
'clientWeb/professionnalSearch/_professionnalPagination.html.twig',
[
'objectUserArray' => $this->compagnyInfoRepository->findByCompagnySearch(
$data
),
]
),
'min' => $min,
'max' => $max,
]);
}
/**
* ici on récupère dans un tableau le total de prestataire pour chaque région
* @var array $dataDistrictArray
*/
$dataDistrictArray = [];
$districtArray = $this->districtRepository->findAll();
foreach ($districtArray as $district) {
$dataDistrictArray[$district->getDistrictName()] = $this->districtRepository->countCompagnyByDistrict(
$district
);
}
return $this->render('clientWeb/professionnal.html.twig', [
'objectUserArray' => $this->compagnyInfoRepository->findByCompagnySearch($data),
'formSearchData' => $formData->createView(),
'min' => $min,
'max' => $max,
'domainActivityCollection' => $this->domainActivityRepository->findAll(),
'arrayByDistrict' => $dataDistrictArray,
]);
}
#[Route('/profil/viewClient/{id}', name: 'viewProfessionnalPresentation')]
public function viewDetailProfessionnal(CompagnyInfo $compagny): Response
{
return $this->render('clientWeb/listProfessionnal/profilPresentation.html.twig', [
'compagny' => $compagny,
]);
}
/**
* @deprecated
*/
#[Route('/profil/viewProfessionnalGalleryPhoto/{id}', name: 'viewProfessionnalGalleryPhoto', methods: ['GET'])]
public function viewProfessionnalGalleryPhoto(
CompagnyInfo $compagny
): Response {
$listGalleryVideo = null;
$listGallery = $this->galleryPhotoRepository->findBy([
'userProperty' => $compagny->getUser(),
]);
$listPhoto = new GalleryPhoto();
foreach ($listGallery as $gallery) {
foreach ($gallery->getPhotos() as $photo) {
$listPhoto->addPhoto($photo);
}
}
return $this->render('clientWeb/listProfessionnal/profilPresentation.html.twig', [
'compagny' => $compagny,
'galleryPhoto' => $listGallery,
'galleryVideo' => $listGalleryVideo,
]);
}
/**
* @deprecated
*/
#[Route('/profil/viewProfessionnalGalleryVideo/{id}', name: 'viewProfessionnalGalleryVideo')]
public function viewProfessionnalGalleryVideo(
CompagnyInfo $compagny
): Response {
$listGalleryPhoto = null;
$listGallery = $this->galleryVideoRepository->findBy([
'userProperty' => $compagny->getUser(),
]);
return $this->render('clientWeb/listProfessionnal/profilPresentation.html.twig', [
'compagny' => $compagny,
'galleryVideo' => $listGallery,
'galleryPhoto' => $listGalleryPhoto,
]);
}
#[Route('/profil/viewProfessionnalGalleryEvent/{id}', name: 'viewProfessionnalGalleryEvent')]
public function viewProfessionnalGalleryEvent(CompagnyInfo $compagny): Response
{
return $this->json(['code' => 200, 'message' => 'ok event'], 200);
}
#[Route('/listePackage/indexProfessionnalPackage/{id}', name: 'indexProfessionnalPackage')]
public function indexProfessionnalPackage(
CompagnyInfo $compagny,
Request $request
): JsonResponse|Response {
//on definit le nombre d'élément par page
$limit = 12;
//on récupére le numéro de page + param de requete
$page = (int)$request->query->get('page', 1);
$filterMin = $request->get('min');
$filterMax = $request->get('max');
$filterMinPers = $request->get('minPersFilter');
$filterMaxPers = $request->get('maxPersFilter');
$filterWithLimitPers = $request->get('withPackage');
$filterEmptyLimitPers = $request->get('emptyPackage');
$filterString = $request->get('namePackage');
//on récupére les package de compagny en fonction du filtre
$package = $this->packageCompagnyRepository->getPaginatedPackages(
$compagny,
$page,
$limit,
$filterMin,
$filterMax,
$filterMinPers,
$filterMaxPers,
$filterWithLimitPers,
$filterEmptyLimitPers,
$filterString
);
//on récupére le nombre total de pack
$totalPackage = $this->packageCompagnyRepository->getTotalPackages(
$compagny,
$filterMin,
$filterMax,
$filterMinPers,
$filterMaxPers,
$filterWithLimitPers,
$filterEmptyLimitPers,
$filterString
);
//on recupere le min et max price, et le min et max personne
[$min, $max] = $this->packageCompagnyRepository->findMinMaxPackage($compagny);
[$minPersFilter, $maxPersFilter] = $this->packageCompagnyRepository->findMinMaxPerson($compagny);
//on verifie si requete ajax
if ($request->get('ajax')) {
return new JsonResponse([
'content' => $this->renderView(
'clientWeb/packageSearch/_packageContent.html.twig',
[
'package' => $package,
'compagny' => $compagny,
]
),
'pagination' => $this->renderView(
'clientWeb/packageSearch/_packagePagination.html.twig',
[
'limit' => $limit,
'page' => $page,
'totalPackage' => $totalPackage
]
),
'min' => $min,
'max' => $max,
'minPersFilter' => $minPersFilter,
'maxPersFilter' => $maxPersFilter,
]);
}
$this->statisticManagement->addClic($compagny);
return $this->render('clientWeb/packageSearch/listePackage.html.twig', [
'package' => $package,
'min' => $min,
'max' => $max,
'minPersFilter' => $minPersFilter,
'maxPersFilter' => $maxPersFilter,
'compagny' => $compagny,
'limit' => $limit,
'page' => $page,
'totalPackage' => $totalPackage
]);
}
#[Route('/listePackage/viewProfessionnalPackage/{compagny}/package/{package}', name: 'viewProfessionnalPackage')]
public function viewProfessionnalPackage(CompagnyInfo $compagny, PackageCompagny $package): Response
{
return $this->render('clientWeb/packageSearch/_viewDetailPackage.html.twig', [
'package' => $package,
'compagny' => $compagny,
]);
}
}