src/Entrepreneurs/Bundle/Entrepreneur/Controller/SecurityController.php line 276

Open in your IDE?
  1. <?php
  2. namespace Entrepreneurs\Bundle\Entrepreneur\Controller;
  3. use Entrepreneurs\Bundle\Admin\Controller\AdminController;
  4. use Entrepreneurs\Bundle\AppBundle\Logger\EntrepreneurLogger;
  5. use Entrepreneurs\Bundle\AppBundle\Manager\GeocodeManager;
  6. use Entrepreneurs\Bundle\AppBundle\Manager\MailManager;
  7. use Entrepreneurs\Bundle\AppBundle\Propel\Entrepreneur;
  8. use Entrepreneurs\Bundle\AppBundle\Propel\EntrepreneurQuery;
  9. use Entrepreneurs\Bundle\AppBundle\Propel\EntrepreneurStatut;
  10. use Entrepreneurs\Bundle\AppBundle\Propel\FormationQuery;
  11. use Entrepreneurs\Bundle\AppBundle\Propel\InterventionStatut;
  12. use Entrepreneurs\Bundle\AppBundle\Propel\statCartoEntrepreneur;
  13. use Entrepreneurs\Bundle\Entrepreneur\Form\GestionType;
  14. use Entrepreneurs\Bundle\Entrepreneur\Form\MdpOublieType;
  15. use Entrepreneurs\Bundle\Entrepreneur\Form\MdpReinitialisationType;
  16. use Entrepreneurs\Bundle\Entrepreneur\Form\MdpType;
  17. use Entrepreneurs\Bundle\Entrepreneur\Form\ProfilType;
  18. use Entrepreneurs\Bundle\FrontBundle\Form\ConnexionMailType;
  19. use Propel\Runtime\Exception\PropelException;
  20. use Symfony\Component\Form\ClickableInterface;
  21. use Symfony\Component\Form\FormError;
  22. use Symfony\Component\HttpFoundation\Request;
  23. use Symfony\Component\HttpFoundation\Response;
  24. use Symfony\Component\Routing\Annotation\Route;
  25. use Symfony\Component\Routing\Generator\UrlGeneratorInterface;
  26. use Symfony\Component\Security\Core\Security;
  27. use Symfony\Component\Security\Http\LoginLink\LoginLinkHandlerInterface;
  28. use Twig\Error\LoaderError;
  29. use Twig\Error\RuntimeError;
  30. use Twig\Error\SyntaxError;
  31. class SecurityController extends AdminController
  32. {
  33.     /**
  34.      * @Route(name="entrepreneur_security_connexion", path="/auth/connexion")
  35.      */
  36.     public function connexionAction(Request $request): Response
  37.     {
  38.         $session $request->getSession();
  39.         if ($this->getUser()) {
  40.             return $this->forward('Entrepreneurs\Bundle\Entrepreneur\Controller\InterventionController::listAction');
  41.         }
  42.         if ($request->attributes->has(Security::AUTHENTICATION_ERROR)) {
  43.             $error $request->attributes->get(Security::AUTHENTICATION_ERROR);
  44.         } else {
  45.             $error $session->get(Security::AUTHENTICATION_ERROR);
  46.             $session->remove(Security::AUTHENTICATION_ERROR);
  47.         }
  48.         return $this->renderTwig('Entrepreneur:Security:connexion.html.twig', [
  49.             'last_username' => $session->get(Security::LAST_USERNAME),
  50.             'error' => $error,
  51.         ]);
  52.     }
  53.     /**
  54.      * @Route(name="entrepreneur_profil_edition", path="/profil/edition")
  55.      */
  56.     public function profilAction(Request $requestMailManager $mailManagerGeocodeManager $geocodeManager): Response
  57.     {
  58.         /** @var Entrepreneur $entrepreneur */
  59.         $entrepreneur $this->getUser();
  60.         $fromCarto $request->get('carto');
  61.         if ($fromCarto) {
  62.             $statCartoEntrepreneur = new statCartoEntrepreneur();
  63.             $statCartoEntrepreneur->setEntrepreneur($entrepreneur)
  64.                 ->setClickedUpdateProfileFromLinkOrModal(true)
  65.                 ->save();
  66.         }
  67.         $cloneEntrepreneur = clone $entrepreneur;
  68.         $formProfil $this->createForm(ProfilType::class, $this->getUser(), ['request' => $request'entrepreneur' => $entrepreneur]);
  69.         $formMdp $this->createForm(MdpType::class, $entrepreneur);
  70.         $formGestion $this->createForm(GestionType::class, $entrepreneur);
  71.         if ($request->isMethod('post') && $dataProfil $request->get($formProfil->getName())) {
  72.             $formProfil->submit($dataProfil);
  73.             if ($formProfil->isValid()) {
  74.                 $entrepreneur $formProfil->getData();
  75.                 new EntrepreneurLogger(EntrepreneurLogger::RESEAU$cloneEntrepreneur$entrepreneur$this->getUser());
  76.                 $entrepreneur->setReceptionMailingHebdo(true);
  77.                 $entrepreneur->setDateMajFront(time());
  78.                 $entrepreneur->save();
  79.                 $entrepreneur->matchDemandesIntervention();
  80.                 $geocodeManager->updateGpsDataForEntrepreneur($entrepreneur->getFullEntrepriseAdresse(), $entrepreneur'pro');
  81.                 $geocodeManager->updateGpsDataForEntrepreneur($entrepreneur->getFullAdress(), $entrepreneur);
  82.                 $this->addFlash('success''Les informations de votre profil ont bien été mises à jour.');
  83.                 return $this->redirectToRoute('entrepreneur_demande_intervention_list');
  84.             } else {
  85.                 $this->addFlash('warning'"Les informations de votre profil n'ont pu être enregistrées. Veuillez vérifier les informations renseignées et essayez à nouveau.");
  86.             }
  87.         }
  88.         if ($request->isMethod('post') && $dataMdp $request->get($formMdp->getName())) {
  89.             $formMdp->submit($dataMdp);
  90.             if ($formMdp->isValid()) {
  91.                 $entrepreneur $formMdp->getData();
  92.                 $entrepreneur->setDateMajFront(time());
  93.                 $entrepreneur->setMotDePasse($entrepreneur->getPlainMotDePasse())->save();
  94.                 $this->addFlash('success''Votre mot de passe a correctement été mis à jour. Pensez à le renseigner lors de votre prochaine connexion.');
  95.                 return $this->redirectToRoute('entrepreneur_profil_edition');
  96.             } else {
  97.                 $this->addFlash('warning'"Votre mot de passe n'a pu être mis à jour. Veuillez vérifier qu'il a été correctement renseigné.");
  98.             }
  99.         }
  100.         $formGestion->handleRequest($request);
  101.         if ($formGestion->isSubmitted()) {
  102.             if (!$formGestion->isValid()) {
  103.                 $this->addFlash('warning'"Les modifications n'ont pu être enregistrées. Merci de vérifier les informations renseignées et de les modifier au besoin.");
  104.             } else {
  105.                 if (null === $formGestion->get('raison_de_se_retirer')->getData()) {
  106.                     $formGestion->get('raison_de_se_retirer')->addError(new FormError('Vous devez renseigner une raison de suppression de votre compte.'));
  107.                     $this->addFlash('warning''Vous devez renseigner une raison pour supprimer votre compte.');
  108.                 } else {
  109.                     $entrepreneur->setRaisonDeSeRetirer($formGestion->get('raison_de_se_retirer')->getData());
  110.                     $interventions $entrepreneur->getInterventions();
  111.                     $statusToCheck = [
  112.                         InterventionStatut::ACCEPTEE,
  113.                         InterventionStatut::EN_ATTENTE_EVALUATION,
  114.                     ];
  115.                     $isOkayToDeleteAccount true;
  116.                     foreach ($interventions as $intervention) {
  117.                         if (in_array($intervention->getStatutId(), $statusToCheck)) {
  118.                             $isOkayToDeleteAccount false;
  119.                             break;
  120.                         }
  121.                     }
  122.                     if (!$isOkayToDeleteAccount) {
  123.                         $this->addFlash('warning''Vous ne pouvez pas supprimer votre compte car vous avez des interventions en cours ou en attente d\'évaluation.');
  124.                     } else {
  125.                         /** @var ClickableInterface $suspendreButton */
  126.                         $suspendreButton $formGestion->get('enregistrer');
  127.                         /** @var ClickableInterface $supprimerButton */
  128.                         $supprimerButton $formGestion->get('supprimer');
  129.                         if ($suspendreButton->isClicked()) {
  130.                             $dateReactivation = new \DateTime();
  131.                             switch ($formGestion->get('suspendre')->getData()) {
  132.                                 case GestionType::THREE_MONTHS:
  133.                                     $dateReactivation->add(new \DateInterval('P3M'));
  134.                                     break;
  135.                                 case GestionType::SIX_MONTHS:
  136.                                     $dateReactivation->add(new \DateInterval('P6M'));
  137.                                     break;
  138.                                 case GestionType::ONE_YEAR:
  139.                                     $dateReactivation->add(new \DateInterval('P12M'));
  140.                                     break;
  141.                             }
  142.                             $entrepreneur->suspendre($dateReactivation);
  143.                             $entrepreneur->setDateMajFront(time());
  144.                             $entrepreneur->save();
  145.                             try {
  146.                                 $mailManager->sendMailEntrepreneurDesactivationAdmin($entrepreneur);
  147.                             } catch (\Exception $e) {
  148.                                 throw new \Exception("Erreur lors de l'envoi du mail de suspension");
  149.                             }
  150.                             $this->addFlash('danger''Votre profil à bien été suspendu jusqu\'au '.$dateReactivation->format('d/m/Y'));
  151.                             return $this->redirectToRoute('entrepreneur_security_deconnexion');
  152.                         } elseif ($supprimerButton->isClicked()) {
  153.                             $entrepreneur->setStatutId(EntrepreneurStatut::SUPPRIME);
  154.                             $entrepreneur->setDateMajFront(time());
  155.                             $entrepreneur->save();
  156.                             try {
  157.                                 $mailManager->sendMailEntrepreneurSuppressionAdmin($entrepreneur);
  158.                             } catch (\Exception $e) {
  159.                                 throw new \Exception("Erreur lors de l'envoi du mail de suppression");
  160.                             }
  161.                             $this->addFlash('danger''Votre compte à été supprimé.');
  162.                             return $this->redirectToRoute('entrepreneur_security_deconnexion');
  163.                         }
  164.                     }
  165.                 }
  166.             }
  167.         }
  168.         $date = new \DateTime();
  169.         $date->modify('-1 year');
  170.         return $this->render('Entrepreneur/Security/profil.html.twig', [
  171.             'formProfil' => $formProfil->createView(),
  172.             'formMdp' => $formMdp->createView(),
  173.             'formGestion' => $formGestion->createView(),
  174.             'entrepreneur' => $entrepreneur,
  175.             'nbrInterventions' => $entrepreneur->getNombreInterventionParDate($date),
  176.         ]);
  177.     }
  178.     /**
  179.      * @Route(name="entrepreneur_security_activation", path="/auth/activation/{mail}/{uid}")
  180.      */
  181.     public function activationAction(Request $requestMailManager $mailManagerstring $mailstring $uid): Response
  182.     {
  183.         $entrepreneur EntrepreneurQuery::create()
  184.             ->filterByEmail($mail)
  185.             ->filterByUid($uid)
  186.             ->findOne();
  187.         if (!$entrepreneur) {
  188.             $this->addFlash('warning''Votre compte n\'a pu être activé. Si vous avez suivi le lien d\'activation renseigné dans notre précédent mail, merci de nous contacter.');
  189.             return $this->redirectToRoute('entrepreneur_homepage');
  190.         }
  191.         $form $this->createForm(MdpReinitialisationType::class, $entrepreneur);
  192.         $form->handleRequest($request);
  193.         if ($form->isSubmitted()) {
  194.             if (!$form->isValid()) {
  195.                 $this->addFlash('warning''Une erreur est survenue lors de l\'enregistrement du mot passe.');
  196.             } else {
  197.                 $entrepreneur $form->getData();
  198.                 $entrepreneur->setDateMajFront(time());
  199.                 $entrepreneur->setStatutId(EntrepreneurStatut::ACTIF);
  200.                 $entrepreneur->setDateActivation(new \DateTime());
  201.                 $entrepreneur->save();
  202.                 if (false === $entrepreneur->estForme() || null === $entrepreneur->estForme()) {
  203.                     $mailManager->sendMailEntrepreneurNonForme($entrepreneurtrue);
  204.                     $entrepreneur->setNbRelancesNonForme($entrepreneur->getNbRelancesNonForme() + 1)->save();
  205.                 }
  206.                 $this->addFlash('success''Votre compte a correctement été activé. Vous pouvez désormais vous connecter et accéder à l\'ensemble de nos services.');
  207.             }
  208.         }
  209.         if (EntrepreneurStatut::EN_ATTENTE_ACTIVATION === $entrepreneur->getStatutId() || null === $entrepreneur->getMotDePasse()) {
  210.             return $this->render('Entrepreneur/Security/activation.html.twig', [
  211.                 'entrepreneur' => $entrepreneur,
  212.                 'form' => $form->createView(),
  213.             ]);
  214.         }
  215.         $regions = [];
  216.         foreach ($entrepreneur->getDepartements() as $departement) {
  217.             $regions[] = $departement->getRegionId();
  218.         }
  219.         $formations FormationQuery::create()
  220.             ->orderByDate()
  221.             ->filterByFormationsFuturesEtRegions($regions)
  222.             ->find() ?? [];
  223.         return $this->render('Entrepreneur/Security/activation_suite.html.twig', [
  224.             'entrepreneur' => $entrepreneur,
  225.             'formations' => $formations,
  226.         ]);
  227.     }
  228.     /**
  229.      * @Route(name="entrepreneur_security_mdp_oublie", path="/auth/mot-de-passe/oublie")
  230.      */
  231.     public function mdpOublieAction(Request $requestMailManager $manager): Response
  232.     {
  233.         $params = [];
  234.         $form $this->createForm(MdpOublieType::class);
  235.         $form->handleRequest($request);
  236.         if ($form->isSubmitted() && $form->isValid()) {
  237.             $data $form->getData();
  238.             $entrepreneur EntrepreneurQuery::create()
  239.                 ->filterByEnabled()
  240.                 ->findOneByEmail($data['email']);
  241.             if ($entrepreneur) {
  242.                 $entrepreneur->setStatutId(EntrepreneurStatut::MDP_REINITIALISE);
  243.                 $entrepreneur->setDateMajFront(time());
  244.                 $entrepreneur->generateNewTokenReinitialisation();
  245.                 $entrepreneur->save();
  246.                 $manager->sendMailEntrepreneurMdpOublie($entrepreneur);
  247.                 $params['entrepreneur'] = $entrepreneur;
  248.                 $this->addFlash('success''La demande de changement de mot de passe a bien été prise en compte.');
  249.             } else {
  250.                 $this->addFlash('warning'"Aucun utilisateur valide avec l'identifiant renseigné n'a pu être trouvé dans notre système.");
  251.             }
  252.         }
  253.         $params['form'] = $form->createView();
  254.         return $this->render('Entrepreneur/Security/mdp_oublie.html.twig'$params);
  255.     }
  256.     /**
  257.      * @Route(name="entrepreneur_security_mdp_reinitialisation", path="/auth/mot-de-passe/reinitialisation/{uid}/{mail}/{token}")
  258.      */
  259.     public function mdpReinitialisationAction(Request $requeststring $uidstring $mailstring $token): Response
  260.     {
  261.         $entrepreneur EntrepreneurQuery::create()
  262.             ->filterByUid($uid)
  263.             ->filterByEmail($mail)
  264.             ->filterByTokenReinitialisation($token)
  265.             ->filterByStatutId(EntrepreneurStatut::MDP_REINITIALISE)
  266.             ->findOne();
  267.         if (!$entrepreneur) {
  268.             $this->addFlash('warning'"Votre lien d'activation n'est plus valide.");
  269.             return $this->redirectToRoute('entrepreneur_homepage');
  270.         }
  271.         $form $this->createForm(MdpReinitialisationType::class, $entrepreneur);
  272.         $form->handleRequest($request);
  273.         if ($form->isSubmitted()) {
  274.             if ($form->isValid()) {
  275.                 $entrepreneur $form->getData();
  276.                 $entrepreneur->setDateMajFront(time());
  277.                 $entrepreneur->setStatutId(EntrepreneurStatut::ACTIF)->save();
  278.                 $this->addFlash('success''Votre mot de passe a bien été réinitialisé. Vous pouvez désormais vous connecter avec ce dernier.');
  279.                 return $this->redirectToRoute('entrepreneur_security_connexion');
  280.             }
  281.             $this->addFlash('warning''Une erreur est survenue lors du changement de mot passe.');
  282.         }
  283.         return $this->render('Entrepreneur/Security/mdp_reinitialisation.html.twig', ['form' => $form->createView()]);
  284.     }
  285.     #[Route(path'/auth/connexion/mail'name'entrepreneur_security_connexion_mail')]
  286.     public function connexionMailAction(
  287.         Request $request,
  288.         MailManager $mailManager,
  289.         LoginLinkHandlerInterface $loginLinkHandler
  290.     ): Response {
  291.         if ($this->getUser() instanceof Entrepreneur) {
  292.             return $this->redirectToRoute('admin_homepage');
  293.         }
  294.         $form $this->createForm(ConnexionMailType::class);
  295.         $form->handleRequest($request);
  296.         if ($form->isSubmitted() && $form->isValid()) {
  297.             $data $form->getData();
  298.             $entrepreneur EntrepreneurQuery::create()->findOneByEmail($data['email']);
  299.             if ($entrepreneur) {
  300.                 try {
  301.                     $mailManager->sendMailEntrepreneurConnexionMail($entrepreneur$loginLinkHandler->createLoginLink($entrepreneur)->getUrl());
  302.                 } catch (PropelException|LoaderError|RuntimeError|SyntaxError) {
  303.                     $this->addFlash('danger''Une erreur est survenue.');
  304.                 }
  305.                 return $this->render('Front/Security/connexion_email.html.twig', [
  306.                     'email' => $entrepreneur->getEmail(),
  307.                     'bodyClass' => 'refonte-2023',
  308.                 ]);
  309.             }
  310.             $this->addFlash('warning''L\'identifiant est invalide.');
  311.         }
  312.         return $this->render('Front/Security/connexion_email.html.twig', [
  313.             'form' => $form->createView(),
  314.             'bodyClass' => 'refonte-2023',
  315.             'title' => 'Connexion pour les Entrepreneurs',
  316.             'username' => $request->get('username'''),
  317.         ]);
  318.     }
  319.     #[Route(path'/auth/connexion-link'name'entrepreneur_security_connexion_link')]
  320.     public function connexionLinkAction(LoginLinkHandlerInterface $loginLinkHandler): Response
  321.     {
  322.         return $this->redirectToRoute('entrepreneur_homepage');
  323.     }
  324.     #[Route(path'/rappel-activation'name'entrepreneur_security_rappel_activation')]
  325.     public function rappelActivationAction(MailManager $manager): Response
  326.     {
  327.         /** @var Entrepreneur $entrepreneur */
  328.         $entrepreneur $this->getUser();
  329.         $manager->sendMailEntrepreneurInscription(
  330.             $entrepreneur,
  331.             $this->generateUrl('entrepreneur_security_activation',
  332.                 ['mail' => $entrepreneur->getEmail(), 'uid' => $entrepreneur->getUid()],
  333.                 UrlGeneratorInterface::ABSOLUTE_URL
  334.             ),
  335.             isRelancetrue
  336.         );
  337.         $this->addFlash('success'"Le mail d'activation de compte vous a été envoyé.");
  338.         return $this->redirectToRoute('entrepreneur_demande_intervention_list');
  339.     }
  340. }