<?php
namespace App\Controller;
use App\Entity\Enum\ContratType;
use App\Entity\Enum\Disponibility;
use App\Entity\Enum\Experience;
use App\Entity\Enum\FrenchRegion;
use App\Entity\Offer;
use App\Entity\Profile;
use App\Entity\Publication;
use App\Entity\PublicationImage;
use App\Entity\User;
use App\Repository\OfferAlertRepository;
use App\Repository\ExternalCompanyRepository;
use App\Repository\OfferRepository;
use App\Repository\PackageRepository;
use App\Repository\ProfileRepository;
use App\Repository\ProfileVisitRepository;
use App\Repository\PublicationRepository;
use App\Repository\SkillRepository;
use App\Repository\SocietyRepository;
use App\UseCase\Package\Config;
use App\UseCase\Statistics\ProfileViewStats;
use DateTime;
use Doctrine\ORM\EntityManagerInterface;
use Knp\Component\Pager\PaginatorInterface;
use Sensio\Bundle\FrameworkExtraBundle\Configuration\IsGranted;
use Symfony\Bundle\FrameworkBundle\Controller\AbstractController;
use Symfony\Component\HttpFoundation\Request;
use Symfony\Component\HttpFoundation\Response;
use Symfony\Component\HttpFoundation\Session\SessionInterface;
use Symfony\Component\Routing\Annotation\Route;
class SearchController extends AbstractController
{
private ExternalCompanyRepository $externalCompanyRepository;
public function __construct(ExternalCompanyRepository $externalCompanyRepository)
{
$this->externalCompanyRepository = $externalCompanyRepository;
}
/* @changelog 2022-09-22 [FIX] (Anthony) Constante pour la recherche par mobilité */
const REGION = 0;
const DEPARTMENT = 1;
const FILTER_PERTINENCE = 'pertinence';
const FILTER_DISPONIBILITY = 'disponibilité';
const FILTER_CONNEXION = 'connexion';
private function transformURL($maChaine): array
{
$resultat = [];
// Décoder l'URL encodée (gère les caractères spéciaux comme %, &, #, etc.)
// Utiliser rawurldecode pour décoder correctement les caractères encodés
// rawurldecode ne lance pas d'exception, mais peut retourner des résultats inattendus
// si la chaîne contient des séquences d'encodage mal formées
// Vérifier si la chaîne contient des caractères % non encodés (problème potentiel)
// Si c'est le cas, les remplacer par "percent" pour éviter les erreurs
if (preg_match('/%(?![0-9A-Fa-f]{2})/', $maChaine)) {
// La chaîne contient un % qui n'est pas suivi de deux chiffres hexadécimaux
// Remplacer % par "percent" pour éviter les erreurs de décodage
$maChaine = str_replace('%', 'percent', $maChaine);
}
// Décoder l'URL
$decoded = rawurldecode($maChaine);
// Remplacer "percent" par % dans le résultat décodé
$decoded = str_replace('percent', '%', $decoded);
// Remplacer les tirets par des espaces
$resultat['search'] = str_replace('-', ' ', $decoded);
return $resultat;
}
/**
* @param array $location
* @param OfferRepository $offerRepository
* @return Offer[]
*/
private function offerIfNofound(
array $location,
OfferRepository $offerRepository,
array $contrats = [],
string $order
): array {
$defaultSearch = "";
$defaultCategorie = null;
$defaultMinMax = 0;
$defaultSalary = 0;
/** @var Offer[] $defaultOffer */
$defaultOffer = $offerRepository->findBySearch(
"",
[],
$defaultMinMax,
$defaultCategorie,
$defaultSalary,
$order,
$contrats
);
if (count($defaultOffer) == 0) {
$location = $this->findParentCities($location, FrenchRegion::REGION_DEPARTEMENT);
$defaultOffer = $offerRepository->findBySearch(
$defaultSearch,
$location,
$defaultMinMax,
$defaultCategorie,
$defaultSalary,
$defaultOrder,
$contrats
);
}
return $defaultOffer;
}
/**
* @param array $citiesToFind
* @param array $countries
* @return array
*/
private function findParentCities(array $citiesToFind, array $countries): array
{
$foundCountries = [];
if (in_array("All UAE", $citiesToFind)) {
return ["All UAE"];
}
foreach ($citiesToFind as $city) {
// Parcourir chaque pays dans le premier array
foreach ($countries as $country => $cities) {
if ($country == $city) {
$foundCountries[] = $country;
break;
}
// Vérifier si la ville se trouve dans ce pays
if (isset($cities[$city])) {
$foundCountries[] = $country;
break; // Sortir de la boucle dès qu'on a trouvé le pays
}
}
}
return $foundCountries;
}
/**
*
* @Route("/missions-freelance", name="mission_search_default")
*
* @param Request $request
* @param OfferRepository $offerRepository
* @param OfferAlertRepository $offerAlertRepository
* @param PaginatorInterface $paginator
* @param EntityManagerInterface $entityManager
* @param SessionInterface $session
* @return Response
*/
public function missionDefault(
Request $request,
OfferRepository $offerRepository,
OfferAlertRepository $offerAlertRepository,
PaginatorInterface $paginator,
EntityManagerInterface $entityManager,
SessionInterface $session
): Response {
return $this->missionSearch(
$request,
$offerRepository,
$offerAlertRepository,
$paginator,
$entityManager,
$session,
""
);
}
/**
*
* @Route("/emploi", name="emploi_search_default")
*
* @param Request $request
* @param OfferRepository $offerRepository
* @param OfferAlertRepository $offerAlertRepository
* @param PaginatorInterface $paginator
* @param EntityManagerInterface $entityManager
* @param SessionInterface $session
* @return Response
*/
public function emploiDefault(
Request $request,
OfferRepository $offerRepository,
OfferAlertRepository $offerAlertRepository,
PaginatorInterface $paginator,
EntityManagerInterface $entityManager,
SessionInterface $session
): Response {
return $this->missionSearch(
$request,
$offerRepository,
$offerAlertRepository,
$paginator,
$entityManager,
$session,
""
);
}
/**
*
* @Route("/freelance-france", name="page_special_freelance_france")
*
* @param PublicationRepository $publicationRepository
* @return Response
*/
public function pagesFrance(
PublicationRepository $publicationRepository
): Response {
$publication = $publicationRepository->findOneBy(['slug' => "freelance-france"]);
return $this->render('page/page.html.twig', [
'publication' => $publication,
]);
}
/**
*
* @Route("/freelance-definition", name="page_special_freelance_definition")
*
* @param PublicationRepository $publicationRepository
* @return Response
*/
public function pagesDefinition(
PublicationRepository $publicationRepository
): Response {
$publication = $publicationRepository->findOneBy(['slug' => "freelance-definition"]);
return $this->render('page/page.html.twig', [
'publication' => $publication,
]);
}
/**
*
* @Route("/freelance-informatique", name="page_special_freelance_informatique")
*
* @param PublicationRepository $publicationRepository
* @return Response
*/
public function pagesinformatique(
PublicationRepository $publicationRepository
): Response {
$publication = $publicationRepository->findOneBy(['slug' => "freelance-informatique"]);
return $this->render('page/page.html.twig', [
'publication' => $publication,
]);
}
/**
*
* @Route("/freelance-jobs", name="page_special_freelance_jobs")
*
* @param PublicationRepository $publicationRepository
* @return Response
*/
public function pagesJobs(
PublicationRepository $publicationRepository
): Response {
$publication = $publicationRepository->findOneBy(['slug' => "freelance-jobs"]);
return $this->render('page/page.html.twig', [
'publication' => $publication,
]);
}
/**
*
* @Route("/freelance-info", name="page_special_info")
*
* @param PublicationRepository $publicationRepository
* @return Response
*/
public function missionInfo(
PublicationRepository $publicationRepository
): Response {
$publication = $publicationRepository->findOneBy(['slug' => "freelance-info"]);
return $this->render('page/page.html.twig', [
'publication' => $publication,
]);
}
/**
*
* PAGE SPECIAL POUR L'AFFICHAGE D'UNE INFO
*
* @Route("/emploi-paris", name="mission_search_paris")
*
* @param Request $request
* @param OfferRepository $offerRepository
* @param OfferAlertRepository $offerAlertRepository
* @param PaginatorInterface $paginator
* @param EntityManagerInterface $entityManager
* @param SessionInterface $session
* @return Response
*/
public function freelanceParis(
Request $request,
OfferRepository $offerRepository,
OfferAlertRepository $offerAlertRepository,
PaginatorInterface $paginator,
EntityManagerInterface $entityManager,
SessionInterface $session
): Response {
return $this->missionSearch(
$request,
$offerRepository,
$offerAlertRepository,
$paginator,
$entityManager,
$session,
"",
['75 Paris'],
"Paris"
);
}
/**
*
* @Route("/emploi-lille", name="mission_search_lille")
*
* @param Request $request
* @param OfferRepository $offerRepository
* @param OfferAlertRepository $offerAlertRepository
* @param PaginatorInterface $paginator
* @param EntityManagerInterface $entityManager
* @param SessionInterface $session
* @return Response
*/
public function missionLille(
Request $request,
OfferRepository $offerRepository,
OfferAlertRepository $offerAlertRepository,
PaginatorInterface $paginator,
EntityManagerInterface $entityManager,
SessionInterface $session
): Response {
return $this->missionSearch(
$request,
$offerRepository,
$offerAlertRepository,
$paginator,
$entityManager,
$session,
"",
['59 Nord'],
"Lille"
);
}
/**
*
* @Route("/emploi-nice", name="mission_search_nice")
*
* @param Request $request
* @param OfferRepository $offerRepository
* @param OfferAlertRepository $offerAlertRepository
* @param PaginatorInterface $paginator
* @param EntityManagerInterface $entityManager
* @param SessionInterface $session
* @return Response
*/
public function missionNice(
Request $request,
OfferRepository $offerRepository,
OfferAlertRepository $offerAlertRepository,
PaginatorInterface $paginator,
EntityManagerInterface $entityManager,
SessionInterface $session
): Response {
return $this->missionSearch(
$request,
$offerRepository,
$offerAlertRepository,
$paginator,
$entityManager,
$session,
"",
['06 Alpes-Maritimes'],
"Nice"
);
}
/**
*
* @Route("/emploi-bordeaux", name="mission_search_bordeaux")
*
* @param Request $request
* @param OfferRepository $offerRepository
* @param OfferAlertRepository $offerAlertRepository
* @param PaginatorInterface $paginator
* @param EntityManagerInterface $entityManager
* @param SessionInterface $session
* @return Response
*/
public function missionBordeaux(
Request $request,
OfferRepository $offerRepository,
OfferAlertRepository $offerAlertRepository,
PaginatorInterface $paginator,
EntityManagerInterface $entityManager,
SessionInterface $session
): Response {
return $this->missionSearch(
$request,
$offerRepository,
$offerAlertRepository,
$paginator,
$entityManager,
$session,
"",
['33 Gironde'],
"Bordeaux"
);
}
/**
*
* @Route("/emploi-marseille", name="mission_search_marseille")
*
* @param Request $request
* @param OfferRepository $offerRepository
* @param OfferAlertRepository $offerAlertRepository
* @param PaginatorInterface $paginator
* @param EntityManagerInterface $entityManager
* @param SessionInterface $session
* @return Response
*/
public function missionMarseille(
Request $request,
OfferRepository $offerRepository,
OfferAlertRepository $offerAlertRepository,
PaginatorInterface $paginator,
EntityManagerInterface $entityManager,
SessionInterface $session
): Response {
return $this->missionSearch(
$request,
$offerRepository,
$offerAlertRepository,
$paginator,
$entityManager,
$session,
"",
['13 Bouches-du-Rhône'],
"Marseille"
);
}
/**
*
* @Route("/emploi-nantes", name="mission_search_nantes")
*
* @param Request $request
* @param OfferRepository $offerRepository
* @param OfferAlertRepository $offerAlertRepository
* @param PaginatorInterface $paginator
* @param EntityManagerInterface $entityManager
* @param SessionInterface $session
* @return Response
*/
public function missionNantes(
Request $request,
OfferRepository $offerRepository,
OfferAlertRepository $offerAlertRepository,
PaginatorInterface $paginator,
EntityManagerInterface $entityManager,
SessionInterface $session
): Response {
return $this->missionSearch(
$request,
$offerRepository,
$offerAlertRepository,
$paginator,
$entityManager,
$session,
"",
['44 Loire-Atlantique'],
"Nantes"
);
}
/**
*
* @Route("/emploi-toulouse", name="mission_search_toulouse")
*
* @param Request $request
* @param OfferRepository $offerRepository
* @param OfferAlertRepository $offerAlertRepository
* @param PaginatorInterface $paginator
* @param EntityManagerInterface $entityManager
* @param SessionInterface $session
* @return Response
*/
public function missionToulouse(
Request $request,
OfferRepository $offerRepository,
OfferAlertRepository $offerAlertRepository,
PaginatorInterface $paginator,
EntityManagerInterface $entityManager,
SessionInterface $session
): Response {
return $this->missionSearch(
$request,
$offerRepository,
$offerAlertRepository,
$paginator,
$entityManager,
$session,
"",
['31 Haute-Garonne'],
"Toulouse"
);
}
/**
*
* @Route("/emploi-lyon", name="mission_search_lyon")
*
* @param Request $request
* @param OfferRepository $offerRepository
* @param OfferAlertRepository $offerAlertRepository
* @param PaginatorInterface $paginator
* @param EntityManagerInterface $entityManager
* @param SessionInterface $session
* @return Response
*/
public function missionLyon(
Request $request,
OfferRepository $offerRepository,
OfferAlertRepository $offerAlertRepository,
PaginatorInterface $paginator,
EntityManagerInterface $entityManager,
SessionInterface $session
): Response {
return $this->missionSearch(
$request,
$offerRepository,
$offerAlertRepository,
$paginator,
$entityManager,
$session,
"",
['69 Rhône'],
"Lyon"
);
}
/**
*
* @Route("/freelance-{url_libelle}", name="mission_search", requirements={"url_libelle"=".*"})
*
* @param Request $request
* @param OfferRepository $offerRepository
* @param OfferAlertRepository $offerAlertRepository
* @param PaginatorInterface $paginator
* @param EntityManagerInterface $entityManager
* @param SessionInterface $session
* @param string|null $url_libelle
* @return Response
*/
public function mission(
Request $request,
OfferRepository $offerRepository,
OfferAlertRepository $offerAlertRepository,
PaginatorInterface $paginator,
EntityManagerInterface $entityManager,
SessionInterface $session,
?string $url_libelle = ""
): Response {
return $this->missionSearch(
$request,
$offerRepository,
$offerAlertRepository,
$paginator,
$entityManager,
$session,
$url_libelle
);
}
/**
*
* @Route("/stage-{url_libelle}", name="stage_search", requirements={"url_libelle"=".*"})
*
* @param Request $request
* @param OfferRepository $offerRepository
* @param OfferAlertRepository $offerAlertRepository
* @param PaginatorInterface $paginator
* @param EntityManagerInterface $entityManager
* @param SessionInterface $session
* @param string|null $url_libelle
* @return Response
*/
public function stage(
Request $request,
OfferRepository $offerRepository,
OfferAlertRepository $offerAlertRepository,
PaginatorInterface $paginator,
EntityManagerInterface $entityManager,
SessionInterface $session,
?string $url_libelle = ""
): Response {
return $this->missionSearch(
$request,
$offerRepository,
$offerAlertRepository,
$paginator,
$entityManager,
$session,
$url_libelle
);
}
/**
*
* @Route("/alternance-{url_libelle}", name="alternance_search", requirements={"url_libelle"=".*"})
*
* @param Request $request
* @param OfferRepository $offerRepository
* @param OfferAlertRepository $offerAlertRepository
* @param PaginatorInterface $paginator
* @param EntityManagerInterface $entityManager
* @param SessionInterface $session
* @param string|null $url_libelle
* @return Response
*/
public function alternance(
Request $request,
OfferRepository $offerRepository,
OfferAlertRepository $offerAlertRepository,
PaginatorInterface $paginator,
EntityManagerInterface $entityManager,
SessionInterface $session,
?string $url_libelle = ""
): Response {
return $this->missionSearch(
$request,
$offerRepository,
$offerAlertRepository,
$paginator,
$entityManager,
$session,
$url_libelle
);
}
/**
*
* @Route("/emploi-{url_libelle}", name="emploi_search", requirements={"url_libelle"=".*"})
*
* @param Request $request
* @param OfferRepository $offerRepository
* @param OfferAlertRepository $offerAlertRepository
* @param PaginatorInterface $paginator
* @param EntityManagerInterface $entityManager
* @param SessionInterface $session
* @param string|null $url_libelle
* @return Response
*/
public function emploi(
Request $request,
OfferRepository $offerRepository,
OfferAlertRepository $offerAlertRepository,
PaginatorInterface $paginator,
EntityManagerInterface $entityManager,
SessionInterface $session,
?string $url_libelle = ""
): Response {
return $this->missionSearch(
$request,
$offerRepository,
$offerAlertRepository,
$paginator,
$entityManager,
$session,
$url_libelle
);
}
/**
*
* @Route("/offres-{url_libelle}", name="offre_search", requirements={"url_libelle"=".*"})
*
* @param Request $request
* @param OfferRepository $offerRepository
* @param OfferAlertRepository $offerAlertRepository
* @param PaginatorInterface $paginator
* @param EntityManagerInterface $entityManager
* @param SessionInterface $session
* @param string|null $url_libelle
* @return Response
*/
public function offre(
Request $request,
OfferRepository $offerRepository,
OfferAlertRepository $offerAlertRepository,
PaginatorInterface $paginator,
EntityManagerInterface $entityManager,
SessionInterface $session,
?string $url_libelle = ""
): Response {
return $this->missionSearch(
$request,
$offerRepository,
$offerAlertRepository,
$paginator,
$entityManager,
$session,
$url_libelle
);
}
private function missionSearch(
Request $request,
OfferRepository $offerRepository,
OfferAlertRepository $offerAlertRepository,
PaginatorInterface $paginator,
EntityManagerInterface $entityManager,
SessionInterface $session,
?string $url_libelle = "",
?array $exeptedLocation = [],
?string $citySelected = null
): Response {
$session->remove('previous_url');
// dd($request->get('contrat'));
$currentDate = new DateTime();
/* @var User $user */
$user = $this->getUser();
if ($user) {
if ($user->isFreelance() && !$user->hasProfile()) {
return $this->redirectToRoute('dashboard');
}
}
// DEFAULT SEARCH
$defaultSearch = "";
$defaultLocation = $exeptedLocation;
$defaultCategorie = null;
$defaultMinMax = 0;
$defaultSalary = 0;
$defaultOrder = $user !== null ? 'pertinence' : 'desc';
$defaultContrat = ['Freelance', 'CDI', 'CDD', 'Alternance', 'Stage'];
// Récupérer les types de contrats uniques dans les missions
$existingContrats = $offerRepository->createQueryBuilder('o')
->select('DISTINCT o.contrats')
->where('o.contrats IS NOT NULL')
->getQuery()
->getResult();
$contratsList = [];
foreach ($existingContrats as $row) {
if (is_array($row['contrats'])) {
$contratsList = array_merge($contratsList, $row['contrats']);
}
}
// Supprimer les doublons de contrats et filtrer selon $defaultContrat
$contratsList = array_unique($contratsList);
$filteredContrats = array_intersect($defaultContrat, $contratsList);
$contrats = [];
// DELETE SESSION
if ($request->getMethod() == 'GET' && !$url_libelle && !$request->query->get('page')) {
if ($session->has('s_location')) {
$session->remove('s_location');
}
if ($session->has('s_categorie')) {
$session->remove('s_categorie');
}
if ($session->has('s_minMax')) {
$session->remove('s_minMax');
}
if ($session->has('s_order')) {
$session->remove('s_order');
}
if ($session->has('s_contrat')) {
$session->remove('s_contrat');
}
if ($session->has('s_salary')) {
$session->remove('s_salary');
}
}
if ($request->getMethod() == "GET") {
$urlData = $this->transformURL($url_libelle);
$defaultSearch = $urlData['search'] ?? "";
// GET FROM SESSION
$page = $request->query->getInt('page');
if ($page != 0) {
$defaultLocation = $session->get('s_location') ?? $defaultLocation;
$defaultCategorie = $session->get('s_categorie') ?? $defaultCategorie;
$defaultMinMax = $session->get('s_minMax') ?? $defaultMinMax;
$defaultOrder = $session->get('s_order') ?? $defaultOrder;
$contrats = $session->get('s_contrat') ?? $contrats;
$salary = $session->get('s_salary') ?? $defaultSalary;
}
}
$order = $request->request->get('order', $defaultOrder);
/** @var array $location */
$location = $request->request->get('location', $defaultLocation);
$keyword = $request->request->get('search', $defaultSearch);
$minMax = $request->request->get('min', $defaultMinMax);
$category = $request->request->get('category', $defaultCategorie);
$contrats = $request->request->get('contrat', $contrats);
$salary = $request->request->get('salary', $defaultSalary);
// SET SESSION ON POST
if ($request->getMethod() == "POST") {
$session->set('s_location', $location);
$session->set('s_categorie', $category);
$session->set('s_minMax', $minMax);
$session->set('s_order', $order);
$session->set('s_contrat', $contrats);
$session->set('s_salary', $salary);
}
$loc = implode(', ', $location);
$cont = implode(', ', $contrats);
$alert = $offerAlertRepository->findOneBy([
'keyword' => $keyword,
'localisation' => $loc,
'remote' => $category,
'min_tjm' => $minMax == null ? 0 : $minMax,
'contrats' => $cont,
'user' => $user,
]);
$knpPage = $request->get('page', 1);
$knpPerPage = 10;
// Correction : forcer la page à 1 lors d'un POST (modification de filtre)
if ($request->getMethod() === 'POST') {
$knpPage = 1;
}
$offerViewed = [];
if ($user) {
$offerViewed = array_map(
function ($visit) {
return $visit->getOffer()->getId();
},
$user->getOfferVisits()->toArray()
);
}
if ($minMax == '') {
$minMax = 0;
}
if ($salary == '') {
$salary = 0;
}
if ($user !== null && !$user->isFreelance()) {
$contrats = ["Freelance"];
}
if ($request->getPathInfo() == '/missions-freelance') {
$template = $entityManager->getRepository(Publication::class)->findOneBy([
'template' => true,
'slug' => 'mission-freelance'
]);
} elseif ($request->getPathInfo() == '/emploi') {
$contrats = ['CDI', 'CDD', 'Alternance', 'Stage'];
$template = $entityManager->getRepository(Publication::class)->findOneBy([
'template' => true,
'slug' => 'emploi'
]);
} elseif ($request->getPathInfo() == '/alternance') {
$contrats = ['Alternance'];
$template = $entityManager->getRepository(Publication::class)->findOneBy([
'template' => true,
'slug' => 'alternance'
]);
} elseif ($request->getPathInfo() == '/stage') {
$contrats = ['Stage'];
$template = $entityManager->getRepository(Publication::class)->findOneBy([
'template' => true,
'slug' => 'stage'
]);
} elseif (preg_match('#^/emploi-[\w-]+$#', $request->getPathInfo())) {
$contrats = ['CDI', 'CDD', 'Alternance', 'Stage'];
$slug = $url_libelle == "" ? str_replace('/', '', $request->getPathInfo()) : 'emploi-' . $url_libelle;
$template = $entityManager->getRepository(Publication::class)->findOneBy([
'template' => true,
'slug' => $slug
]);
} else {
$template = $entityManager->getRepository(Publication::class)->findOneBy([
'template' => true,
'slug' => 'freelance-' . $url_libelle
]);
}
// dd($salary);
/** @var Offer[] $data */
$data = $offerRepository->findBySearch($keyword, $location, $minMax, $category, $salary, $order, $contrats/*, $user !== null && $user->isFreelance()*/);
$data_offer_not_online = $offerRepository->findOneBy(["slug" => '10294-developpeur-nuxeo-tt-java-j2ee-springboot']);
// DEFAULT OFFER IF NO FOUND
$noFound = false;
// dd($data);
// Obtenez les données complètes si le nombre total d'offres est inférieur à 5
if (count($data) < 5) {
$data_all = $this->offerIfNofound(['Toute la France'], $offerRepository, $user && $user->isFreelance() ? [] : $contrats, $order);
if (count($data) == 0) {
$noFound = true;
if (($user && $user->isFreelance())) {
$data = $data_all;
}
}
}
$highlightedMissions = $this->getHighLightMission($data, $request->query->get('page'));
$otherBoostMissions = $this->getOtherBoostMission($data, $request->query->get('page'), $entityManager);
// $offers = $paginator->paginate(
// $data,
// $request->query->getInt('page', $knpPage),
// $knpPerPage
// );
if (count($data) < 5 && count($data) > 0) {
$offers = $data;
$data_all_offers = $paginator->paginate(
$data_all,
$request->query->getInt('page', $knpPage),
$knpPerPage
);
} else {
$data_all_offers = [];
$offers = $paginator->paginate(
$data,
$request->query->getInt('page', $knpPage),
$knpPerPage
);
}
// Build external company map by offer id for offers without linked society
$externalCompanies = [];
$collectOffers = function ($items) {
$out = [];
if (is_iterable($items)) {
foreach ($items as $it) { $out[] = $it; }
}
return $out;
};
$allOfferObjects = [];
$allOfferObjects = array_merge($allOfferObjects, is_array($data) ? $data : []);
$allOfferObjects = array_merge($allOfferObjects, isset($data_all) && is_array($data_all) ? $data_all : []);
$allOfferObjects = array_merge($allOfferObjects, $collectOffers($offers));
$allOfferObjects = array_merge($allOfferObjects, $collectOffers($data_all_offers));
$allOfferObjects = array_merge($allOfferObjects, isset($highlightedMissions) && is_array($highlightedMissions) ? $highlightedMissions : []);
$allOfferObjects = array_merge($allOfferObjects, isset($otherBoostMissions) && is_array($otherBoostMissions) ? $otherBoostMissions : []);
foreach ($allOfferObjects as $off) {
if ($off instanceof Offer) {
if ($off->getSociety() === null) {
$siren = method_exists($off, 'getSiren') ? $off->getSiren() : null;
if ($siren) {
$info = $this->externalCompanyRepository->findCompanyBySiren($siren);
if ($info) {
$externalCompanies[$off->getId()] = $info;
}
}
}
}
}
// Paginer $data_all
// $data_all_offers = $paginator->paginate(
// $data_all,
// $request->query->getInt('page', $knpPage),
// $knpPerPage
// );
// $data_all_offers=[];
// template lié à url_libelle
// FLUSH OTHER BOOST DATE
$entityManager->flush();
$mission_region_spec = [
"Nantes" => ["44 Loire-Atlantique", "Mission freelance et offres d'emploi sur Nantes et sur toute la France. Avec ou sans télétravail, de moyenne et longue durée, à Nantes comme aux Pays de la Loire, de nombreuses missions sont disponibles."],
"Lyon" => ["69 Rhône", "Mission freelance et offres d'emploi sur Lyon et sur toute la France. Avec ou sans télétravail, de moyenne et longue durée, à Lyon comme en Auvergne-Rhône-Alpes, de nombreuses missions sont disponibles."],
"Toulouse" => ["31 Haute-Garonne", "Mission freelance et offres d'emploi sur Toulouse et sur toute la France. Avec ou sans télétravail, de moyenne et longue durée, à Toulouse comme en Occitanie, de nombreuses missions sont disponibles."],
"Marseille" => ["13 Bouches-du-Rhône", "Mission freelance et offres d'emploi sur Marseille et sur toute la France. Avec ou sans télétravail, de moyenne et longue durée, à Marseille comme en Provence-Alpes-Côte d'Azur, de nombreuses missions sont disponibles."],
"Nice" => ["06 Alpes-Maritimes", "Mission freelance et offres d'emploi sur Nice et sur toute la France. Avec ou sans télétravail, de moyenne et longue durée, à Nice comme en Provence-Alpes-Côte d'Azur, de nombreuses missions sont disponibles."],
"Bordeux" => ["33 Gironde", "Mission freelance et offres d'emploi sur Bordeaux et sur toute la France. Avec ou sans télétravail, de moyenne et longue durée, à Bordeaux comme en Nouvelle-Aquitaine, de nombreuses missions sont disponibles."],
"Lille" => ["59 Nord", "Mission freelance et offres d'emploi sur Lille et sur toute la France. Avec ou sans télétravail, de moyenne et longue durée, à Lille comme en Hauts-de-France, de nombreuses missions sont disponibles."],
"Paris" => ["75 Paris", "Mission freelance et offres d'emploi sur Paris et sur toute la France. Avec ou sans télétravail, de moyenne et longue durée, à Paris comme en Ile-de-France, de nombreuses missions sont disponibles."],
];
// Variable pour stocker le titre slugifié
$title = '';
$description = '';
// if (!empty($template)){
// foreach ($template as $temp){
// $title = $temp->getTitle();
// $description = $temp->getDescription();
// }
// }
// Vérifier si la ville sélectionnée est une clé dans $mission_region_spec
if (array_key_exists($citySelected, $mission_region_spec)) {
// Vérifier si la valeur correspond à celle dans $exeptedLocation
if ($mission_region_spec[$citySelected][0] == $exeptedLocation[0]) {
// Créer le slug à partir de la ville sélectionnée
$title = $citySelected;
$description = $mission_region_spec[$citySelected][1];
}
}
if ($template != null) {
$template->setView($template->getView() + 1);
$entityManager->persist($template);
$entityManager->flush();
}
return $this->render('search/missions.html.twig', [
'description' => $description,
'title' => $title,
'template' => $template,
'regions' => FrenchRegion::REGION_DEPARTEMENT,
'contrats' => $contrats,
'salary' => $salary,
'defaultContrat' => $filteredContrats,
'offers' => $offers,
'data_all_offers' => $data_all_offers,
'offers_of_line' => $data_offer_not_online,
'order' => $order,
'keyword' => $keyword,
'location' => $location,
'category' => $category,
'minMax' => $minMax,
'offerViewed' => $offerViewed,
'keywordArray' => $keyword == '' ? [] : explode(',', $keyword),
'isComing' => (bool)$this->getParameter('is_coming'),
'date_coming_soon' => $this->getParameter('date_coming_soon'),
'alert' => $alert,
'regionjson' => json_encode(FrenchRegion::REGION_DEPARTEMENT, JSON_UNESCAPED_UNICODE),
'highlightedMissions' => $highlightedMissions ?? [],
'otherBoostMissions' => $otherBoostMissions ?? [],
'isFreelance' => $user && $user->isFreelance(),
'noFound' => $noFound,
'currentDate' => $currentDate,
'citySelected' => $citySelected,
'externalCompanies' => $externalCompanies,
]);
}
/**
* changelog 2022-09-22 [FIX] (Anthony) Modifier le recherche par mobilité et re developper les tri sur la recherche
*
* @Route("/recherche-profils", name="freelance_search")
*
* @IsGranted("ROLE_USER")
*
* @param Request $request
* @param ProfileRepository $profileRepository
* @param ProfileVisitRepository $profileVisitRepository
* @param PaginatorInterface $paginator
* @param SkillRepository $skillRepository
*
* @return Response
*/
public function freelance(
Request $request,
ProfileRepository $profileRepository,
ProfileVisitRepository $profileVisitRepository,
PaginatorInterface $paginator,
SkillRepository $skillRepository,
SocietyRepository $societyRepository,
Config $config
): Response {
/* @var User $user */
$user = $this->getUser();
if ($user && $user->isFreelance()) {
return $this->redirectToRoute('dashboard');
}
$viewMonth = [];
$closeToEndOfMonth = false;
$limitInMonth = false;
$society = $user->getSociety();
$packageDate = $society->getPackageDate();
if ($packageDate) {
$packageExpireAt = $society->getPackageExpireAt(); // Supposons que c'est un objet DateTime
// Obtenir la date actuelle
$currentDate = new DateTime();
$dayOfPackage = $packageDate->format('d');
// Créer la date de début sur la base de la date du package
$StartDate = new DateTime($currentDate->format('Y-m') . '-' . $dayOfPackage); // Le même jour du mois actuel
$StartDateFormatted = $StartDate->format('Y-m-d'); // Format de la date de début
// Créer la date de fin (même jour du mois suivant)
$EndDate = (clone $StartDate)->modify('+1 month');
$EndDateFormatted = $EndDate->format('Y-m-d'); // Format de la date de fin
// Create the EndDate + 1 month for the comparison
$EndDatePlusOneMonth = (clone $EndDate)->modify('+1 month');
// Check if packageExpireAt is between EndDate and EndDate + 1 month and the package is not 'month'
$closeToEndOfMonth = (
$packageExpireAt >= $EndDate &&
$packageExpireAt <= $EndDatePlusOneMonth &&
$society->getPackage() !== 'month'
);
// Vérifier si la date d'expiration du package a été dépassée
$limitInMonth = $society->getPackage() !== 'month' && $packageExpireAt > $EndDate && $packageExpireAt >= $EndDatePlusOneMonth;
if ($packageExpireAt > $EndDate) {
$viewMonth = $profileVisitRepository->getProfileSocietyViewDailyByPeriod($society, $StartDateFormatted, $EndDateFormatted, 'month');
}
}
if ($society) {
if ($society->packageActive()) {
if ($society->packageActive()->isIsOnlyAnnonce()) {
$this->addFlash('package_error_annonce_only', " Vous ne pouvez pas consulter cette page avec votre accès.");
return $this->redirectToRoute('dashboard');
}
}
}
$packageList = $config->packageList();
$packageKey = $society->getPackage();
if (array_key_exists($packageKey, $packageList)) {
$package = $packageList[$packageKey];
// renouvellement limit profileView à chaque mois
if (!empty($viewMonth) && $viewMonth[0]['count'] == 0) {
$society->setProfileView($package['profileView']);
}
}
$contrats = $request->get('contrat', []);
$order = $request->get('order', 'pertinence');
$location = $request->get('mobility', []);
$experiences = $request->get('experiences', []);
$keywords = $request->get('search', '');
$max = $request->get('max', 0);
$salary = $request->get('salary', 0);
$favori = $request->get('favori', 'false');
$type = $request->get('type', '');
$disponibility = $request->get('disponibility', '');
$knpPage = $request->get('page', 1);
$knpPerPage = 10;
if ($max == "") {
$max = 0.0;
}
if ($salary == "") {
$salary = 0.0;
}
/* @changelog 2022-09-22 [FIX] (Anthony) Permettre l'encapsulation de region, departement et vile sur la recherche par mobilité */
// $data = $profileRepository->findBySearch($keywords, $location, $max, $type, $disponibility, $experiences, $order, $contrats, $salary, $favori, $this->getUser());
// $data = $this->removeIntercontratExpied($data, $profileRepository, $societyRepository);
// if (self::FILTER_PERTINENCE == $order) {
// $data = $this->filterDataKeywordByPertinence($data, $profileRepository, $skillRepository, $keywords);
// }
// /* @changeLog 2022-11-02 [FIX] (Anthony) Mise en place des intercontrats en une */
// $highlightedProfiles = $this->getHighLightProfile($data, $request->query->get('page'));
// $profiles = $paginator->paginate(
// $data,
// $request->query->getInt('page', $knpPage),
// $knpPerPage
// );
// 1. Récupérer le QueryBuilder (au lieu d'un tableau)
$queryBuilder = $profileRepository->findBySearchQueryBuilder(
$keywords,
$location,
$max,
$type,
$disponibility,
$experiences,
$order,
$contrats,
$salary,
$favori,
$this->getUser()
);
// 2. Paginer directement sur le QueryBuilder
$profilesPagination = $paginator->paginate(
$queryBuilder,
$request->query->getInt('page', $knpPage),
$knpPerPage
);
// 3. Récupérer seulement les profils de la page courante
$profilesPage = $profilesPagination->getItems();
// 4. Appliquer les filtres lourds seulement sur la page courante
$profilesPage = $this->removeIntercontratExpied($profilesPage, $profileRepository, $societyRepository);
// if (self::FILTER_PERTINENCE == $order) {
// $profilesPage = $this->filterDataKeywordByPertinence($profilesPage, $profileRepository, $skillRepository, $keywords);
// }
// 5. Optionnel : mettre à jour les items dans la pagination pour la vue
$profilesPagination->setItems($profilesPage);
// 6. Récupérer les profils mis en avant (sur la page filtrée)
$highlightedProfiles = $this->getHighLightProfile($profilesPage, $request->query->get('page'));
/* @changeLog 2022-11-10 [EVOL] (Anthony) Mise en place de la limitation de lecture de cv */
$society = $user->getSociety();
$view = $profileVisitRepository->countBySociety($society);
/* Limitation de l'abonnement */
$cycleStart = null;
$cycleEnd = null;
$activeCommande = $society->packageActive();
if ($activeCommande) {
$cycleStart = $activeCommande->getCreatedAt();
$cycleEnd = $activeCommande->getEndDate();
} else {
$packageDate = $society->getPackageDate();
if ($packageDate) {
$today = new \DateTime();
$dayOfPackage = (int)$packageDate->format('d');
$currentDay = (int)$today->format('d');
$startMonth = $currentDay < $dayOfPackage ? (clone $today)->modify('-1 month')->format('Y-m') : $today->format('Y-m');
$cycleStart = new \DateTime($startMonth . '-' . str_pad((string)$dayOfPackage, 2, '0', STR_PAD_LEFT) . ' 00:00:00');
$cycleEnd = (clone $cycleStart)->modify('+1 month');
}
}
$profileIds = $profileVisitRepository->findDistinctProfileIdsBySocietyBetween($society, $cycleStart, $cycleEnd);
$profileView = count($profileIds);
$profileViewByUser = $profileVisitRepository->findByUser($user);
$profileByUser = [];
foreach ($profileViewByUser as $visit) {
$profileByUser[] = $visit['id'];
}
/* Limitation journalière alignée à l'heure de début du package (fenêtre 24h) */
$startAt = date("Y-m-d") . ' 00:00:01';
$endAt = date("Y-m-d") . ' 23:59:59';
$packageAnchor = null;
$activeCommande = $society ? $society->packageActive() : null;
if ($activeCommande) {
$packageAnchor = $activeCommande->getCreatedAt();
} else if ($society) {
$packageAnchor = $society->getPackageDate();
}
if ($packageAnchor) {
$now = new DateTime();
$anchorTime = $packageAnchor->format('H:i:s');
$todayAnchor = new DateTime($now->format('Y-m-d') . ' ' . $anchorTime);
if ($now < $todayAnchor) {
$todayAnchor->modify('-1 day');
}
$dailyStart = $todayAnchor;
$dailyEnd = (clone $dailyStart)->modify('+1 day');
$startAt = $dailyStart->format('Y-m-d H:i:s');
$endAt = $dailyEnd->format('Y-m-d H:i:s');
}
$ProfilesVisitDaily = $profileVisitRepository->findBySocietyDaily($society, $startAt, $endAt);
$profileDailyIds = [];
foreach ($ProfilesVisitDaily as $visitDaily) {
$profileDailyIds[] = $visitDaily['id'];
}
$profileViewDaily = count(array_unique($profileDailyIds));
$dayLimit = 150;
$packageLimit = ($society->getProfileView());
$defaultContrat = ['Freelance', 'CDI', 'CDD', 'Alternance', 'Stage'];
return $this->render('search/freelance.html.twig', [
'profiles' => $profilesPagination,
'defaultContrat' => $defaultContrat,
'contrats' => $contrats,
'keyword' => $keywords,
'location' => $location,
'max' => $max,
'salary' => $salary,
'order' => $order,
'type' => $type,
'keywordArray' => $keywords == '' ? [] : explode(',', $keywords),
'regions' => FrenchRegion::REGION_DEPARTEMENT,
'regionjson' => json_encode(FrenchRegion::REGION_DEPARTEMENT, JSON_UNESCAPED_UNICODE),
'disponibilities' => Disponibility::LIST,
'experiencies' => Experience::LIST_FOR_PROFILE,
'experiences' => $experiences,
'disponibility' => $disponibility,
'highlightedProfiles' => $highlightedProfiles ?? [],
'profileViewDaily' => $profileViewDaily,
'profileView' => $profileView,
'dayLimit' => $dayLimit,
//'dayLimit' => 4,
'packageLimit' => $packageLimit,
// 'packageLimit' => 0,
'closeToEndOfMonth' => $closeToEndOfMonth,
'limitInMonth' => $limitInMonth,
'endDatePackage' => $EndDate ?? null,
'profileIds' => array_unique($profileIds),
'profileViewByUser' => array_unique($profileByUser),
'favori' => $favori
]);
}
/**
* Récuperer la region et le departement
*
* @param $needle //"Le mot clé"
* @param array $haystack //"Le tableau lequel on fait la recherche"
*
* @return array|bool
*/
public
function array_recursive_search_key_map(
$needle,
array $haystack
) {
foreach ($haystack as $first_level_key => $value) {
if ($needle === $value) {
return array($first_level_key);
} elseif (is_array($value)) {
$callback = $this->array_recursive_search_key_map($needle, $value);
if ($callback) {
return array_merge(array($first_level_key), $callback);
}
}
}
return false;
}
/**
* changelog 2022-09-28 [FIX] (Anthony) Formatter les données de la mobilité
*
* @param array $haystack Les region et departement à rechercher
* @param array $mobilities Les mobilités à rechercher
*
* @return array
*/
private
function getMobilities(
$haystack,
array $mobilities = []
): array {
$results = ["Toute la France"];
if (count($mobilities) == 1 && array_values($mobilities)[0] != "Toute la France" && in_array($mobilities[0], FrenchRegion::REGION)) {
foreach ($mobilities as $mobility) {
$results[] = $mobility;
}
} else {
foreach ($mobilities as $mobility) {
$regionAndDepartment = $this->array_recursive_search_key_map($mobility, $haystack);
$results[] = $regionAndDepartment[self::REGION];
$results[] = $regionAndDepartment[self::DEPARTMENT];
}
}
return $results;
}
/**
* changelog 2022-09-22 [FIX] (Anthony) Formatter les données de la mobilité
*
* @param array $datas //Les region et departement à rechercher
* @param $order //Filtre de la recherche
* @param ProfileRepository $profileRepository //La classe profile repository
* @param array $mobilities //Les mobilités à rechercher
*
* @return array
*/
private
function checkProfilesByMobility($datas, $profileRepository, $order, $mobilities = [])
{
$results = ["Toute la France"];
if (count($mobilities) == 1 && array_values($mobilities)[0] == "Toute la France") {
$data = $profileRepository->findByMobility($order, $results);
} else if (count($mobilities) == 1 && array_values($mobilities)[0] != "Toute la France" && in_array($mobilities[0], FrenchRegion::REGION)) {
foreach ($mobilities as $mobility) {
$results[] = $mobility;
}
$data = $profileRepository->findByMobility($order, $results);
} else {
foreach ($mobilities as $mobility) {
$regionAndDepartment = $this->array_recursive_search_key_map($mobility, $datas);
$results[] = $regionAndDepartment[self::REGION];
$results[] = $regionAndDepartment[self::DEPARTMENT];
}
$data = $profileRepository->findByMobility($order, array_unique($results));
}
return $data;
}
/**
* changelog 2022-09-27 [FIX] (Anthony) Formatter les données des missions par mot clé
*
* @param array $keywords //Les mots clé à rechercher
* @param OfferRepository $offerRepository //La classe offer repository
* @param $order //Filtre de la recherche
*
* @return array
*/
private
function checkOfferByKeword($keywords, $offerRepository, $order)
{
$data = $offerRepository->findByKeyword($keywords, $order);
return $data;
}
/**
* changelog 2022-09-26 [FIX] (Anthony) Formatter les données des freelances par mot clé
*
* @param $keywords // Les mots clé à rechercher
* @param ProfileRepository $profileRepository //La classe profile repository
* @param $order // Filtre de la recherche
*
* @return array
*/
private
function checkProfilesByKeword($keywords, ProfileRepository $profileRepository, $order): array
{
return $profileRepository->findByKeyword($keywords, $order);
}
/**
* changelog 2022-09-26 [FIX] (Anthony) Formatter les données par type
*
* @param $type //Le type du profile
* @param ProfileRepository $profileRepository //La classe profile repository
* @param $order //Filtre de la recherche
*
* @return array
*/
private
function checkProfilesByType($type, ProfileRepository $profileRepository, $order): array
{
$data = $profileRepository->findByType($type, $order);
return $data;
}
/**
* changelog 2022-09-26 [FIX] (Anthony) Formater les données de la disponibilité
*
* @param $disponibility //La disponibilité du profile
* @param ProfileRepository $profileRepository //La classe profile repository
* @param $order //Filtre de la recherche
*
* @return array
*/
private
function checkProfilesByDisponibility($disponibility, ProfileRepository $profileRepository, $order): array
{
$data = $profileRepository->findByDisponibility($disponibility, $order);
return $data;
}
/**
* changelog 2022-09-26 [FIX] (Anthony) Formater les données de la TJM
*
* @param $cost //La TJM du profile
* @param ProfileRepository $profileRepository //La classe profile repository
* @param $order //Filtre de la recherche
*
* @return array
*/
private
function checkProfilesByCost($cost, ProfileRepository $profileRepository, $order): array
{
$data = $profileRepository->findByCost($cost, $order);
return $data;
}
/**
* changelog 2022-09-23 [FIX] (Anthony) Supprimé les doublons du tableau d'objet
*
* @param $array //Le tableau d'objet
* @param $keep_key_assoc
*
* @return array
*/
private
function my_array_unique($array, $keep_key_assoc = false)
{
$duplicate_keys = array();
$tmp = array();
foreach ($array as $key => $val) {
// convert objects to arrays, in_array() does not support objects
if (is_object($val))
$val = (array)$val;
if (!in_array($val, $tmp))
$tmp[] = $val;
else
$duplicate_keys[] = $key;
}
foreach ($duplicate_keys as $key)
unset($array[$key]);
return $keep_key_assoc ? $array : array_values($array);
}
private function removeIntercontratExpied($data, ProfileRepository $profileRepository, SocietyRepository $societyRepository)
{
// Filtrer la liste des profils
return array_filter($data, function ($profile) use ($societyRepository) {
// Vérifie si le profil est en intercontrat
if ($profile->isIntercontrat) {
// Récupère la société associée au profil
$society = $societyRepository->findOneBy(['user' => $profile->user]);
// Vérifie si la société existe et si son package est expiré
if ($society && $society->getPackageExpireAt() < new \DateTime()) {
// Exclure ce profil (retourne false pour ne pas l'inclure)
return false;
}
}
// Inclure ce profil
return true;
});
}
/**
* changelog 2022-09-23 [FIX] (Anthony) Filtrer les données freelances par mot clé par pertinence
*
* @param $data // Les données à filtrer
* @param ProfileRepository $profileRepository // La classe profile repository
* @param SkillRepository $skillRepository // La classe skill repository
* @param $keyword // Les mots clé
*
* @return array
*/
private
function filterDataKeywordByPertinence($data, ProfileRepository $profileRepository, SkillRepository $skillRepository, $keyword): array
{
$dataTitle = [];
$dataName = [];
$dataAbout = [];
$keyword = explode(' ', $keyword);
foreach ($data as $profile) {
foreach ($keyword as $key) {
$isCheckInTitle = stripos($profile->title, $key);
if ($isCheckInTitle > -1) {
$dataTitle[] = $profileRepository->find($profile->id);
continue;
}
}
$skillsData = $skillRepository->findBy(['profile' => $profile]);
$skillName = [];
foreach ($skillsData as $skill) {
$skillName[] = $skill->name;
}
$skillName = implode(',', $skillName);
foreach ($keyword as $key) {
$isCheckInSkill = stripos($skillName, $key);
if ($isCheckInSkill > -1) {
$dataName[] = $profileRepository->find($profile->id);
continue;
}
}
if (!empty($profile->about)) {
foreach ($keyword as $key) {
$isCheckInAbout = stripos($profile->about, $key);
if ($isCheckInAbout > -1) {
$dataAbout[] = $profileRepository->find($profile->id);
continue;
}
}
}
if (!empty($profile->cvText)) {
foreach ($keyword as $key) {
$isCheckInAbout = stripos($profile->cvText, $key);
if ($isCheckInAbout > -1) {
$dataAbout[] = $profileRepository->find($profile->id);
continue;
}
}
}
}
$dataTitle = $this->my_array_unique($dataTitle);
$dataName = $this->my_array_unique($dataName);
$dataAbout = $this->my_array_unique($dataAbout);
$dataTitleName = array_merge($dataTitle, $dataName);
$dataFilter = array_merge($dataTitleName, $dataAbout);
$dataFilter = $this->my_array_unique($dataFilter);
return $dataFilter;
}
/**
* changelog 2022-09-27 [FIX] (Anthony) Filtrer les données freelances par mot clé par pertinence
*
* @param $data //Les données à filtrer
* @param OfferRepository $offerRepository //La classe offer repository
* @param $keyword //Les mots clé
*
* @return array
*/
private
function filterOfferByPertinence($data, $offerRepository, $keyword)
{
$dataTitle = [];
$dataDescription = [];
$keyword = explode(' ', $keyword);
foreach ($data as $offer) {
foreach ($keyword as $kwd) {
$isCheckInTitle = stripos($offer->title, $kwd);
if ($isCheckInTitle > -1) {
$dataTitle[] = $offerRepository->find($offer->id);
continue;
}
}
if (!empty($offer->description)) {
foreach ($keyword as $kwd) {
$isCheckInDesc = stripos($offer->description, $kwd);
if ($isCheckInDesc > -1) {
$dataDescription[] = $offerRepository->find($offer->id);
continue;
}
}
}
}
$dataTitle = $this->my_array_unique($dataTitle);
$dataDescription = $this->my_array_unique($dataDescription);
$dataFilter = array_merge($dataTitle, $dataDescription);
$dataFilter = $this->my_array_unique($dataFilter);
return $dataFilter;
}
/**
* changelog 2022-09-23 [FIX] (Anthony) Filtrer les données par mobilité par pertinence
*
* @param $data //Les données à filtrer
* @param ProfileRepository $profileRepository //La classe profile repository
* @param $locations //Les mobilités
*
* @return array
*/
private
function filterDataMobilityByPertinence($data, ProfileRepository $profileRepository, $locations): array
{
$mobilities = [];
foreach ($locations as $mobility) {
$regionAndDepartment = $this->array_recursive_search_key_map($mobility, FrenchRegion::REGION_DEPARTEMENT_WITH_ALL);
$mobilities['region'][] = $regionAndDepartment[self::REGION];
$mobilities['departement'][] = $regionAndDepartment[self::DEPARTMENT];
}
$dataDepartement = [];
$dataRegion = [];
$dataFrance = [];
foreach ($data as $profile) {
foreach ($mobilities['departement'] as $departement) {
if (in_array($departement, $profile->mobility)) {
$dataDepartement[] = $profileRepository->find($profile->id);
continue;
}
}
foreach ($mobilities['region'] as $region) {
if (in_array($region, $profile->mobility)) {
$dataRegion[] = $profileRepository->find($profile->id);
continue;
}
}
if (in_array('Toute la France', $profile->mobility)) {
$dataFrance[] = $profileRepository->find($profile->id);
continue;
}
}
$dataRegionDepartement = array_merge($dataDepartement, $dataRegion);
$dataFilter = array_merge($dataRegionDepartement, $dataFrance);
return $dataFilter;
}
private
function shuffleData($data)
{
if (!is_array($data)) return $data;
$keys = array_keys($data);
shuffle($keys);
$random = array();
foreach ($keys as $key)
$random[$key] = $data[$key];
return $random;
}
private
function getHighLightProfile($data, $page)
{
$highLightProfile = [];
foreach ($data as $profile) {
if (is_null($profile->isHighlight)) {
continue;
}
$highLightProfile[] = $profile;
}
if (isset($page) && $page > 1) {
$highLightProfile = [];
}
$highLightProfile = $this->shuffleData($highLightProfile);
return array_slice($highLightProfile, 0, 2);
}
private
function getOfferOpenSociety($data, $user)
{
$offerOpenSociety = [];
foreach ($data as $mission) {
if ($mission->open_society == false && $user->type == 'society') {
continue;
}
$offerOpenSociety[] = $mission;
}
return $offerOpenSociety;
}
/**
* @param Offer[] $data
* @param int|null $page
* @return Offer[]
*/
private
function getHighLightMission(array $data, $page): array
{
$currentDate = new DateTime();
$highLightMission = [];
foreach ($data as $mission) {
if (!$mission->priorize || $mission->getExpireAt() < $currentDate) {
continue;
}
$highLightMission[] = $mission;
}
if (isset($page) && $page > 1) {
$highLightMission = [];
}
$highLightMission = $this->shuffleData($highLightMission);
return array_slice($highLightMission, 0, 2);
}
/**
* @param Offer[] $data
* @param int|null $page
* @param EntityManagerInterface $entityManager
* @return Offer[]
*/
private
function getOtherBoostMission(
array $data,
?int $page,
EntityManagerInterface $entityManager
): array {
if (isset($page) && $page > 1) {
return [];
}
$currentDate = new DateTime();
$otherBoostMission = [];
foreach ($data as $mission) {
if ($mission->getExpireAt() < $currentDate) {
continue;
}
if (!$mission->getDaily() && !$mission->getWeekly()) {
continue;
}
if ($mission->getDaily()) {
// Récupère la date et l'heure de création (createAt)
$createdAt = $mission->getCreatedAt();
$lastRemonte = $mission->getDateRemonter();
// Crée un nouvel objet DateTime basé sur l'heure de `createAt` mais avec la date du jour
$now = new DateTime(); // La date actuelle
$remonteTime = new DateTime($now->format('Y-m-d') . ' ' . $createdAt->format('H:i:s')); // Date du jour avec l'heure de `createAt`
// Si c'est l'heure du remonté, on met à jour la date de remontée
// Compare uniquement les heures et minutes
if ($now->format('H:i') === $remonteTime->format('H:i')) {
if (!$lastRemonte || $lastRemonte->format('Y-m-d') !== $now->format('Y-m-d')) {
// Met à jour la date de remontée
$mission->setDateRemonter($remonteTime);
$entityManager->persist($mission);
}
$otherBoostMission[] = $mission;
}
continue;
}
// Vérifier si la date de dernière remontée est null ou si elle est plus ancienne qu'une semaine
if ($mission->getWeekly()) {
$now = new DateTime();
$lastRemontDate = $mission->getDateRemonter(); // Dernière date de remontée
$createdAt = $mission->getCreatedAt(); // Date et heure de création
$currentDate = new DateTime(); // Date actuelle
$oneWeekAgo = (clone $currentDate)->modify('-1 week'); // Date d'une semaine en arrière
// Vérifier si une semaine s'est écoulée depuis la dernière remontée
if (($lastRemontDate === null || $lastRemontDate < $oneWeekAgo)) {
$remonteTime = new DateTime($now->format('Y-m-d') . ' ' . $createdAt->format('H:i:s')); // Date du jour avec l'heure de `createAt`
if ($currentDate->format('H:i') === $createdAt->format('H:i')) {
// Effectuer la remontée (ajouter la mission à la liste pour la journée)
$otherBoostMission[] = $mission; // Ajouter à la liste de remontée
}
if (!$lastRemontDate || $lastRemontDate->format('Y-m-d') !== $now->format('Y-m-d')) {
// Mettre à jour la date de remontée pour marquer la remontée
$mission->setDateRemonter($remonteTime);
// Persister les modifications
$entityManager->persist($mission);
$entityManager->flush(); // Sauvegarder les changements dans la base de données
}
}
}
}
$otherBoostMission = $this->shuffleData($otherBoostMission);
return array_slice($otherBoostMission, 0, 5);
}
}