src/Controller/WebController.php line 463

Open in your IDE?
  1. <?php
  2. namespace App\Controller;
  3. use App\Config;
  4. use App\Entity\Candidature;
  5. use App\Entity\CompteRecrutement;
  6. use App\Entity\Enum\FrenchRegion;
  7. use App\Entity\Enum\IconEnum;
  8. use App\Entity\Enum\UAERegion;
  9. use App\Entity\Enum\UAERegionNew;
  10. use App\Entity\Experience;
  11. use App\Entity\Notification;
  12. use App\Entity\Offer;
  13. use App\Entity\OfferVisit;
  14. use App\Entity\Profile;
  15. use App\Entity\ProfileVisit;
  16. use App\Entity\Report;
  17. use App\Entity\Society;
  18. use App\Entity\TempMail;
  19. use App\Entity\User;
  20. use App\Form\FreelanceRegisterFormType;
  21. use App\Form\RegistrationFormType;
  22. use App\Form\ReportFormType;
  23. use App\Form\ResetPasswordRequestFormType;
  24. use App\Repository\CandidatureRepository;
  25. use App\Repository\ForumPostRepository;
  26. use App\Repository\NotificationRepository;
  27. use App\Repository\OfferFavoriteRepository;
  28. use App\Repository\OfferRepository;
  29. use App\Repository\ProfileRepository;
  30. use App\Repository\ProfileVisitRepository;
  31. use App\Repository\PublicationRepository;
  32. use App\Repository\NewsRepository;
  33. use App\Repository\SocietyRepository;
  34. use App\Service\Forum\ForumUserService;
  35. use App\Service\LocationService;
  36. use App\Service\OfferService;
  37. use App\Service\TempMailService;
  38. use App\UseCase\Commande\CreateCommande;
  39. use DateTime;
  40. use DateTimeImmutable;
  41. use Doctrine\ORM\EntityManagerInterface;
  42. use Doctrine\ORM\NonUniqueResultException;
  43. use Knp\Component\Pager\PaginatorInterface;
  44. use Sensio\Bundle\FrameworkExtraBundle\Configuration\IsGranted;
  45. use Symfony\Bridge\Twig\Mime\TemplatedEmail;
  46. use Symfony\Bundle\FrameworkBundle\Controller\AbstractController;
  47. use Symfony\Component\HttpFoundation\Request;
  48. use Symfony\Component\HttpFoundation\Response;
  49. use Symfony\Component\HttpKernel\Exception\NotFoundHttpException;
  50. use Symfony\Component\Mailer\Exception\TransportExceptionInterface;
  51. use Symfony\Component\Mailer\MailerInterface;
  52. use Symfony\Component\Routing\Annotation\Route;
  53. class WebController extends AbstractController
  54. {
  55.     private function getYoutubeVideoId(string $url): string
  56.     {
  57.         $regex '~^(?:https?://)?(?:www\\.)?(?:youtube\\.com/watch\\?v=|youtu\\.be/)([\\w-]{11})$~i';
  58.         preg_match($regex$url$matches);
  59.         return $matches[1];
  60.     }
  61.     /**
  62.      * @Route("/", name="homepage")
  63.      */
  64.     public function index(
  65.         OfferRepository     $offerRepository,
  66.         ProfileRepository   $profileRepository,
  67.         NewsRepository      $newsRepository,
  68.         LocationService     $locationService,
  69.         ForumUserService    $forumUserService,
  70.         ForumPostRepository $forumPostRepository
  71.     ): Response
  72.     {
  73.         $offers $offerRepository->getLatest();
  74.         $profiles $profileRepository->getLatest(3);
  75.         $news $newsRepository->getLatest();
  76.         $form $this->createForm(RegistrationFormType::class, new User());
  77.         $resetForm $this->createForm(ResetPasswordRequestFormType::class);
  78.         $userJobseeker = new User();
  79.         $userJobseeker->setCreatedAt(new DateTime());
  80.         $userJobseeker->setRoles(['ROLE_FREELANCE']);
  81.         $userJobseeker->setType('freelance');
  82.         $userJobseeker->setPhone('');
  83.         $formJobseeker $this->createForm(FreelanceRegisterFormType::class, $userJobseeker, [
  84.             'forumPseudo' => $forumUserService->getNextForumUserID()
  85.         ]);
  86.         return $this->render('page/home.html.twig', [
  87.             'offers' => $offers,
  88.             'profiles' => $profiles,
  89.             'regions' => $locationService->getSelectableArray(),
  90.             'registrationForm' => $form->createView(),
  91.             'resetForm' => $resetForm->createView(),
  92.             'formJobseeker' => $formJobseeker->createView(),
  93.             'formJobseeker2' => $formJobseeker->createView(),
  94.             'faqs' => Config::FAQ,
  95.             'cityList' => Config::FEATURED_CITY,
  96.             'news' => $news,
  97.             'isComing' => (bool)$this->getParameter('is_coming'),
  98.             'isNotShow' => (bool)$this->getParameter('is_not_show'),
  99.             'regionjson' => json_encode($locationService->getSelectableArray(), JSON_UNESCAPED_UNICODE),
  100.             '_recentPosts' => $forumPostRepository->recentPostLimit(4),
  101.         ]);
  102.     }
  103.     /**
  104.      * @Route("/companies/{slug}", name="society_profil", methods={"GET"})
  105.      * @IsGranted("ROLE_USER")
  106.      */
  107.     public function society(
  108.         Society            $society,
  109.         Request            $request,
  110.         OfferRepository    $offerRepository,
  111.         PaginatorInterface $paginator,
  112.         OfferService       $offerService
  113.     ): Response
  114.     {
  115.         /* @var  User $user */
  116.         $user $this->getUser();
  117.         $offers $offerRepository->findBy(['society' => $society], ['id' => 'desc']);
  118.         $offers $offerService->filterOfferByExpire($offers);
  119.         $viewData = [
  120.             'society' => $society,
  121.             'offers' => $paginator->paginate($offers$request->query->getInt('page'1), 10),
  122.             'isOwner' => $user->isSociety() && ($society->getId() === $user->getSociety()->getId()),
  123.             'reportedId' => $society->getId(),
  124.             'reportedTarget' => 'society',
  125.         ];
  126.         $viewData['reportForm'] = $this->createForm(ReportFormType::class, new Report())->createView();
  127.         $viewData['idYoutubePresentation'] = null;
  128.         if ($society->getPresentationYoutube()) {
  129.             $viewData['idYoutubePresentation'] = $this->getYoutubeVideoId($society->getPresentationYoutube());
  130.         }
  131.         if (!$this->getUser()) {
  132.             $viewData['registrationForm'] = $this->createForm(RegistrationFormType::class, new User())->createView();
  133.         }
  134.         return $this->render('page/society.html.twig'$viewData);
  135.     }
  136.     /**
  137.      * @Route("/job/offer/{slug}", name="public_mission", methods={"GET","POST"})
  138.      * @param Offer $offer
  139.      * @param OfferRepository $offerRepository
  140.      * @param Request $request
  141.      * @param EntityManagerInterface $entityManager
  142.      * @param CandidatureRepository $candidatureRepository
  143.      * @param ProfileRepository $profileRepository
  144.      * @param OfferFavoriteRepository $offerFavoriteRepository
  145.      * @param MailerInterface $mailer
  146.      * @param TempMailService $tempMailService
  147.      * @param OfferService $offerService
  148.      * @param NotificationRepository $notificationRepository
  149.      * @return Response
  150.      * @throws TransportExceptionInterface
  151.      */
  152.     public function offer(
  153.         Offer                   $offer,
  154.         OfferRepository         $offerRepository,
  155.         Request                 $request,
  156.         EntityManagerInterface  $entityManager,
  157.         CandidatureRepository   $candidatureRepository,
  158.         ProfileRepository       $profileRepository,
  159.         OfferFavoriteRepository $offerFavoriteRepository,
  160.         MailerInterface         $mailer,
  161.         TempMailService         $tempMailService,
  162.         OfferService            $offerService,
  163.         NotificationRepository  $notificationRepository
  164.     ): Response
  165.     {
  166.         /* @var User $user */
  167.         $user $this->getUser();
  168.         $candidatures = [];
  169.         $currentDate = new DateTime();
  170.         $isOwner false;
  171.         if ($user) {
  172.             $currentOwnerID null;
  173.             if ($offer->getSociety()) {
  174.                 $currentOwnerID $offer->getSociety()->getId();
  175.             }
  176.             $isOwner $user->isSociety() && ($user->getSociety()->getId() == $currentOwnerID);
  177.             $offerVisit = new OfferVisit();
  178.             if (!$isOwner) {
  179.                 $offerVisit
  180.                     ->setUser($user)
  181.                     ->setOffer($offer)
  182.                     ->setCreatedAt(new DateTime());
  183.                 $entityManager->persist($offerVisit);
  184.                 $entityManager->flush();
  185.             }
  186.             // REDIRECT IF PROFIL NOT COMPLETE
  187.             if ($user->isFreelance()) {
  188.                 $currentProfil $user->getUniqueProfile();
  189.                 if (!$currentProfil->getNationalityMultiple()) {
  190.                     return $this->redirectToRoute('complete_resume_profile');
  191.                 }
  192.             }
  193.         }
  194.         $alreadyPostulate null;
  195.         if (!$isOwner) {
  196.             $offer->incrementView();
  197.             $entityManager->flush();
  198.         }
  199.         $similarOffers $offerRepository->findSimilar($offer->getId(), 2);
  200.         $similarOffers $offerService->filterOfferByExpire($similarOffers);
  201.         $candidature = new Candidature();
  202.         $candidature->setOffer($offer);
  203.         $candidature->setPostulateAt(new DateTimeImmutable());
  204.         $alreadyPostulate false;
  205.         if ($user) {
  206.             if ($user->isFreelance()) {
  207.                 $candidature->setProfile($user->getUniqueProfile());
  208.                 $alreadyPostulate $candidatureRepository->findOneBy([
  209.                     'profile' => $user->getUniqueProfile(), 'offer' => $offer
  210.                 ]);
  211.             } else {
  212.                 $profiles $user->getProfiles();
  213.                 $allCandidatures $candidatureRepository->findByOfferAndSociety($offer$profiles);
  214.                 foreach ($allCandidatures as $c) {
  215.                     $candidatures[] = $c->getProfile()->getId();
  216.                 }
  217.             }
  218.         }
  219.         if ($request->isMethod('POST')) {
  220.             if ($user->isSociety()) {
  221.                 $interContrat $profileRepository->find($request->get('intercontrat'));
  222.                 $candidature->setProfile($interContrat);
  223.             }
  224.             $offer->incrementUnseenCandidature();
  225.             $candidature->setAnswers($request->get('answers'));
  226.             $entityManager->persist($candidature);
  227.             $entityManager->flush();
  228.             // ------- ADD NOTIFICATION --------
  229.             $notificationAlert $notificationRepository->findOneBy([
  230.                 'seen' => false,
  231.                 'type' => Notification::TYPE_MISSION_APPLY,
  232.                 'user' => $offer->getSociety()->getUser(),
  233.                 'rubriqueID' => $offer->getId()
  234.             ]);
  235.             if (!$notificationAlert) {
  236.                 $notificationAlert = new Notification();
  237.                 $notificationAlert->setUser($offer->getSociety()->getUser());
  238.                 $notificationAlert->setIcon(IconEnum::APPLY);
  239.                 $notificationAlert->setType(Notification::TYPE_MISSION_APPLY);
  240.                 $notificationAlert->setRubriqueID($offer->getId());
  241.                 $notificationAlert->setContent('
  242.                     <strong>' $candidature->getProfile()->getFullName() . '</strong>
  243.                     applied for a job <strong>' $offer->getTitle() . '</strong>
  244.                 ');
  245.             } else {
  246.                 $notificationAlert->setContent('
  247.                     People applied for a job <strong>' $offer->getTitle() . '</strong>
  248.                 ');
  249.                 $notificationAlert->setUpdatedAt(new \DateTime());
  250.             }
  251.             $entityManager->persist($notificationAlert);
  252.             $entityManager->flush();
  253.             // ---- SEND MAIL SERVICE ----
  254.             // MAIL TO RECRUTEUR
  255.             $emailTo $offer->getSociety()->getUser()->getEmail();
  256.             if ($offer->getUserRecruteur()) {
  257.                 $emailTo $offer->getUserRecruteur()->getEmail();
  258.             }
  259.             $tempMail = new TempMail();
  260.             $tempMail->setAdress($emailTo);
  261.             $tempMail->setType_OfferCandidature();
  262.             $tempMail->setOffer($offer);
  263.             $tempMail->setCandidature($candidature);
  264.             $tempMailService->sendingMail($tempMail);
  265.             // NOTIFICATION
  266.             return $this->redirectToRoute('public_mission', ['slug' => $offer->getSlug()]);
  267.         }
  268.         $offerFavorite = [];
  269.         if ($user) {
  270.             $offerFavorite $offerFavoriteRepository->findOneBy(['user' => $user'offer' => $offer]);
  271.         }
  272.         /** @var DateTime $createdDate */
  273.         $createdDate $offer->getCreatedAt();
  274.         $endDate = clone $createdDate;
  275.         $endDate->add(new \DateInterval('P6M'));
  276.         if ($offer->getExpireAt()) {
  277.             $endDate $offer->getExpireAt();
  278.         }
  279.         return $this->render('page/offer.html.twig', [
  280.             'offer' => $offer,
  281.             'similarOffers' => $similarOffers,
  282.             'isOwner' => $isOwner,
  283.             'alreadyPostulate' => $alreadyPostulate,
  284.             'isInFavorite' => !empty($offerFavorite),
  285.             'candidatures' => $candidatures,
  286.             'offerEndDate' => $endDate,
  287.             'currentDate' => $currentDate,
  288.         ]);
  289.     }
  290.     /**
  291.      * @Route("/offer/apply/{id}", name="public_redirect_offer_apply", methods={"GET"})
  292.      *
  293.      */
  294.     public function redirectOfferApply(
  295.         Offer $offer
  296.     ): Response
  297.     {
  298.         /** @var User $currentUser */
  299.         $currentUser $this->getUser();
  300.         if (!$currentUser) {
  301.             return $this->redirectToRoute('register_freelance');
  302.         }
  303.         return $this->redirectToRoute("public_mission", ['slug' => $offer->getSlug()]);
  304.     }
  305.     /**
  306.      * @Route("/profile/{slug}", name="public_profile", methods={"GET"})
  307.      * @IsGranted("ROLE_USER")
  308.      * @throws NonUniqueResultException
  309.      */
  310.     public function profile(
  311.         Profile                $profile,
  312.         EntityManagerInterface $entityManager,
  313.         ProfileRepository      $profileRepository,
  314.         ProfileVisitRepository $profileVisitRepository,
  315.         CandidatureRepository  $candidatureRepository
  316.     ): Response
  317.     {
  318.         /* @var User $user */
  319.         $user $this->getUser();
  320.         $isOwner $profile->getUser()->getId() === $user->getId();
  321.         if ($user->getCompteSociety()) {
  322.             if ($user->getSociety()->getUser()->getId() === $profile->getUser()->getId()) {
  323.                 $isOwner true;
  324.             }
  325.         }
  326.         if (!$profile) {
  327.             throw new NotFoundHttpException();
  328.         }
  329.         if ($user->isFreelance() && $profile->getId() !== $user->getUniqueProfile()->getId()) {
  330.             return $this->redirectToRoute('dashboard');
  331.         }
  332.         if ($user->isSociety()) {
  333.             $society $user->getSociety();
  334.             $candidatures $candidatureRepository->findBySocietyAndProfile($society$profile);
  335.             $ProfilesVisits $profileVisitRepository->findBySociety($society);
  336.             $profileIds = [];
  337.             foreach ($ProfilesVisits as $visit) {
  338.                 $profileIds[] = $visit['id'];
  339.             }
  340. //            if (!in_array($profile->getId(), $profileIds)) {
  341. //                if (!$candidatures && !$society->canViewProfile()) {
  342. //                    $this->addFlash('package_error', "Acheter un package pour voir le profil");
  343. //
  344. //                    return $this->redirectToRoute('dashboard');
  345. //                }
  346. //            }
  347.             if ($profile->getUser()->isFreelance() ||
  348.                 ($profile->getUser()->isSociety() && $society->getId() != $profile->getUser()->getSociety()->getId())
  349.             ) {
  350.                 $profileVisit = new ProfileVisit();
  351.                 $profileVisit->setSociety($society);
  352.                 $profileVisit->setProfile($profile);
  353.                 $profileVisit->setViewAt(new DateTimeImmutable());
  354.                 $entityManager->persist($profileVisit);
  355.                 if (!$candidatures) {
  356.                     $society->decreaseProfileView();
  357.                 }
  358.                 $entityManager->flush();
  359.             }
  360.         }
  361.         return $this->render('page/profile.html.twig', [
  362.             'profile' => $profile,
  363.             'reportForm' => $this->createForm(ReportFormType::class, new Report())->createView(),
  364.             'reportedId' => $profile->getId(),
  365.             'reportedTarget' => 'profile',
  366.             'isOwner' => $isOwner,
  367. //            'experience' => new Experience()
  368.         ]);
  369.     }
  370.     /**
  371.      * @Route("/account-non-verified", name="email_unverified", methods={"GET"})
  372.      */
  373.     public function userUnverified(): Response
  374.     {
  375.         $hasVerifiedUser false;
  376.         if ($this->getUser()) {
  377.             $hasVerifiedUser $this->getUser()->isVerified();
  378.         }
  379.         if ($hasVerifiedUser) {
  380.             return $this->redirectToRoute('dashboard');
  381.         } else {
  382.             return $this->render('page/email_must_verified.html.twig');
  383.         }
  384.     }
  385.     /**
  386.      * @Route("/pourquoi-s-inscrire", name="why_subscribe", methods={"GET"})
  387.      */
  388.     public function whySubscribe(): Response
  389.     {
  390.         return $this->render('page/why-subscribe.html.twig');
  391.     }
  392.     /**
  393.      * @Route("/{slug}", name="public_page", methods={"GET"})
  394.      */
  395.     public function page(string $slugPublicationRepository $publicationRepository): Response
  396.     {
  397.         if ($slug == 'societe') {
  398.             return $this->render('page/error.html.twig');
  399.         }
  400.         $publication $publicationRepository->findOneBy(['slug' => $slug]);
  401.         if (null === $publication) {
  402.             throw $this->createNotFoundException();
  403.         }
  404.         return $this->render('page/page.html.twig', [
  405.             'publication' => $publication,
  406.         ]);
  407.     }
  408.     /**
  409.      * @Route("/package/checkout", name="payment_validation", methods={"GET"})
  410.      */
  411.     public function paymentValidation(
  412.         Request                $request,
  413.         CreateCommande         $createCommande,
  414.         EntityManagerInterface $entityManager
  415.     ): Response
  416.     {
  417.         if ($request->query->get('stripe') == 'success') {
  418.             $user $this->getUser();
  419.             $society $user->getSociety();
  420.             $commande $createCommande->execute($request->query->get('package'), $society);
  421.             /*  Set compte recrutement  */
  422.             $nbMois $request->query->get("nbMois");
  423.             if ($nbMois) {
  424.                 $nbMois intval($nbMois);
  425.                 if ($nbMois 0) {
  426.                     $commande->setNbMoisRecruit($nbMois);
  427.                     $entityManager->persist($commande);
  428.                     for ($i 1$i <= $nbMois$i++) {
  429.                         $compteRecrutement = new CompteRecrutement();
  430.                         $compteRecrutement->setSociete($society);
  431.                         $compteRecrutement->setNbMois($nbMois);
  432.                         $compteRecrutement->setCommande($commande);
  433.                         $compteRecrutement->setIsJeton(true);
  434.                         $entityManager->persist($compteRecrutement);
  435.                         $entityManager->flush();
  436.                     }
  437.                 }
  438.             }
  439.             return $this->redirectToRoute('commande_list');
  440.         } else {
  441.             $this->addFlash('error''Une erreur s\'est produite lors de votre paiement.');
  442.             return $this->redirectToRoute('checkout_package', ['name' => $request->query->get('package')]);
  443.         }
  444.     }
  445.     /**
  446.      * @Route("/mail/send/reactivation", name="mail_s_sendReactivation")
  447.      *
  448.      *
  449.      *  ENVOYE DE MAIL DE REACTIVATION
  450.      */
  451.     public function sendReactivation(
  452.         EntityManagerInterface $entityManager,
  453.         SocietyRepository      $societyRepository,
  454.         MailerInterface        $mailer,
  455.         TempMailService        $tempMailService
  456.     ): Response
  457.     {
  458.         $societies $societyRepository->findExpiredPauseDate();
  459.         $i 0;
  460.         foreach ($societies as $society) {
  461.             $society->setPauseDate(null);
  462.             $entityManager->persist($society);
  463.             $i++;
  464.             $entityManager->flush();
  465.             // SEND MAIL
  466.             $tempMail = new TempMail();
  467.             $tempMail->setType_SocietyReactivation();
  468.             $tempMail->setAdress($society->getUser()->getEmail());
  469.             $tempMail->setSociety($society);
  470.             $tempMailService->sendingMail($tempMail);
  471.         }
  472.         return new Response($i ' sociétés réactivées');
  473.     }
  474.     /**
  475.      * @Route("/123456/update/nationality", name="profile_update_nationality", methods={"GET"})
  476.      *
  477.      */
  478.     public function profileNationality(
  479.         EntityManagerInterface $entityManager
  480.     ): Response
  481.     {
  482.         /** @var Profile[] $profiles */
  483.         $profiles $entityManager->getRepository(Profile::class)->findAll();
  484.         foreach ($profiles as $profile) {
  485.             if ($profile->getNationality() and !$profile->getNationalityMultiple()) {
  486.                 $nationalities = [];
  487.                 $nationalities[] = $profile->getNationality();
  488.                 $profile->setNationalityMultiple($nationalities);
  489.                 $entityManager->persist($profile);
  490.             }
  491.         }
  492.         $entityManager->flush();
  493.         return new Response('profile nationality update');
  494.     }
  495. }