src/Controller/HomeController.php line 807

  1. <?php
  2. namespace App\Controller;
  3. use App\Entity\LikedBuilding;
  4. use App\Entity\UserForm;
  5. use App\Services\Mails\Mails;
  6. use App\Services\RecaptchaService;
  7. use App\Form\ContactForm;
  8. use App\Form\UserForm\AttestationUserFormType;
  9. use App\Form\UserForm\OwnerUserFormType;
  10. use App\Form\UserForm\TenantUserFormType;
  11. use App\Form\UserForm\NewsletterUserFormType;
  12. use App\Entity\User;
  13. use App\Entity\Building;
  14. use App\Repository\UserFormRepository;
  15. use App\Repository\LikedBuildingRepository;
  16. use App\Repository\BuildingRepository;
  17. use App\Repository\CityRepository;
  18. use Symfony\Contracts\Translation\TranslatorInterface;
  19. use Symfony\Bundle\FrameworkBundle\Controller\AbstractController;
  20. use Symfony\Component\HttpFoundation\Request;
  21. use Symfony\Component\Routing\Annotation\Route;
  22. use Doctrine\ORM\EntityManagerInterface;
  23. use Symfony\Component\Mailer\MailerInterface;
  24. use Symfony\Component\Mime\Email;
  25. use Symfony\Component\HttpFoundation\JsonResponse;
  26. use Symfony\Component\HttpFoundation\Response;
  27. use Symfony\Component\DependencyInjection\ParameterBag\ParameterBagInterface;
  28. class HomeController extends AbstractController
  29. {
  30.     private $cityRepository;
  31.     private $likedBuildingRepository;
  32.     private $translator;
  33.     private $userFormRepository;
  34.     private $entityManager;
  35.     private string $googleMapKey;
  36.     private RecaptchaService $recaptchaService;
  37.     public function __construct(
  38.         CityRepository $cityRepository,
  39.         LikedBuildingRepository $likedBuildingRepository,
  40.         TranslatorInterface $translator,
  41.         UserFormRepository $userFormRepository,
  42.         EntityManagerInterface $entityManager,
  43.         ParameterBagInterface $params,
  44.         RecaptchaService $recaptchaService
  45.     ) {
  46.         $this->cityRepository $cityRepository;
  47.         $this->likedBuildingRepository $likedBuildingRepository;
  48.         $this->translator $translator;
  49.         $this->userFormRepository $userFormRepository;
  50.         $this->entityManager $entityManager;
  51.         $this->googleMapKey $params->get('app.googlemapkey');
  52.         $this->recaptchaService $recaptchaService;
  53.     }
  54.     #[Route(path: ["fr" => "/""en" => "/en/",], name'home')]
  55.     public function index(BuildingRepository $buildingRepositoryLikedBuildingRepository $likedBuildingRepositoryRequest $request)
  56.     {
  57.         $userForm false//fiche d'attente formulaire utilisateur
  58.         $landing true;
  59.         if($landing == true) return $this->redirectToRoute('landing');
  60.         if($userForm == true) return $this->redirectToRoute('userForm');
  61.     
  62.         $lng $request->query->get('lng');
  63.         $lat $request->query->get('lat');
  64.         $city $request->query->get('city');
  65.         $selectedCity null;
  66.         $selectedBuildings = [];
  67.     if ($userForm == true) {
  68.         return $this->redirectToRoute('userForm'); 
  69.     }
  70.     if ($landing == true) {
  71.         return $this->redirectToRoute('landing'); 
  72.     }
  73.     
  74.     $lng $request->query->get('lng');
  75.     $lat $request->query->get('lat');
  76.     $city $request->query->get('city');
  77.     $selectedCity null;
  78.     $selectedBuildings = [];
  79.     if ($city != "null") {
  80.         $selectedCity $this->cityRepository->findOneBy(['city' => $city]);
  81.         if ($selectedCity != null) {
  82.             $selectedBuildings $buildingRepository->findBy(
  83.                 ['cityEntity' => $selectedCity->getId(), 'isEnd' => true'isActive' => true],
  84.                 ['id' => 'DESC']
  85.             );
  86.         }
  87.     }
  88.     $cities $this->cityRepository->findBy(['isInsideHomepage' => true]);
  89.     $filter $request->query->get('filter');
  90.     $filterChoice = match ($filter) {
  91.         'appartement' => "typeBien.appartement",
  92.         'chambre_privee' => "typeBien.chambrePrivee",
  93.         'chambre_partagee' => "typeBien.chambrePartagee",
  94.         'bons_plans' => "Bon plan",
  95.         default => null,
  96.     };
  97.     $buildingss = [];
  98.     foreach ($cities as $city) {
  99.         $buildingss[$city->getCity()] = $buildingRepository->findByIsInHomepage($city->getId(), $filterChoice);
  100.     }
  101.     // Récupérer l'utilisateur actuel
  102.     $user $this->getUser();
  103.     $buildings $buildingRepository->findBy(['isEnd' => true'isActive' => true], ['id' => 'DESC']);
  104.     $likedBuildings = [];
  105.     foreach ($buildings as $building) {
  106.         $isLiked $this->likedBuildingRepository->findOneBy(['user' => $user'building' => $building]) !== null;
  107.         $likedBuildings[$building->getId()] = $isLiked;
  108.     }
  109.     $buildingsLast = ($filterChoice != null)
  110.         ? $buildingRepository->findBy(['format' => $filterChoice'isEnd' => true'isActive' => true], ['id' => 'DESC'])
  111.         : $buildingRepository->findBy(['isEnd' => true'isActive' => true], ['id' => 'DESC'], 8);
  112.     $buildingsMap = [];
  113.     $buildingsMapData $buildingRepository->findByLatAndLngNotNull();
  114.     foreach ($buildingsMapData as $building) {
  115.         $buildingsMap[] = [
  116.             'lat' => $building->getLat(),
  117.             'lng' => $building->getLng(),
  118.             'id' => $building->getId(),
  119.         ];
  120.     }
  121.     $liked $likedBuildingRepository->findOneBy(['user' => $this->getUser(), 'building' => $building]);
  122.     return $this->render('home/index.html.twig', [
  123.         'building' => $building,
  124.         'likedBuildings' => $likedBuildings,
  125.         'liked' => $liked,
  126.         'cities' => $cities,
  127.         'lastBuildings' => $buildingsLast,
  128.         'arrayBuildings' => $buildingss,
  129.         'selectedCity' => $selectedCity,
  130.         'selectedBuildings' => $selectedBuildings,
  131.         'buildingsMap' => $buildingsMap,
  132.         'filter' => $filter,
  133.     ]);
  134. }
  135.     #[Route(path: ["fr" => "/mentions-legales""en" => "/en/mentions-legales",], name'mentions_legales')]
  136.     public function mentionsLegales()
  137.     {
  138.         return $this->render('mentionslegales/mentions_legales.html.twig', []);
  139.     }
  140.     public function enleveaccents($param)
  141.     {
  142.         $param strtr(
  143.             $param,
  144.             [
  145.                 "À" => 'A',
  146.                 "Á" => 'A',
  147.                 "Â" => 'A',
  148.                 "Ã" => 'A',
  149.                 "Ä" => 'A',
  150.                 "Å" => 'A',
  151.                 "à" => 'a',
  152.                 "á" => 'a',
  153.                 "â" => 'a',
  154.                 "ã" => 'a',
  155.                 "ä" => 'a',
  156.                 "å" => 'a',
  157.                 "Ò" => 'O',
  158.                 "Ó" => 'O',
  159.                 "Ô" => 'O',
  160.                 "Õ" => 'O',
  161.                 "Ö" => 'O',
  162.                 "Ø" => 'O',
  163.                 "ò" => 'o',
  164.                 "ó" => 'o',
  165.                 "ô" => 'o',
  166.                 "õ" => 'o',
  167.                 "ö" => 'o',
  168.                 "ø" => 'o',
  169.                 "È" => 'E',
  170.                 "É" => 'E',
  171.                 "Ê" => 'E',
  172.                 "Ë" => 'E',
  173.                 "è" => 'e',
  174.                 "é" => 'e',
  175.                 "ê" => 'e',
  176.                 "ë" => 'e',
  177.                 "Ç" => 'C',
  178.                 "ç" => 'c',
  179.                 "Ì" => 'I',
  180.                 "Í" => 'I',
  181.                 "Î" => 'I',
  182.                 "Ï" => 'I',
  183.                 "ì" => 'i',
  184.                 "í" => 'i',
  185.                 "î" => 'i',
  186.                 "ï" => 'i',
  187.                 "Ù" => 'U',
  188.                 "Ú" => 'U',
  189.                 "Û" => 'U',
  190.                 "Ü" => 'U',
  191.                 "ù" => 'u',
  192.                 "ú" => 'u',
  193.                 "û" => 'u',
  194.                 "ü" => 'u',
  195.                 "ÿ" => 'y',
  196.                 "Ñ" => 'N',
  197.                 "ñ" => 'n'
  198.             ]
  199.         );
  200.         return $param;
  201.     }
  202.     #[Route(path: [
  203.         "fr" => "/search/advanced",
  204.         "en" => "/en/search/advanced",
  205.     ], name'advanced_search')]
  206.     public function advancedSearch(BuildingRepository $buildingRepositoryRequest $requestLikedBuildingRepository $likedBuildingRepository): Response
  207.     {
  208.         $lng $request->query->get('lng');
  209.         $lat $request->query->get('lat');
  210.         $city $request->query->get('city');
  211.         $checkboxCountry $request->query->get('selectCountry');
  212.         $page $request->query->getInt('page'1);
  213.         $limit 16// Nombre de logements par page
  214.         
  215.         $countryAcronym = [
  216.             "FR" => "France",
  217.             "BE" => "Belgique",
  218.             "DE" => "Allemagne",
  219.             "ES" => "Espagne",
  220.             "IT" => "Italie",
  221.             "PT" => "Portugal",
  222.             "CA" => "Canada",
  223.             "LU" => "Luxembourg"
  224.         ];
  225.         (isset($countryAcronym[$checkboxCountry]) && $checkboxCountry) ? $country $countryAcronym[$checkboxCountry] : $country "France";
  226.         if (empty($city) || empty($lng) || empty($lat)) {
  227.             if(!empty($city)){
  228.                 $apiKey $this->googleMapKey;
  229.                 $url "https://maps.googleapis.com/maps/api/geocode/json?address={$city}&key={$apiKey}";
  230.                 $response file_get_contents($url);
  231.                 $data json_decode($responsetrue);
  232.                 if ($data['status'] === 'OK') {
  233.                     $lat $data['results'][0]['geometry']['location']['lat'];
  234.                     $lng $data['results'][0]['geometry']['location']['lng'];
  235.                 }
  236.             }
  237.         }
  238.     
  239.         $selectedCity $this->cityRepository->findOneBy(['city' => $city]);
  240.     
  241.         if (!$selectedCity) {
  242.             $city str_replace("-"" "$city);
  243.             $city $this->enleveaccents($city);
  244.             $cityCaps mb_strtoupper($city);
  245.             $selectedCity $this->cityRepository->findOneBy(['city' => $cityCaps]);
  246.         }
  247.     
  248.         if (!$selectedCity) {
  249.             $city str_replace(["Saint "" Saint"" Saint "], ["ST "" ST "" ST "], $city);
  250.             $cityCaps mb_strtoupper($city);
  251.             $selectedCity $this->cityRepository->findOneBy(['city' => $cityCaps]);
  252.         }
  253.         $criteria = [
  254.             'cityId' => $selectedCity && $city $selectedCity->getId() : (!$selectedCity && $city 'VILLE_INEXISTANTE' ''),
  255.             'city' => $selectedCity && $city $selectedCity->getCity() : (!$selectedCity && $city 'VILLE_INEXISTANTE' ''),
  256.             'country' => $country ?? '',
  257.             'acronym' => $checkboxCountry ?? '',
  258.             'minPrice' => $request->query->get('minPrice') ? $request->query->get('minPrice') : '0',
  259.             'maxPrice' => $request->query->get('maxPrice'),
  260.             'type' => $request->query->get('type'),
  261.             'isShared' => $request->query->get('isShared'),
  262.             'isFurnished' => $request->query->get('isFurnished'),
  263.             'bathroomType' => $request->query->get('bathroomType'),
  264.             'isAidEligible' => $request->query->get('isAidEligible'),
  265.             'dpe' => $request->query->get('dpe'),
  266.             'minSurface' => $request->query->get('minSurface'),
  267.             'maxSurface' => $request->query->get('maxSurface'),
  268.             'buildingPro' => $request->query->get('buildingPro')
  269.         ];
  270.     
  271.         $selectedBuildings $buildingRepository->findBySearchCriteria($criteria$page$limit);
  272.         $totalItems $buildingRepository->countBySearchCriteria($criteria);
  273.         $pagesCount ceil($totalItems $limit);
  274.     
  275.         // Création de la map pour afficher les résultats
  276.         $buildingsMap = [];
  277.         foreach ($selectedBuildings as $building) {
  278.             if ($building->getLng() !== null && $building->getLat() !== null) {
  279.                 $buildingsMap[] = [
  280.                     'lat' => $building->getLat(),
  281.                     'lng' => $building->getLng(),
  282.                     'id' => $building->getId(),
  283.                 ];
  284.             }
  285.         }
  286.     
  287.         // Gestion des bâtiments likés
  288.         $likedBuildings = [];
  289.         $user $this->getUser();
  290.         if ($user) {
  291.             foreach ($selectedBuildings as $building) {
  292.                 $isLiked $likedBuildingRepository->findOneBy(['user' => $user'building' => $building]) !== null;
  293.                 $likedBuildings[$building->getId()] = $isLiked;
  294.             }
  295.         }
  296.         $selectedBuildingsArray array_map(function ($building) {
  297.             return [
  298.                 'id' => $building->getId(),
  299.                 'latitude' => $building->getLat(),
  300.                 'longitude' => $building->getLng(),
  301.             ];
  302.         }, $selectedBuildings);
  303.     
  304.         return $this->render('home/search.html.twig', [
  305.             'selectedBuildingsMap' => $selectedBuildingsArray,
  306.             'selectedBuildings' => $selectedBuildings,
  307.             'city' => $city,
  308.             'lat' => $lat,
  309.             'lng' => $lng,
  310.             'checkboxCountry' => $checkboxCountry,
  311.             'likedBuildings' => $likedBuildings,
  312.             'buildingsMap' => $buildingsMap,
  313.             'totalItems' => $totalItems,
  314.             'pagesCount' => $pagesCount,
  315.             'currentPage' => $page,
  316.             'query' => $request->query->all(), // Passer les paramètres de requête au template
  317.             'selectedDPE' => $request->query->get('dpe'),
  318.         ]);
  319.     }
  320.     
  321.      
  322.     #[Route(path: [
  323.         "fr" => "/cgv",
  324.         "en" => "/en/cgv",
  325.     ], name'cgv')]
  326.     public function cgv()
  327.     {
  328.         return $this->render('cgv/cgv.html.twig');
  329.     }
  330.     #[Route(path: [
  331.         "fr" => "/cookies",
  332.         "en" => "/en/cookies",
  333.     ], name'cookies')]
  334.     public function cookies()
  335.     {
  336.         return $this->render('cookies/index.html.twig');
  337.     }
  338.     
  339.     #[Route(path: [
  340.         "fr" => "/assurance",
  341.         "en" => "/en/assurance",
  342.     ], name'assurance')]
  343.     public function assurance()
  344.     {
  345.         return $this->render('assurance/index.html.twig');
  346.     }
  347.     #[Route(path: [
  348.         "fr" => "/attestation",
  349.         "en" => "/en/attestation",
  350.     ], name'attestation')]
  351.     public function attestation()
  352.     {
  353.         return $this->render('attestation/index.html.twig');
  354.     }
  355.     #[Route(path: [
  356.         "fr" => "/qui",
  357.         "en" => "/en/qui",
  358.     ], name'qui')]
  359.     public function qui()
  360.     {
  361.         return $this->render('qui/index.html.twig');
  362.     }
  363.     #[Route(path: [
  364.         "fr" => "/services",
  365.         "en" => "/en/services",
  366.     ], name'services')]
  367.     public function services()
  368.     {
  369.         return $this->render('services/index.html.twig');
  370.     }
  371.     #[Route(path: [
  372.         "fr" => "/partenaire",
  373.         "en" => "/en/partenaire",
  374.     ], name'partenaire')]
  375.     public function partenaire()
  376.     {
  377.         return $this->render('partenaire/index.html.twig');
  378.     }
  379.     #[Route(path: [
  380.         "fr" => "/why_us",
  381.         "en" => "/en/why_us",
  382.     ], name'why_us')]
  383.     public function why_us()
  384.     {
  385.         return $this->render('why_us/index.html.twig');
  386.     }
  387.     #[Route(path: [
  388.         "fr" => "/contact",
  389.         "en" => "/en/contact",
  390.     ], name'contact')]
  391.     public function contact(Request $requestMails $mails)
  392.     {
  393.         $form $this->createForm(ContactForm::class);
  394.         $form->handleRequest($request);
  395.         if ($form->isSubmitted() && $form->isValid()) {
  396.             $captchaResponse $request->request->get('g-recaptcha-response');
  397.             if (!$this->recaptchaService->verify($captchaResponse)) {
  398.                 return new JsonResponse(['error' => 'Captcha invalide'], 400);
  399.             }
  400.             $to = ['contact@roomlers.com''julie@roomlers.com''geraldlegoff@appyness.fr'];
  401.             $data $form->getData();
  402.             $email $mails->createEmail('mails/contactUs.html.twig', [
  403.                 "prenom" => $data['firstName'],
  404.                 "nom" => $data['lastName'],
  405.                 "email" => $data['email'],
  406.                 "tel" => $data['phone'],
  407.                 "requestType" => $data['requestType'],
  408.                 "problemType" => $data['problemType'],
  409.                 "message" => $data['message']
  410.             ])
  411.             ->to(...$to)
  412.             ->subject('Formulaire Roomlers');
  413.             $mails->send($email);
  414.             $this->addFlash('notice''Le formulaire de contact a bien été envoyé.');
  415.             return $this->redirectToRoute('contact');
  416.         }
  417.         return $this->render('contact/index.html.twig', [
  418.             'form' => $form,
  419.         ]);
  420.     }
  421.     
  422.     #[Route(path: [
  423.         "fr" => "/privacy",
  424.         "en" => "/en/privacy",
  425.     ], name'privacy')]
  426.     public function privacy()
  427.     {
  428.         return $this->render('privacy/index.html.twig');
  429.     }
  430.     #[Route(path: [
  431.         "fr" => "/plan",
  432.         "en" => "/en/plan",
  433.     ], name'plan')]
  434.     public function plan()
  435.     {
  436.         return $this->render('plan/index.html.twig');
  437.     }
  438.     #[Route('/userForm/attestation'name'userFormAttestation')]
  439.     public function userFormAttestation(Request $requestMailerInterface $mailer)
  440.     {
  441.         $userForm = new UserForm();
  442.         $form $this->createForm(AttestationUserFormType::class, $userForm);
  443.         $form->handleRequest($request);
  444.         if ($form->isSubmitted() && $form->isValid()) {
  445.             $email $userForm->getEmail();
  446.             $emailExists $this->userFormRepository->findByEmailFormAttestation($email);
  447.             if ($emailExists) {
  448.                 return new JsonResponse([
  449.                     'error' => 'Une erreur est survenue, veuillez vérifier vos informations. ❌',
  450.                     'errors' => ['email' => 'Cet email est déjà utilisé.']
  451.                 ], 400);
  452.             }
  453.             $userForm->setAttestationPrereservation(true);
  454.             $this->entityManager->persist($userForm);
  455.             $this->entityManager->flush();
  456.             $messageContent "
  457.             Nom: " $userForm->getFirstName() . "
  458.             Prénom: " $userForm->getLastName() . "
  459.             Date de naissance: " $userForm->getBirthDate()->format('Y-m-d') . "
  460.             Nationalité: " $userForm->getNationality() . "
  461.             Email: " $userForm->getEmail() . "
  462.             Téléphone: " $userForm->getPhone() . "
  463.             Ville: " $userForm->getCity() . "
  464.             Type de logement: " $userForm->getType() . "
  465.             Budget: " $userForm->getBudget() . "
  466.             N° de passeport: " $userForm->getPassportNumber() . "
  467.             Expiration du passeport: " $userForm->getPassportExpirationDate()->format('Y-m-d') . "
  468.             Ecole: " $userForm->getSchool() . "
  469.             Date de rentrée: " $userForm->getStartDateSchool()->format('Y-m-d') . "
  470.             Consulat/Ambassade: " $userForm->getConsulate() . "
  471.             Inscription à la newsletter: " . ($userForm->getAcceptNewsletter() ? 'Oui' 'Non') . "
  472.             ";
  473.             $emailRoomlers = (new Email())
  474.                 ->from('noreply@roomlers.com')
  475.                 ->to('geraldlegoff@appyness.fr')
  476.                 ->cc('contact@roomlers.com''julie@roomlers.com')
  477.                 ->subject('Obtenir une attestation de pré-réservation de logement dans le cadre d’une demande de visa')
  478.                 ->text('Obtenir une attestation de pré-réservation de logement dans le cadre d’une demande de visa' $messageContent);
  479.             $mailer->send($emailRoomlers);
  480.             $messageContent "Votre demande a bien été prise en compte. Nous vous remercions pour la confiance accordée à Roomlers.
  481.             Un membre de notre équipe prendra rapidement contact avec vous.";
  482.             $emailCustomer = (new Email())
  483.                 ->from('noreply@roomlers.com')
  484.                 ->to($email)
  485.                 ->subject('Formulaire de Pré-réservation de Logement')
  486.                 ->text('Formulaire de Pré-réservation de Logement ' $messageContent);
  487.             $mailer->send($emailCustomer);
  488.             return new JsonResponse(['success' => 'Formulaire soumis et email envoyé avec succès!'], 200);
  489.         }
  490.         return $this->render('userForm/attestation.html.twig', [
  491.             'form' => $form->createView(),
  492.         ]);
  493.     }
  494.     #[Route('/userForm/owner'name'userFormOwner')]
  495.     public function userFormOwner(Request $requestMailerInterface $mailer)
  496.     {
  497.         $userForm = new UserForm();
  498.         $form $this->createForm(OwnerUserFormType::class, $userForm);
  499.         $form->handleRequest($request);
  500.         if ($form->isSubmitted() && $form->isValid()) {
  501.             $captcha_response $request->request->get('captcha');
  502.             $captcha_num1 $request->request->get('captcha_num1');
  503.             $captcha_num2 $request->request->get('captcha_num2');
  504.             // Vérifier la réponse du captcha
  505.             if ((int)$captcha_response !== ((int)$captcha_num1 + (int)$captcha_num2)) {
  506.                 return new JsonResponse([
  507.                     'error' => 'Captcha incorrect. Veuillez réessayer.',
  508.                 ], 400);
  509.             }
  510.             $email $userForm->getEmail();
  511.             $emailExists $this->userFormRepository->findByEmailFormOwner($email);
  512.             if ($emailExists) {
  513.                 return new JsonResponse([
  514.                     'error' => 'Une erreur est survenue, veuillez vérifier vos informations. ❌',
  515.                     'errors' => ['email' => 'Cet email est déjà utilisé.']
  516.                 ], 400);
  517.             }
  518.             $userForm->setOwner(true);
  519.             $this->entityManager->persist($userForm);
  520.             $this->entityManager->flush();
  521.             $messageContent "
  522.             Nom: " $userForm->getFirstName() . "
  523.             Prénom: " $userForm->getLastName() . "
  524.             Nationalité: " $userForm->getNationality() . "
  525.             Email: " $userForm->getEmail() . "
  526.             Téléphone: " $userForm->getPhone() . "
  527.             Ville: " $userForm->getCity() . "
  528.             Type de logement: " $userForm->getType() . "
  529.             Loyer mensuel charges comprises: " $userForm->getMonthlyRent() . "
  530.             Charges mensuelles: " $userForm->getMonthlyCharges() . "
  531.             Disponible à partir de: " $userForm->getAvailableFrom()->format('Y-m-d') . "
  532.             Présentez-nous brièvement votre logement: " $userForm->getDescription() . "
  533.             Inscription à la newsletter: " . ($userForm->getAcceptNewsletter() ? 'Oui' 'Non') . "
  534.             ";
  535.             $emailRoomlers = (new Email())
  536.                 ->from('noreply@roomlers.com')
  537.                 ->to('mohamedouzammad@appyness.fr')
  538.                 ->cc('contact@roomlers.com''julie@roomlers.com')
  539.                 ->subject('Proposer votre logement à la location à plus de 4500 potentiels locataires')
  540.                 ->text('Proposer votre logement à la location à plus de 4500 potentiels locataires' $messageContent);
  541.             $mailer->send($emailRoomlers);
  542.             $messageContent "Votre demande a bien été prise en compte. Nous vous remercions pour la confiance accordée à Roomlers. `\n` Un membre de notre équipe prendra rapidement contact avec vous.";
  543.             $emailCustomer = (new Email())
  544.             ->from('noreply@roomlers.com')
  545.             ->to($email)
  546.             ->subject('Proposer votre logement à la location à plus de 4500 potentiels locataires')
  547.             ->text('Proposer votre logement à la location à plus de 4500 potentiels locataires' $messageContent);
  548.             $mailer->send($emailCustomer);
  549.             return new JsonResponse(['success' => 'Formulaire soumis et email envoyé avec succès!'], 200);
  550.         }
  551.         return $this->render('userForm/owner.html.twig', [
  552.             'form' => $form->createView(),
  553.         ]);
  554.     }
  555.     #[Route('/userForm/tenant'name'userFormTenant')]
  556.     public function userFormTenant(Request $requestMailerInterface $mailer)
  557.     {
  558.         $userForm = new UserForm();
  559.         $form $this->createForm(TenantUserFormType::class, $userForm);
  560.         $form->handleRequest($request);
  561.         if ($form->isSubmitted() && $form->isValid()) {
  562.             $captcha_response $request->request->get('captcha');
  563.             $captcha_num1 $request->request->get('captcha_num1');
  564.             $captcha_num2 $request->request->get('captcha_num2');
  565.             // Vérifier la réponse du captcha
  566.             if ((int)$captcha_response !== ((int)$captcha_num1 + (int)$captcha_num2)) {
  567.                 return new JsonResponse([
  568.                     'error' => 'Captcha incorrect. Veuillez réessayer.',
  569.                 ], 400);
  570.             }
  571.             $email $userForm->getEmail();
  572.             $emailExists $this->userFormRepository->findByEmailFormTenant($email);
  573.             if ($emailExists) {
  574.                 return new JsonResponse([
  575.                     'error' => 'Une erreur est survenue, veuillez vérifier vos informations. ❌',
  576.                     'errors' => ['email' => 'Cet email est déjà utilisé.']
  577.                 ], 400);
  578.             }
  579.             $userForm->setTenant(true);
  580.             $this->entityManager->persist($userForm);
  581.             $this->entityManager->flush();
  582.             $messageContent "
  583.             Nom: " $userForm->getFirstName() . "
  584.             Prénom: " $userForm->getLastName() . "
  585.             Date de naissance: " $userForm->getBirthDate()->format('Y-m-d') . "
  586.             Nationalité: " $userForm->getNationality() . "
  587.             Email: " $userForm->getEmail() . "
  588.             Téléphone: " $userForm->getPhone() . "
  589.             Ville: " $userForm->getCity() . "
  590.             Type de logement: " $userForm->getType() . "
  591.             Budget: " $userForm->getBudget() . "
  592.             Durée de location (nombre de mois): " $userForm->getRentalDuration() . "
  593.             Date de début de location: " $userForm->getRentalDate()->format('Y-m-d') . "
  594.             Autre information: " $userForm->getAdditionalInformation() . "
  595.             Inscription à la newsletter: " . ($userForm->getAcceptNewsletter() ? 'Oui' 'Non') . "
  596.             ";
  597.             $emailRoomlers = (new Email())
  598.                 ->from('noreply@roomlers.com')
  599.                 ->to('mohamedouzammad@appyness.fr')
  600.                 ->cc('contact@roomlers.com''julie@roomlers.com')
  601.                 ->subject('Formulaire de réservation de logement')
  602.                 ->text('Formulaire de réservation de logement : colocation, coliving, studio, appartement… ' $messageContent);
  603.             $mailer->send($emailRoomlers);
  604.             $messageContent "Votre demande a bien été prise en compte. Nous vous remercions pour votre confiance.
  605.             Un membre de notre équipe prendra rapidement contact avec vous.";
  606.             $emailCustomer = (new Email())
  607.                 ->from('noreply@roomlers.com')
  608.                 ->to($email)
  609.                 ->subject('Formulaire de réservation de logement')
  610.                 ->text('Formulaire de réservation de logement : colocation, coliving, studio, appartement… ' $messageContent);
  611.             $mailer->send($emailCustomer);
  612.             return new JsonResponse(['success' => 'Formulaire soumis et email envoyé avec succès!'], 200);
  613.         }
  614.         return $this->render('userForm/tenant.html.twig', [
  615.             'form' => $form->createView(),
  616.         ]);
  617.     }
  618.   
  619. // #[Route('/userForm', name: 'userForm')]
  620. // public function userForm(Request $request): Response
  621. // {
  622. //     $formChoice = $request->get('form_choice');
  623. //     if ($formChoice) {
  624. //         switch ($formChoice) {
  625. //             case 'attestation':
  626. //                 return $this->redirectToRoute('userFormAttestation');
  627. //             case 'tenant':
  628. //                 return $this->redirectToRoute('userFormTenant');
  629. //             case 'owner':
  630. //                 return $this->redirectToRoute('userFormOwner');
  631. //             default:
  632. //                 $this->addFlash('error', 'Choix de formulaire invalide.');
  633. //                 return $this->redirectToRoute('userForm'); 
  634. //         }
  635. //     }
  636. //     // 🛠️ Ajout du formulaire manquant
  637. //     $userForm = new UserForm();
  638. //     $form = $this->createForm(NewsletterUserFormType::class, $userForm);
  639. //     return $this->render('userForm/index.html.twig', [
  640. //         'form' => $form->createView(), // Assurez-vous que la variable "form" est bien transmise
  641. //     ]);
  642. // }
  643.     #[Route('/userForm/newsletter'name'userFormNewsletter')]
  644.     public function userFormNewsletter(Request $requestMailerInterface $mailer)
  645.     {
  646.         $userForm = new UserForm();
  647.         $form $this->createForm(NewsletterUserFormType::class, $userForm);
  648.         $form->handleRequest($request);
  649.         $honeypot $request->request->get('input');
  650.         if (!empty($honeypot)) {
  651.             return new JsonResponse(['error' => 'Error'], 400);
  652.         }
  653.         $captchaResponse $request->request->get('g-recaptcha-response');
  654.         if (!$this->recaptchaService->verify($captchaResponse)) {
  655.             return new JsonResponse(['error' => 'Captcha invalide'], 400);
  656.         }
  657.         if ($form->isSubmitted() && $form->isValid()) {
  658.             $email $userForm->getEmail();
  659.             $emailExists $this->userFormRepository->findByEmailFormNewsletter($email);
  660.             if ($emailExists) {
  661.                 return new JsonResponse([
  662.                     'error' => 'Veuillez vérifier vos informations. ❌',
  663.                     'errors' => ['email' => 'Veuillez vérifier vos informations. ❌']
  664.                 ], 400);
  665.             }
  666.             $userForm->setNewsletter(true);
  667.             $this->entityManager->persist($userForm);
  668.             $this->entityManager->flush();
  669.             $messageContent "
  670.             Nom: " $userForm->getFirstName() . "
  671.             Prénom: " $userForm->getLastName() . "
  672.             Email: " $userForm->getEmail() . "
  673.             ";
  674.             $emailRoomlers = (new Email())
  675.                 ->from('noreply@roomlers.com')
  676.                 ->to('julie@roomlers.com')
  677.                 ->cc('contact@roomlers.com''hello@appyness.fr')
  678.                 ->subject('Inscription à la newsletter Roomlers')
  679.                 ->text('Nouvelle inscription à la newsletter : ' $messageContent);
  680.             $mailer->send($emailRoomlers);
  681.             $messageContent "Merci de vous être inscrit à la newsletter Roomlers. Vous recevrez bientôt des informations exclusives et des offres spéciales.";
  682.             $emailCustomer = (new Email())
  683.                 ->from('noreply@roomlers.com')
  684.                 ->to($email)
  685.                 ->subject('Confirmation d\'inscription à la newsletter Roomlers')
  686.                 ->text($messageContent);
  687.             $mailer->send($emailCustomer);
  688.             return new JsonResponse(['success' => 'Inscription à la newsletter confirmée!'], 200);
  689.         }
  690.         return $this->render('userForm/index.html.twig', [
  691.             'form' => $form->createView(),
  692.         ]);
  693.     }
  694.     #[Route(path: ["fr" => "/home""en" => "/en/home"], name'landing')]
  695.     public function landing(BuildingRepository $buildingRepositoryRequest $request): Response
  696.     {
  697.         $data $this->getBuildingsByCountry($buildingRepository$request);
  698.         
  699.         return $this->render('home/landing_page.html.twig'$data);
  700.     }
  701.     #[Route('/buildings-country'name'buildings_country')]
  702.     public function buildingsCountry(BuildingRepository $buildingRepositoryRequest $request): Response
  703.     {
  704.         $data $this->getBuildingsByCountry($buildingRepository$request);
  705.         
  706.         return $this->render('components/sectionAccommodationCountry.html.twig'$data);
  707.     }
  708.         
  709.     private function getBuildingsByCountry(BuildingRepository $buildingRepositoryRequest $request): array
  710.     {
  711.         $countryCode $request->query->get('acronym''FR');
  712.         $countryNames = [
  713.             'FR' => 'France',
  714.             'BE' => 'Belgique',
  715.             'DE' => 'Allemagne',
  716.             'ES' => 'Espagne',
  717.             'IT' => 'Italie',
  718.             'PT' => 'Portugal',
  719.             'CA' => 'Canada',
  720.             'LU' => 'Luxembourg'
  721.         ];
  722.         $country $countryNames[$countryCode] ?? 'France';
  723.         $recentBuildingsOqoro $buildingRepository->recentBuildingsOqoro($country$countryCode);
  724.         $recentBuildingsColonies $buildingRepository->recentBuildingsColonies($country$countryCode);
  725.         $recentBuildingsPrivate $buildingRepository->recentBuildingsPrivate($country$countryCode);
  726.     
  727.         //4 Logements Oqoro max  + 4 Logements Colonies max + 4 Logements privés max
  728.         $buildingsOqoro array_slice($recentBuildingsOqoro04);
  729.         $buildingsColonies array_slice($recentBuildingsColonies04);
  730.         $buildingsPrivate array_slice($recentBuildingsPrivate04);
  731.         $buildings array_merge($buildingsOqoro$buildingsColonies$buildingsPrivate);
  732.         //S'il n'y a pas 12 logements alors on pioche dans les pro BackUp Oqoro
  733.         if(count($buildings)!= 12){
  734.             $buildingsPROBackUp array_slice($recentBuildingsOqoro413);
  735.             $activeBuildings array_slice($buildingsPROBackUp012 count($buildings));
  736.             $buildings array_merge($buildings$activeBuildings);
  737.         }
  738.                 
  739.         // Trier les logements actifs par date de création et limiter à 12 (3 lignes)
  740.         usort($buildings, function($a$b) {
  741.             return $b->getCreatedAt() <=> $a->getCreatedAt();
  742.         });
  743.     
  744.         $buildings array_slice($buildings012);
  745.     
  746.         // Récupérer les documents associés aux bâtiments actifs
  747.         $buildingDocuments = [];
  748.         foreach ($buildings as $building) {
  749.             $buildingDocuments[$building->getId()] = $building->getBuildingDocuments();
  750.         }
  751.     
  752.         return [
  753.             'recentBuildings' => $buildings,
  754.             'buildingDocuments' => $buildingDocuments,
  755.         ];
  756.     }
  757. }