src/Controller/UserController.php line 317

Open in your IDE?
  1. <?php
  2. namespace App\Controller;
  3. use App\Entity\DataView;
  4. use App\Service\SendMail;
  5. use DateTime;
  6. use App\Service\ExceptionHandler;
  7. use Symfony\Bundle\FrameworkBundle\Controller\AbstractController;
  8. use Symfony\Component\HttpFoundation\RedirectResponse;
  9. use Symfony\Component\HttpFoundation\Request;
  10. use Symfony\Component\HttpFoundation\Response;
  11. use Symfony\Component\HttpKernel\Exception\NotFoundHttpException;
  12. use App\Entity\User;
  13. use App\Form\LostPassType;
  14. use App\Form\UserEditType;
  15. use App\Form\UserType;
  16. use Symfony\Component\Routing\Annotation\Route;
  17. /**
  18.  * @Route("/users")
  19.  */
  20. class UserController extends AbstractController
  21. {
  22.     private function getValidity()
  23.     {
  24.         /* Génération de la date de validité du token date du jour + 48 heures */
  25.         $date date('Y-m-d H:i:s');
  26.         $validity date("Y-m-d H:i:s"strtotime("+2 day"strtotime($date)));
  27.         return new DateTime($validity);
  28.     }
  29.     private function getToken()
  30.     {
  31.         /* Génération du token temporaire pour la finalisation de l'inscription de l'utilisteur */
  32.         $chaine 'abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789';
  33.         $melange str_shuffle($chaine);
  34.         return substr($melange032);
  35.     }
  36.     /**
  37.      * @var ExceptionHandler
  38.      */
  39.     private $exceptionHandler;
  40.     /**
  41.      * @return void
  42.      */
  43.     public function __construct()
  44.     {
  45.         $this->exceptionHandler = new ExceptionHandler();
  46.     }
  47.     /**
  48.      *
  49.      * Méthode pour afficher la liste des utilisateurs
  50.      * @Route("/list", name="user_index", methods={"GET"})
  51.      * @return Response
  52.      */
  53.     public function indexAction(Request $request)
  54.     {
  55.         $id $this->getUser()->getUserEntity()->getId();
  56.         $active $request->get('active'1);
  57.         $listUsers $this->getDoctrine()->getManager()->getRepository(User::class)->findBy([
  58.             'userEntity' => $id,
  59.             'isActive' => $active
  60.         ]);
  61.         // On donne toutes les informations nécessaires à la vue
  62.         return $this->render('User/index.html.twig', array(
  63.             'listUsers' => $listUsers,
  64.             'active' => $active
  65.         ));
  66.     }
  67.     /**
  68.      * Méthode pour afficher les détails d'un utilisateur
  69.      * @Route("/user/{id}", name="user_show", methods={"GET"})
  70.      * @param $id
  71.      * @return Response
  72.      */
  73.     public function viewAction($id)
  74.     {
  75.         $em $this->getDoctrine()->getManager();
  76.         $user $em->getRepository(User::class)->find($id);
  77.         if (null === $user) {
  78.             throw new NotFoundHttpException("L'utilisateur d'id ".$id." n'existe pas.");
  79.         }
  80.         return $this->render('User/view.html.twig', array(
  81.                 'user' => $user
  82.             ));
  83.     }
  84.     /**
  85.      * Méthode pour ajouter un utilisateur
  86.      * @Route("/add", name="user_add", methods={"GET","POST"})
  87.      * @param SendMail $mail
  88.      * @param Request $request
  89.      * @return RedirectResponse|Response
  90.      */
  91.     public function addAction(SendMail $mailRequest $request)
  92.     {
  93.         $role $this->getUser()->getRoles()[0];
  94.         $userEntity $this->getUser()->getUserEntity();
  95.         $entity $this->getUser()->getEntite();
  96.         $user = new User();
  97.         $form $this->get('form.factory')->create(UserType::class, $user, ['role' => $role]);
  98.         if ($request->isMethod('POST') && $form->handleRequest($request)->isValid()) {
  99.             $token $this->getToken();
  100.             $user->setToken($token);
  101.             $dateValide$this->getValidity();
  102.             $user->setValidity($dateValide);
  103.             $user->setUserEntity($userEntity);
  104.             $user->setEntite($entity);
  105.             $em $this->getDoctrine()->getManager();
  106.             $em->persist($user);
  107.             $em->flush();
  108.             //AJOUT DES VUES PAR DEFAUTS
  109.             $this->createBaseDataview($user);
  110.             //$mail = $this->get('email.user.mailer');
  111.             $mail->sendChangePassword($user);
  112.             $request->getSession()->getFlashBag()->add('success''Utilisateur bien enregistré.');
  113.             return $this->redirectToRoute('sudalys_users_view', array('id' => $user->getId()));
  114.         }
  115.         return $this->render('User/add.html.twig', array(
  116.             'form' => $form->createView(),
  117.         ));
  118.     }
  119.     public function createBaseDataview(User $user)
  120.     {
  121.         $em $this->getDoctrine()->getManager();
  122.         //****** MODULE VENTE *******/
  123.         // AJOUT VU ARTICLE
  124.         $dtv = new DataView();
  125.         $dtv->setOwner($user);
  126.         $dtv->setType('article');
  127.         $dtv->setDataTable('article');
  128.         $dtv->setDataClass('App\Entity\Article');
  129.         $dtv->setLabel('Articles');
  130.         $dtv->setTemplate('article');
  131.         $dtv->setModule('produit');
  132.         $em->persist($dtv);
  133.         // AJOUT VU ARTICLE
  134.         $dtv = new DataView();
  135.         $dtv->setOwner($user);
  136.         $dtv->setType('subscription_type');
  137.         $dtv->setDataTable('subscription_type');
  138.         $dtv->setDataClass('App\Entity\SubscriptionType');
  139.         $dtv->setLabel("Types d'abonnements");
  140.         $dtv->setTemplate('subscription_type');
  141.         $dtv->setModule('produit');
  142.         $em->persist($dtv);
  143.         // AJOUT VU ORGANISME CLIENT
  144.         $dtv = new DataView();
  145.         $dtv->setOwner($user);
  146.         $dtv->setType('client');
  147.         $dtv->setDataTable('organisme');
  148.         $dtv->setDataClass('App\Entity\Organisme');
  149.         $dtv->setLabel('Clients');
  150.         $dtv->setTemplate('organisme');
  151.         $dtv->setModule('organisme');
  152.         $em->persist($dtv);
  153.         // AJOUT VU DEVIS
  154.         $dtv = new DataView();
  155.         $dtv->setOwner($user);
  156.         $dtv->setType('devis');
  157.         $dtv->setDataTable('devis');
  158.         $dtv->setDataClass('App\Entity\Devis');
  159.         $dtv->setLabel('Devis');
  160.         $dtv->setTemplate('devis');
  161.         $dtv->setModule('vente');
  162.         $em->persist($dtv);
  163.         // AJOUT VU COMMANDE
  164.         $dtv = new DataView();
  165.         $dtv->setOwner($user);
  166.         $dtv->setType('commande');
  167.         $dtv->setDataTable('commande');
  168.         $dtv->setDataClass('App\Entity\Commande');
  169.         $dtv->setLabel('Commandes');
  170.         $dtv->setTemplate('commande');
  171.         $dtv->setModule('vente');
  172.         $em->persist($dtv);
  173.         // AJOUT VU FACTURE
  174.         $dtv = new DataView();
  175.         $dtv->setOwner($user);
  176.         $dtv->setType('facture');
  177.         $dtv->setDataTable('facture');
  178.         $dtv->setDataClass('App\Entity\Facture');
  179.         $dtv->setLabel('Factures');
  180.         $dtv->setTemplate('facture');
  181.         $dtv->setModule('vente');
  182.         $em->persist($dtv);
  183.         //****** MODULE ACHAT *******/
  184.         // AJOUT VU ORGANISME FOURNISSEUR
  185.         $dtv = new DataView();
  186.         $dtv->setOwner($user);
  187.         $dtv->setType('fournisseur');
  188.         $dtv->setDataTable('organisme');
  189.         $dtv->setDataClass('App\Entity\Organisme');
  190.         $dtv->setLabel('Fournisseurs');
  191.         $dtv->setTemplate('organisme');
  192.         $dtv->setModule('organisme');
  193.         $em->persist($dtv);
  194.         // AJOUT VU COMMANDE
  195.         $dtv = new DataView();
  196.         $dtv->setOwner($user);
  197.         $dtv->setType('commande_fp');
  198.         $dtv->setDataTable('commande_fournisseur');
  199.         $dtv->setDataClass('App\Entity\CommandeFournisseur');
  200.         $dtv->setLabel('Commandes fournisseurs');
  201.         $dtv->setTemplate('commande_fp');
  202.         $dtv->setModule('achat');
  203.         $em->persist($dtv);
  204.         // AJOUT VU FACTURE
  205.         $dtv = new DataView();
  206.         $dtv->setOwner($user);
  207.         $dtv->setType('facture_fp');
  208.         $dtv->setDataTable('facture_fournisseur');
  209.         $dtv->setDataClass('App\Entity\FactureFournisseur');
  210.         $dtv->setLabel('Factures fournisseurs');
  211.         $dtv->setTemplate('facture_fp');
  212.         $dtv->setModule('achat');
  213.         $em->persist($dtv);
  214.         $em->flush();
  215.         return true;
  216.     }
  217.     /**
  218.      * Méthode pour éditer un utilisateur
  219.      * @Route("/edit/{id}", name="user_edit", methods={"GET","POST"})
  220.      * @param $id
  221.      * @param Request $request
  222.      * @return RedirectResponse|Response
  223.      */
  224.     public function editAction($idRequest $request)
  225.     {
  226.         $role $this->getUser()->getRoles()[0];
  227.         $em $this->getDoctrine()->getManager();
  228.         $user $em->getRepository(User::class)->find($id);
  229.         if (null === $user) {
  230.             throw new NotFoundHttpException("L'utilisateur d'id " $id " n'existe pas.");
  231.         }
  232.         $form $this->get('form.factory')->create(UserEditType::class, $user, ['role' => $role]);
  233.         if ($request->isMethod('POST') && $form->handleRequest($request)->isValid()) {
  234.             $em->flush();
  235.             $request->getSession()->getFlashBag()->add('info''Utilisateur bien modifié.');
  236.             return $this->redirectToRoute('sudalys_users_view', array('id' => $user->getId()));
  237.         }
  238.         return $this->render('User/edit.html.twig', array(
  239.             'user' => $user,
  240.             'form' => $form->createView(),
  241.         ));
  242.     }
  243.     /**
  244.      * Méthode pour supprimer un utilisateur
  245.      * @Route("/delete/{id}", name="user_edit", methods={"POST"})
  246.      * @param $id
  247.      * @param Request $request
  248.      * @return RedirectResponse|Response
  249.      */
  250.     public function deleteAction($idRequest $request)
  251.     {
  252.         $em $this->getDoctrine()->getManager();
  253.         $user $em->getRepository(User::class)->find($id);
  254.         if (null === $user) {
  255.             throw new NotFoundHttpException("L'utilisateur d'id " $id " n'existe pas.");
  256.         }
  257.         // On crée un formulaire vide, qui ne contiendra que le champ CSRF
  258.         // Cela permet de protéger la suppression d'utilisateur contre cette faille
  259.         $form $this->get('form.factory')->create();
  260.         if ($request->isMethod('POST') && $form->handleRequest($request)->isValid()) {
  261.             $user->setIsActive(false);
  262.             //$em->remove($user);
  263.             $em->flush();
  264.             $request->getSession()->getFlashBag()->add('info'"L'utilisateur a bien été supprimé.");
  265.             return $this->redirectToRoute('sudalys_users_home');
  266.         }
  267.         return $this->render('User/delete.html.twig', array(
  268.             'user' => $user,
  269.             'form' => $form->createView(),
  270.         ));
  271.     }
  272.     /**
  273.      * Méthode pour récupérer le mot de passe perdu d'un utilisateur
  274.      * Attention pas encore testé
  275.      * @Route("/mot-de-passe-perdu", name="user_lostpass", methods={"GET"})
  276.      * @param Request $request
  277.      * @param SendMail $mail
  278.      * @return RedirectResponse|Response
  279.      */
  280.     public function lostPassAction(Request $requestSendMail $mail)
  281.     {
  282.         $user = new User();
  283.         $form $this->get('form.factory')->create(LostPassType::class, $user);
  284.         // On vérifie la requête = Post, on crée le lien requête <-> formulaire et on vérifie que les valeurs entrées sont valides
  285.         if ($request->isMethod('POST') && $form->handleRequest($request)->isValid()) {
  286.             $donnees $request->get('lost_pass');
  287.             $user $this->getDoctrine()
  288.             ->getManager()
  289.             ->getRepository(User::class)
  290.             ->findOneBy(array('email'=>$donnees['email']));
  291.             if (null === $user) {
  292.                 $request->getSession()->getFlashBag()->add('info''L\'adresse mail n\'éxiste pas');
  293.                 return $this->redirectToRoute('app_login');
  294.             } elseif ($user->getIsActive() == false) {
  295.                 $request->getSession()->getFlashBag()->add('info''Le compte utilisateur est désactivé');
  296.                 return $this->redirectToRoute('app_login');
  297.             } else {
  298.                 $user->setPassword(null);
  299.                 $user->setValidity($this->getValidity());
  300.                 // on enregistre User dans la base de données
  301.                 $em $this->getDoctrine()->getManager();
  302.                 $em->flush();
  303.                 $em->flush();
  304.                 $mail->sendChangePassword($user);
  305.                 $request->getSession()->getFlashBag()->add('info'"Un email pour créer votre nouveau mot de passe vous a été envoyé.");
  306.                 return $this->redirectToRoute('app_login');
  307.             }
  308.         }
  309.         return $this->render('User/lostPass.html.twig', array(
  310.             'user' => $user,
  311.             'form' => $form->createView()
  312.         ));
  313.     }
  314.     /**
  315.      * Méthode pour envoyer un nouvel email de confirmation pour activer le compte
  316.      * @param SendMail $mail
  317.      * @param $userId
  318.      * @return RedirectResponse
  319.      */
  320.     public function relanceMailAction(SendMail $mail$userId)
  321.     {
  322.         $em $this->getDoctrine()->getManager();
  323.         $user $this->getDoctrine()->getRepository(User::class)->find($userId);
  324.         $token $this->getToken();
  325.         $user->setToken($token);
  326.         $dateValide$this->getValidity();
  327.         $user->setValidity($dateValide);
  328.         $em->persist($user);
  329.         try {
  330.             $em->flush();
  331.             $mail->sendNewNotification($user$this->getParameter('adresse_web'));
  332.             $this->addFlash('success'"Un nouvel email a été envoyé à l'utilisateur pour valider son compte.");
  333.             /*if ($response['status'] === 'success') {
  334.                 $this->addFlash('success', "Un nouvel email a été envoyé à l'utilisateur pour valider son compte.");
  335.             } else {
  336.                 $this->addFlash('danger', "Une erreur c'est produite lors de l'envoi de l'email, vueillez réessayer.");
  337.             }*/
  338.         } catch (\Exception $e) {
  339.             /*$error = $this->exceptionHandler->getException($e);
  340.             $message = $this->exceptionHandler->exceptionHandler($error, 'utilisateur');*/
  341.             $this->addFlash('warning'$e->getMessage());
  342.         }
  343.         return $this->redirectToRoute('sudalys_users_home');
  344.     }
  345. }