<?php
namespace App\Controller;
use App\Entity\Candidature;
use App\Entity\Enum\Disponibility;
use App\Entity\Enum\FrenchRegion;
use App\Entity\Enum\Nationality;
use App\Entity\Enum\UAERegion;
use App\Entity\Enum\UAERegionNew;
use App\Entity\Offer;
use App\Entity\Profile;
use App\Entity\User;
use App\Form\FreelanceRegisterFormType;
use App\Form\ResetPasswordRequestFormType;
use App\Repository\CandidatureRepository;
use App\Repository\OfferAlertRepository;
use App\Repository\OfferRepository;
use App\Repository\ProfileRepository;
use App\Repository\ProfileVisitRepository;
use App\Repository\SkillRepository;
use App\Service\Forum\ForumUserService;
use App\Service\LocationService;
use App\Service\OfferService;
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
{
/* @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';
const substring = "-jobs-in-";
private function formatCityName($city): string
{
if ($city == "all-uae") {
return "All UAE";
}
// Remplacer les tirets par des espaces
$formattedCity = str_replace('-', ' ', $city);
// Mettre en majuscule la première lettre de chaque mot
$formattedCity = ucwords($formattedCity);
return $formattedCity;
}
private function transformURL($maChaine): array
{
$resultat = [];
if (strpos($maChaine, self::substring) !== false) {
// Séparer les parties de la chaîne en utilisant "-jobs-in-"
list($searchPart, $locationsPart) = explode(self::substring, $maChaine);
// Mettre la recherche en majuscule et séparer les mots par un espace
$resultat['search'] = str_replace('-', ' ', $searchPart);
// Séparer les emplacements (villes) en utilisant "-and-" et les stocker dans un tableau
$resultat['locations'] = array_map(array($this, 'formatCityName'), explode("-and-", $locationsPart));
} else {
$resultat['search'] = str_replace('-jobs', '', $maChaine);
$resultat['search'] = str_replace('-', ' ', $resultat['search']);
$resultat['locations'] = [];
}
return $resultat;
}
/**
* @param array $location
* @param OfferRepository $offerRepository
* @param LocationService $locationService
* @return Offer[]
*/
private function offerIfNofound(
array $location,
OfferRepository $offerRepository,
LocationService $locationService
): array
{
$defaultSearch = "";
$defaultExperience = [];
$defaultCategorie = '';
$defaultOrder = 'pertinence';
/** @var Offer[] $defaultOffer */
$defaultOffer = $offerRepository->findBySearch(
$defaultSearch,
$location,
$defaultExperience,
$defaultCategorie,
$defaultOrder
);
if (count($defaultOffer) == 0) {
$location = $this->findParentCities($location, $locationService->getSelectableArray());
$defaultOffer = $offerRepository->findBySearch(
$defaultSearch,
$location,
$defaultExperience,
$defaultCategorie,
$defaultOrder
);
}
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;
}
/**
* changelog 2022-09-27 [FIX] (Anthony) Modifier le recherche par mobilité et re developper les tri sur la recherche
*
* @Route("/{url_libelle}jobs{url_location}", name="mission_search", requirements={"url_libelle"=".*", "url_location"=".*"})
*
*
* @param Request $request
* @param OfferRepository $offerRepository
* @param OfferAlertRepository $offerAlertRepository
* @param PaginatorInterface $paginator
* @param CandidatureRepository $candidatureRepository
* @param OfferService $offerService
* @param LocationService $locationService
* @param EntityManagerInterface $entityManager
* @param SessionInterface $session
* @param string|null $url_libelle
* @param string|null $url_location
* @return Response
*/
public function missions(
Request $request,
OfferRepository $offerRepository,
OfferAlertRepository $offerAlertRepository,
PaginatorInterface $paginator,
CandidatureRepository $candidatureRepository,
OfferService $offerService,
LocationService $locationService,
EntityManagerInterface $entityManager,
SessionInterface $session,
ForumUserService $forumUserService,
?string $url_libelle = "",
?string $url_location = ""
): Response
{
$currentDate = new DateTime();
/* @var User $user */
$user = $this->getUser();
if ($user) {
if ($user->isFreelance()) {
$currentProfil = $user->getUniqueProfile();
if (!$currentProfil->getNationalityMultiple()) {
return $this->redirectToRoute('complete_resume_profile');
}
}
}
// DEFAULT SEARCH
$defaultSearch = "";
$defaultLocation = ['All UAE'];
$defaultExperience = [];
$defaultCategorie = '';
$defaultOrder = 'pertinence';
// DELETE SESSION
if ($request->getMethod() == 'GET'
&& (!$url_libelle || $url_libelle == 'search')
&& !$url_location
&& !$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_experience')) {
$session->remove('s_experience');
}
if ($session->has('s_order')) {
$session->remove('s_order');
}
}
if ($request->getMethod() == "GET" && ($url_location || $url_libelle)) {
$urlData = $this->transformURL($url_libelle . "-jobs" . $url_location);
$defaultSearch = $urlData['search'] ?? "";
$defaultLocation = $urlData['locations'] ?? ['All UAE'];
if ($url_libelle == "search" && !$url_location) {
$defaultSearch = "";
$defaultLocation = ['All UAE'];
}
$page = $request->query->getInt('page');
if ($page != 0) {
// GET FROM SESSION
$defaultLocation = $session->get('s_location') ?? $defaultLocation;
$defaultCategorie = $session->get('s_categorie') ?? $defaultCategorie;
$defaultExperience = $session->get('s_experience') ?? $defaultExperience;
$defaultOrder = $session->get('s_order') ?? $defaultOrder;
}
}
$order = $request->request->get('order', $defaultOrder);
/** @var string[] $location */
$location = $request->request->get('location', $defaultLocation);
$keyword = trim($request->request->get('search', $defaultSearch));
/** @var string[] $experience */
$experience = $request->request->get('experience', $defaultExperience);
$category = $request->request->get('category', $defaultCategorie);
$loc = implode(', ', $location);
// SET SESSION ON POST
if ($request->getMethod() == "POST") {
$session->set('s_location', $location);
$session->set('s_categorie', $category);
$session->set('s_experience', $experience);
$session->set('s_order', $order);
}
// FIND ALERT
$alert = $offerAlertRepository->findOneBy([
'keyword' => $keyword,
'localisation' => $loc,
'typeSearch' => $category,
'user' => $user,
]);
$knpPage = $request->get('page', 1);
$knpPerPage = 10;
$offerViewed = [];
if ($user) {
$offerViewed = array_map(
function ($visit) {
return $visit->getOffer()->getId();
},
$user->getOfferVisits()->toArray()
);
}
// FILTER LOCATION BY DEPARTEMENT
$locationByDepart = $locationService->getUAEByArray($location);
$data = $offerRepository->findBySearch($keyword, $locationByDepart, $experience, $category, $order);
if ($order == "pertinence" && $keyword) {
$data = $this->filterOfferByPertinence($data, $offerRepository, $keyword);
}
// FILTER OFFER BY EXPIRED AT
$data = $offerService->filterOfferByExpire($data);
// DEFAULT OFFER IF NO FOUND
$noFound = false;
if (count($data) == 0) {
$noFound = true;
$data = $this->offerIfNofound($location, $offerRepository, $locationService);
}
$highlightedMissions = $this->getHighLightMission($data, $request->query->get('page'));
$otherBoostMissions = $this->getOtherBoostMission($data, $request->query->get('page'), $entityManager);
$highlightedMissions = $offerService->filterOfferByExpire($highlightedMissions);
$otherBoostMissions = $offerService->filterOfferByExpire($otherBoostMissions);
/** @var Offer[] $offers */
$offers = $paginator->paginate(
$data,
$request->query->getInt('page', $knpPage),
$knpPerPage
);
/** @var Candidature $userCandidatures */
$userCandidatures = [];
$offerCandidatureIds = [];
if ($user) {
$userCandidatures = $candidatureRepository->findBy(['profile' => $user->getUniqueProfile()]);
foreach ($userCandidatures as $candidature) {
$offerCandidatureIds[] = $candidature->getOffer()->getId();
}
}
// FORM CREATE
$userJobseeker = new User();
$userJobseeker->setCreatedAt(new \DateTime());
$userJobseeker->setRoles(['ROLE_FREELANCE']);
$userJobseeker->setType('freelance');
$userJobseeker->setPhone('');
$formJobseeker = $this->createForm(FreelanceRegisterFormType::class, $userJobseeker, [
'forumPseudo' => $forumUserService->getNextForumUserID()
]);
$resetForm = $this->createForm(ResetPasswordRequestFormType::class);
// FLUSH OTHER BOOST DATE
$entityManager->flush();
return $this->render('search/missions.html.twig', [
'regions' => $locationService->getSelectableArray(),
'offers' => $offers,
'order' => $order,
'keyword' => $keyword,
'location' => $location,
'category' => $category,
'experience' => $experience,
'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($locationService->getSelectableArray(), JSON_UNESCAPED_UNICODE),
'highlightedMissions' => $highlightedMissions ?? [],
'otherBoostMissions' => $otherBoostMissions ?? [],
'isFreelance' => $user ? $user->isFreelance() : false,
'offerCandidatureIds' => $offerCandidatureIds,
'formJobseeker2' => $formJobseeker->createView(),
'resetForm' => $resetForm->createView(),
'noFound' => $noFound,
'currentDate' => $currentDate,
]);
}
/**
* changelog 2022-09-22 [FIX] (Anthony) Modifier le recherche par mobilité et re developper les tri sur la recherche
*
* @Route("/profile/search", name="freelance_search")
*
* @IsGranted("ROLE_SOCIETY")
*
* @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
): Response
{
/* @var User $user */
$user = $this->getUser();
if ($user && $user->isFreelance()) {
return $this->redirectToRoute('dashboard');
}
$order = $request->get('order', 'pertinence');
$location = $request->get('mobility', []);
$nationalities = $request->get('nationality', '');
$expNumber = $request->get('exp_number', null);
$keywords = $request->get('search', '');
$max = $request->get('max', 0);
$type = $request->get('type', 'Full-time');
$disponibility = $request->get('disponibility', '');
$knpPage = $request->get('page', 1);
$knpPerPage = 10;
if (!$expNumber) {
$expNumber = 0;
}
if (!$max) {
$max = 0;
}
$data = $profileRepository->findBySearch($keywords, $expNumber, $nationalities, $max, $order);
/* @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
);
/* @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 */
$ProfilesVisit = $profileVisitRepository->findBySociety($society);
$profileIds = [];
foreach ($ProfilesVisit as $visit) {
$profileIds[] = $visit['id'];
}
$profileView = count(array_unique($profileIds));
/* Limitation journalière */
$startAt = date("Y-m-d") . ' 00:00:01';
$endAt = date("Y-m-d") . ' 23:59:59';
$ProfilesVisitDaily = $profileVisitRepository->findBySocietyDaily($society, $startAt, $endAt);
$profileDailyIds = [];
foreach ($ProfilesVisitDaily as $visitDaily) {
$profileDailyIds[] = $visitDaily['id'];
}
$profileViewDaily = count(array_unique($profileDailyIds));
$dayLimit = 400;
$packageLimit = ($society->getProfileView());
$nationalitiesList = Nationality::LIST;
return $this->render('search/freelance.html.twig', [
'profiles' => $profiles,
'keyword' => $keywords,
'location' => $location,
'max' => $max,
'order' => $order,
'type' => $type,
'keywordArray' => $keywords == '' ? [] : explode(',', $keywords),
'regions' => FrenchRegion::REGION_DEPARTEMENT,
'regionjson' => json_encode(FrenchRegion::REGION_DEPARTEMENT, JSON_UNESCAPED_UNICODE),
'disponibilities' => Disponibility::LIST,
'disponibility' => $disponibility,
'highlightedProfiles' => $highlightedProfiles ?? [],
'profileViewDaily' => $profileViewDaily,
'profileView' => $profileView,
'dayLimit' => $dayLimit,
//'dayLimit' => 4,
'packageLimit' => $packageLimit,
//'packageLimit' => 4,
'profileIds' => array_unique($profileIds),
'nationalitiesList' => $nationalitiesList,
'nationalities' => $nationalities,
'expNumber' => $expNumber
]);
}
/**
* Récuperer la region et le departement
*
* @param $needle //"Le mot clé"
* @param $haystack //"Le tableau lequel on fait la recherche"
*
* @return array|bool
*/
public function array_recursive_search_key_map($needle, $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 $haystack // Les region et departement à rechercher
* @param $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(
array $datas,
ProfileRepository $profileRepository,
$order,
array $mobilities = []): array
{
$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 $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 $offerRepository,
$order): array
{
$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
{
return $profileRepository->findByType($type, $order);
}
/**
* 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
{
return $profileRepository->findByDisponibility($disponibility, $order);
}
/**
* 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, $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): array
{
$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);
}
/**
* 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, $skillRepository, $keyword)
{
$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 $offerRepository, $keyword): array
{
$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);
}
/**
* @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->getDateRemonter()) {
$mission->setDateRemonter(new DateTime());
$entityManager->persist($mission);
}
if ($mission->getDaily()) {
$otherBoostMission[] = $mission;
continue;
}
$testDate = DateTime::createFromFormat("Ymd H:i", $mission->getDateRemonter()->format("Ymd H:i"));
if ($mission->getWeekly()) {
$testDate->modify('+1 week');
}
if ($testDate > $currentDate) {
$otherBoostMission[] = $mission;
}
}
$otherBoostMission = $this->shuffleData($otherBoostMission);
return array_slice($otherBoostMission, 0, 5);
}
}