<?php
namespace Entrepreneurs\Bundle\Entrepreneur\Controller;
use Entrepreneurs\Bundle\Admin\Controller\AdminController;
use Entrepreneurs\Bundle\AppBundle\Logger\EntrepreneurLogger;
use Entrepreneurs\Bundle\AppBundle\Manager\GeocodeManager;
use Entrepreneurs\Bundle\AppBundle\Manager\MailManager;
use Entrepreneurs\Bundle\AppBundle\Propel\Entrepreneur;
use Entrepreneurs\Bundle\AppBundle\Propel\EntrepreneurQuery;
use Entrepreneurs\Bundle\AppBundle\Propel\EntrepreneurStatut;
use Entrepreneurs\Bundle\AppBundle\Propel\FormationQuery;
use Entrepreneurs\Bundle\AppBundle\Propel\InterventionStatut;
use Entrepreneurs\Bundle\AppBundle\Propel\statCartoEntrepreneur;
use Entrepreneurs\Bundle\Entrepreneur\Form\GestionType;
use Entrepreneurs\Bundle\Entrepreneur\Form\MdpOublieType;
use Entrepreneurs\Bundle\Entrepreneur\Form\MdpReinitialisationType;
use Entrepreneurs\Bundle\Entrepreneur\Form\MdpType;
use Entrepreneurs\Bundle\Entrepreneur\Form\ProfilType;
use Entrepreneurs\Bundle\FrontBundle\Form\ConnexionMailType;
use Propel\Runtime\Exception\PropelException;
use Symfony\Component\Form\ClickableInterface;
use Symfony\Component\Form\FormError;
use Symfony\Component\HttpFoundation\Request;
use Symfony\Component\HttpFoundation\Response;
use Symfony\Component\Routing\Annotation\Route;
use Symfony\Component\Routing\Generator\UrlGeneratorInterface;
use Symfony\Component\Security\Core\Security;
use Symfony\Component\Security\Http\LoginLink\LoginLinkHandlerInterface;
use Twig\Error\LoaderError;
use Twig\Error\RuntimeError;
use Twig\Error\SyntaxError;
class SecurityController extends AdminController
{
/**
* @Route(name="entrepreneur_security_connexion", path="/auth/connexion")
*/
public function connexionAction(Request $request): Response
{
$session = $request->getSession();
if ($this->getUser()) {
return $this->forward('Entrepreneurs\Bundle\Entrepreneur\Controller\InterventionController::listAction');
}
if ($request->attributes->has(Security::AUTHENTICATION_ERROR)) {
$error = $request->attributes->get(Security::AUTHENTICATION_ERROR);
} else {
$error = $session->get(Security::AUTHENTICATION_ERROR);
$session->remove(Security::AUTHENTICATION_ERROR);
}
return $this->renderTwig('Entrepreneur:Security:connexion.html.twig', [
'last_username' => $session->get(Security::LAST_USERNAME),
'error' => $error,
]);
}
/**
* @Route(name="entrepreneur_profil_edition", path="/profil/edition")
*/
public function profilAction(Request $request, MailManager $mailManager, GeocodeManager $geocodeManager): Response
{
/** @var Entrepreneur $entrepreneur */
$entrepreneur = $this->getUser();
$fromCarto = $request->get('carto');
if ($fromCarto) {
$statCartoEntrepreneur = new statCartoEntrepreneur();
$statCartoEntrepreneur->setEntrepreneur($entrepreneur)
->setClickedUpdateProfileFromLinkOrModal(true)
->save();
}
$cloneEntrepreneur = clone $entrepreneur;
$formProfil = $this->createForm(ProfilType::class, $this->getUser(), ['request' => $request, 'entrepreneur' => $entrepreneur]);
$formMdp = $this->createForm(MdpType::class, $entrepreneur);
$formGestion = $this->createForm(GestionType::class, $entrepreneur);
if ($request->isMethod('post') && $dataProfil = $request->get($formProfil->getName())) {
$formProfil->submit($dataProfil);
if ($formProfil->isValid()) {
$entrepreneur = $formProfil->getData();
new EntrepreneurLogger(EntrepreneurLogger::RESEAU, $cloneEntrepreneur, $entrepreneur, $this->getUser());
$entrepreneur->setReceptionMailingHebdo(true);
$entrepreneur->setDateMajFront(time());
$entrepreneur->save();
$entrepreneur->matchDemandesIntervention();
$geocodeManager->updateGpsDataForEntrepreneur($entrepreneur->getFullEntrepriseAdresse(), $entrepreneur, 'pro');
$geocodeManager->updateGpsDataForEntrepreneur($entrepreneur->getFullAdress(), $entrepreneur);
$this->addFlash('success', 'Les informations de votre profil ont bien été mises à jour.');
return $this->redirectToRoute('entrepreneur_demande_intervention_list');
} else {
$this->addFlash('warning', "Les informations de votre profil n'ont pu être enregistrées. Veuillez vérifier les informations renseignées et essayez à nouveau.");
}
}
if ($request->isMethod('post') && $dataMdp = $request->get($formMdp->getName())) {
$formMdp->submit($dataMdp);
if ($formMdp->isValid()) {
$entrepreneur = $formMdp->getData();
$entrepreneur->setDateMajFront(time());
$entrepreneur->setMotDePasse($entrepreneur->getPlainMotDePasse())->save();
$this->addFlash('success', 'Votre mot de passe a correctement été mis à jour. Pensez à le renseigner lors de votre prochaine connexion.');
return $this->redirectToRoute('entrepreneur_profil_edition');
} else {
$this->addFlash('warning', "Votre mot de passe n'a pu être mis à jour. Veuillez vérifier qu'il a été correctement renseigné.");
}
}
$formGestion->handleRequest($request);
if ($formGestion->isSubmitted()) {
if (!$formGestion->isValid()) {
$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.");
} else {
if (null === $formGestion->get('raison_de_se_retirer')->getData()) {
$formGestion->get('raison_de_se_retirer')->addError(new FormError('Vous devez renseigner une raison de suppression de votre compte.'));
$this->addFlash('warning', 'Vous devez renseigner une raison pour supprimer votre compte.');
} else {
$entrepreneur->setRaisonDeSeRetirer($formGestion->get('raison_de_se_retirer')->getData());
$interventions = $entrepreneur->getInterventions();
$statusToCheck = [
InterventionStatut::ACCEPTEE,
InterventionStatut::EN_ATTENTE_EVALUATION,
];
$isOkayToDeleteAccount = true;
foreach ($interventions as $intervention) {
if (in_array($intervention->getStatutId(), $statusToCheck)) {
$isOkayToDeleteAccount = false;
break;
}
}
if (!$isOkayToDeleteAccount) {
$this->addFlash('warning', 'Vous ne pouvez pas supprimer votre compte car vous avez des interventions en cours ou en attente d\'évaluation.');
} else {
/** @var ClickableInterface $suspendreButton */
$suspendreButton = $formGestion->get('enregistrer');
/** @var ClickableInterface $supprimerButton */
$supprimerButton = $formGestion->get('supprimer');
if ($suspendreButton->isClicked()) {
$dateReactivation = new \DateTime();
switch ($formGestion->get('suspendre')->getData()) {
case GestionType::THREE_MONTHS:
$dateReactivation->add(new \DateInterval('P3M'));
break;
case GestionType::SIX_MONTHS:
$dateReactivation->add(new \DateInterval('P6M'));
break;
case GestionType::ONE_YEAR:
$dateReactivation->add(new \DateInterval('P12M'));
break;
}
$entrepreneur->suspendre($dateReactivation);
$entrepreneur->setDateMajFront(time());
$entrepreneur->save();
try {
$mailManager->sendMailEntrepreneurDesactivationAdmin($entrepreneur);
} catch (\Exception $e) {
throw new \Exception("Erreur lors de l'envoi du mail de suspension");
}
$this->addFlash('danger', 'Votre profil à bien été suspendu jusqu\'au '.$dateReactivation->format('d/m/Y'));
return $this->redirectToRoute('entrepreneur_security_deconnexion');
} elseif ($supprimerButton->isClicked()) {
$entrepreneur->setStatutId(EntrepreneurStatut::SUPPRIME);
$entrepreneur->setDateMajFront(time());
$entrepreneur->save();
try {
$mailManager->sendMailEntrepreneurSuppressionAdmin($entrepreneur);
} catch (\Exception $e) {
throw new \Exception("Erreur lors de l'envoi du mail de suppression");
}
$this->addFlash('danger', 'Votre compte à été supprimé.');
return $this->redirectToRoute('entrepreneur_security_deconnexion');
}
}
}
}
}
$date = new \DateTime();
$date->modify('-1 year');
return $this->render('Entrepreneur/Security/profil.html.twig', [
'formProfil' => $formProfil->createView(),
'formMdp' => $formMdp->createView(),
'formGestion' => $formGestion->createView(),
'entrepreneur' => $entrepreneur,
'nbrInterventions' => $entrepreneur->getNombreInterventionParDate($date),
]);
}
/**
* @Route(name="entrepreneur_security_activation", path="/auth/activation/{mail}/{uid}")
*/
public function activationAction(Request $request, MailManager $mailManager, string $mail, string $uid): Response
{
$entrepreneur = EntrepreneurQuery::create()
->filterByEmail($mail)
->filterByUid($uid)
->findOne();
if (!$entrepreneur) {
$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.');
return $this->redirectToRoute('entrepreneur_homepage');
}
$form = $this->createForm(MdpReinitialisationType::class, $entrepreneur);
$form->handleRequest($request);
if ($form->isSubmitted()) {
if (!$form->isValid()) {
$this->addFlash('warning', 'Une erreur est survenue lors de l\'enregistrement du mot passe.');
} else {
$entrepreneur = $form->getData();
$entrepreneur->setDateMajFront(time());
$entrepreneur->setStatutId(EntrepreneurStatut::ACTIF);
$entrepreneur->setDateActivation(new \DateTime());
$entrepreneur->save();
if (false === $entrepreneur->estForme() || null === $entrepreneur->estForme()) {
$mailManager->sendMailEntrepreneurNonForme($entrepreneur, true);
$entrepreneur->setNbRelancesNonForme($entrepreneur->getNbRelancesNonForme() + 1)->save();
}
$this->addFlash('success', 'Votre compte a correctement été activé. Vous pouvez désormais vous connecter et accéder à l\'ensemble de nos services.');
}
}
if (EntrepreneurStatut::EN_ATTENTE_ACTIVATION === $entrepreneur->getStatutId() || null === $entrepreneur->getMotDePasse()) {
return $this->render('Entrepreneur/Security/activation.html.twig', [
'entrepreneur' => $entrepreneur,
'form' => $form->createView(),
]);
}
$regions = [];
foreach ($entrepreneur->getDepartements() as $departement) {
$regions[] = $departement->getRegionId();
}
$formations = FormationQuery::create()
->orderByDate()
->filterByFormationsFuturesEtRegions($regions)
->find() ?? [];
return $this->render('Entrepreneur/Security/activation_suite.html.twig', [
'entrepreneur' => $entrepreneur,
'formations' => $formations,
]);
}
/**
* @Route(name="entrepreneur_security_mdp_oublie", path="/auth/mot-de-passe/oublie")
*/
public function mdpOublieAction(Request $request, MailManager $manager): Response
{
$params = [];
$form = $this->createForm(MdpOublieType::class);
$form->handleRequest($request);
if ($form->isSubmitted() && $form->isValid()) {
$data = $form->getData();
$entrepreneur = EntrepreneurQuery::create()
->filterByEnabled()
->findOneByEmail($data['email']);
if ($entrepreneur) {
$entrepreneur->setStatutId(EntrepreneurStatut::MDP_REINITIALISE);
$entrepreneur->setDateMajFront(time());
$entrepreneur->generateNewTokenReinitialisation();
$entrepreneur->save();
$manager->sendMailEntrepreneurMdpOublie($entrepreneur);
$params['entrepreneur'] = $entrepreneur;
$this->addFlash('success', 'La demande de changement de mot de passe a bien été prise en compte.');
} else {
$this->addFlash('warning', "Aucun utilisateur valide avec l'identifiant renseigné n'a pu être trouvé dans notre système.");
}
}
$params['form'] = $form->createView();
return $this->render('Entrepreneur/Security/mdp_oublie.html.twig', $params);
}
/**
* @Route(name="entrepreneur_security_mdp_reinitialisation", path="/auth/mot-de-passe/reinitialisation/{uid}/{mail}/{token}")
*/
public function mdpReinitialisationAction(Request $request, string $uid, string $mail, string $token): Response
{
$entrepreneur = EntrepreneurQuery::create()
->filterByUid($uid)
->filterByEmail($mail)
->filterByTokenReinitialisation($token)
->filterByStatutId(EntrepreneurStatut::MDP_REINITIALISE)
->findOne();
if (!$entrepreneur) {
$this->addFlash('warning', "Votre lien d'activation n'est plus valide.");
return $this->redirectToRoute('entrepreneur_homepage');
}
$form = $this->createForm(MdpReinitialisationType::class, $entrepreneur);
$form->handleRequest($request);
if ($form->isSubmitted()) {
if ($form->isValid()) {
$entrepreneur = $form->getData();
$entrepreneur->setDateMajFront(time());
$entrepreneur->setStatutId(EntrepreneurStatut::ACTIF)->save();
$this->addFlash('success', 'Votre mot de passe a bien été réinitialisé. Vous pouvez désormais vous connecter avec ce dernier.');
return $this->redirectToRoute('entrepreneur_security_connexion');
}
$this->addFlash('warning', 'Une erreur est survenue lors du changement de mot passe.');
}
return $this->render('Entrepreneur/Security/mdp_reinitialisation.html.twig', ['form' => $form->createView()]);
}
#[Route(path: '/auth/connexion/mail', name: 'entrepreneur_security_connexion_mail')]
public function connexionMailAction(
Request $request,
MailManager $mailManager,
LoginLinkHandlerInterface $loginLinkHandler
): Response {
if ($this->getUser() instanceof Entrepreneur) {
return $this->redirectToRoute('admin_homepage');
}
$form = $this->createForm(ConnexionMailType::class);
$form->handleRequest($request);
if ($form->isSubmitted() && $form->isValid()) {
$data = $form->getData();
$entrepreneur = EntrepreneurQuery::create()->findOneByEmail($data['email']);
if ($entrepreneur) {
try {
$mailManager->sendMailEntrepreneurConnexionMail($entrepreneur, $loginLinkHandler->createLoginLink($entrepreneur)->getUrl());
} catch (PropelException|LoaderError|RuntimeError|SyntaxError) {
$this->addFlash('danger', 'Une erreur est survenue.');
}
return $this->render('Front/Security/connexion_email.html.twig', [
'email' => $entrepreneur->getEmail(),
'bodyClass' => 'refonte-2023',
]);
}
$this->addFlash('warning', 'L\'identifiant est invalide.');
}
return $this->render('Front/Security/connexion_email.html.twig', [
'form' => $form->createView(),
'bodyClass' => 'refonte-2023',
'title' => 'Connexion pour les Entrepreneurs',
'username' => $request->get('username', ''),
]);
}
#[Route(path: '/auth/connexion-link', name: 'entrepreneur_security_connexion_link')]
public function connexionLinkAction(LoginLinkHandlerInterface $loginLinkHandler): Response
{
return $this->redirectToRoute('entrepreneur_homepage');
}
#[Route(path: '/rappel-activation', name: 'entrepreneur_security_rappel_activation')]
public function rappelActivationAction(MailManager $manager): Response
{
/** @var Entrepreneur $entrepreneur */
$entrepreneur = $this->getUser();
$manager->sendMailEntrepreneurInscription(
$entrepreneur,
$this->generateUrl('entrepreneur_security_activation',
['mail' => $entrepreneur->getEmail(), 'uid' => $entrepreneur->getUid()],
UrlGeneratorInterface::ABSOLUTE_URL
),
isRelance: true
);
$this->addFlash('success', "Le mail d'activation de compte vous a été envoyé.");
return $this->redirectToRoute('entrepreneur_demande_intervention_list');
}
}