src/Controller/UserController.php line 163

Open in your IDE?
  1. <?php
  2. namespace App\Controller;
  3. use App\Entity\Dashboard;
  4. use App\Entity\Mailling;
  5. use App\Entity\User;
  6. use App\Form\DashboardType;
  7. use App\Form\UserType;
  8. use App\Notification\MaillingNotification;
  9. use App\Repository\NoteRepository;
  10. use App\Repository\UserRepository;
  11. use Doctrine\ORM\EntityManagerInterface;
  12. use Symfony\Bundle\FrameworkBundle\Controller\AbstractController;
  13. use Symfony\Component\Form\Extension\Core\Type\EmailType;
  14. use Symfony\Component\Form\Extension\Core\Type\IntegerType;
  15. use Symfony\Component\Form\Extension\Core\Type\PasswordType;
  16. use Symfony\Component\Form\Extension\Core\Type\TextType;
  17. use Symfony\Component\HttpFoundation\JsonResponse;
  18. use Symfony\Component\HttpFoundation\Request;
  19. use Symfony\Component\HttpFoundation\Response;
  20. use Symfony\Component\Routing\Annotation\Route;
  21. use Symfony\Component\PasswordHasher\Hasher\UserPasswordHasherInterface;
  22. use Symfony\Component\Routing\Generator\UrlGeneratorInterface;
  23. /**
  24.  * @Route("/user")
  25.  */
  26. class UserController extends AbstractController
  27. {
  28.     public $passwordHasher;
  29.     public $maillingNotification;
  30.     public function __construct(UserPasswordHasherInterface $passwordHasherMaillingNotification $maillingNotification)
  31.     {
  32.         $this->passwordHasher $passwordHasher;
  33.         $this->maillingNotification $maillingNotification;
  34.     }
  35.     /**
  36.      *@Route("/", name="user.index")
  37.      */
  38.     public function index(UserRepository $userRepository)
  39.     {
  40.         if (!in_array('ROLE_MASTER'$this->getUser()->getRoles())) {
  41.             return $this->redirectToRoute('dashboard.index', [], Response::HTTP_SEE_OTHER);
  42.         }
  43.         return $this->render('user/index.html.twig', [
  44.             'users' => $userRepository->findAll()
  45.         ]);
  46.     }
  47.     /**
  48.      *@Route("/add", name="user.add")
  49.      */
  50.     public function add(Request $requestEntityManagerInterface $entityManagerUserRepository $userRepository)
  51.     {
  52.         if (!in_array('ROLE_MASTER'$this->getUser()->getRoles())) {
  53.             return $this->redirectToRoute('dashboard.index', [], Response::HTTP_SEE_OTHER);
  54.         }
  55.         $user = new User();
  56.         $form $this->createForm(UserType::class, $user);
  57.         $requestData $request->request->get('user');
  58.         if ($requestData != null) {
  59.             switch ($requestData['account_type']) {
  60.                 case 0:
  61.                     $user->setParentId(0);
  62.                     $user->setRoles(['ROLE_USER''ROLE_SUPER_ADMIN']);
  63.                     $user->setApiKey(base_convert(hash('sha256'time() . mt_rand()), 1636));
  64.                     break;
  65.                 case 1:
  66.                     $user->setParentId($requestData['parent']);
  67.                     $user->setRoles(['ROLE_USER']);
  68.                     $user->setApiKey($userRepository->find($requestData['parent'])->getApiKey());
  69.                     break;
  70.                 case 2:
  71.                     $user->setParentId($requestData['parent']);
  72.                     $user->setRoles(['ROLE_USER''ROLE_MANDATAIRE']);
  73.                     $user->setApiKey(base_convert(hash('sha256'time() . mt_rand()), 1636));
  74.                     break;
  75.             }
  76.             $user->setPlainPassword($this->setPassword())
  77.                 ->setPassword($this->passwordHasher->hashPassword($user$user->getPlainPassword()));
  78.             $password $user->getPlainPassword();
  79.         }
  80.         $form->handleRequest($request);
  81.         if ($form->isSubmitted() && $form->isValid()) {
  82.             $entityManager->persist($user);
  83.             $entityManager->flush();
  84.             if ($user->getParentId() == 0) {
  85.                 $user->setParentId($user->getId());
  86.                 $entityManager->flush($user);
  87.             }
  88.             $mailling = new Mailling();
  89.             $mailling->setSubject('Votre compte Integraal');
  90.             $mailling->setMessage('
  91.                 <h3>Bienvenue sur Integraal</h3>
  92.                 <p>Voici vos identifiants pour vous connecter à la plateforme : </p>
  93.                 <p>
  94.                     Adresse email : ' $user->getEmail() . '<br>
  95.                     Mot de passe : ' $password '<br>
  96.                     ' $this->generateUrl('app.login', [], UrlGeneratorInterface::ABSOLUTE_URL) . '
  97.                 </p>');
  98.             $mailling->setEmailFrom('no-reply@integraal.io');
  99.             $mailling->setEmailTo($user->getEmail());
  100.             $this->maillingNotification->notify($mailling);
  101.             return $this->redirectToRoute('user.index', [], Response::HTTP_SEE_OTHER);
  102.         }
  103.         return $this->render('user/add.html.twig', [
  104.             'form' => $form->createView()
  105.         ]);
  106.     }
  107.     /**
  108.      *@Route("/{id}/edit", name="user.edit", methods={"GET", "POST"})
  109.      */
  110.     public function edit(User $userRequest $requestEntityManagerInterface $entityManager)
  111.     {
  112.         if (!in_array('ROLE_MASTER'$this->getUser()->getRoles())) {
  113.             return $this->redirectToRoute('dashboard.index', [], Response::HTTP_SEE_OTHER);
  114.         }
  115.         $sendNewId false;
  116.         if ($request->request->get('user') != null && $user->getEmail() != $request->request->get('user')['email']) {
  117.             $sendNewId true;
  118.         }
  119.         $form $this->createForm(UserType::class, $user);
  120.         $form->handleRequest($request);
  121.         if ($form->isSubmitted() && $form->isValid()) {
  122.             $entityManager->flush($user);
  123.             if ($sendNewId$this->sendNewIdentifiant($user'<i>Le mot de passe que vous avez défini.</i>');
  124.             return $this->redirectToRoute('user.index', [], Response::HTTP_SEE_OTHER);
  125.         }
  126.         return $this->render('user/add.html.twig', [
  127.             'form' => $form->createView(),
  128.             'button_label' => 'Editer l\'utilisateur',
  129.             'edit'  => true
  130.         ]);
  131.     }
  132.     /**
  133.      *@Route("/{id}/resetpwd", name="user.resetPassword")
  134.      */
  135.     public function resetPassword(User $userRequest $requestEntityManagerInterface $entityManager)
  136.     {
  137.         if ($this->isCsrfTokenValid('reset-password' $user->getId(), $request->get('_token'))) {
  138.             $user->setPlainPassword($this->setPassword())
  139.                 ->setPassword($this->passwordHasher->hashPassword($user$user->getPlainPassword()));
  140.             $password $user->getPlainPassword();
  141.             $entityManager->flush($user);
  142.             $this->sendNewIdentifiant($user$password);
  143.         }
  144.         return $this->redirectToRoute('user.index', [], Response::HTTP_SEE_OTHER);
  145.     }
  146.     /**
  147.      *@Route("/forgotPassword", name="user.forgotPassword", methods={"GET", "POST"})
  148.      */
  149.     public function forgotPassword(Request $requestEntityManagerInterface $entityManagerUserRepository $userRepository)
  150.     {
  151.         if ($request->request->get('email')) {
  152.             if ($this->isCsrfTokenValid('reset-pwd'$request->get('_token'))) {
  153.                 $users $userRepository->findBy(['email' => $request->request->get('email')]);
  154.                 if ($users) {
  155.                     $user $users[0];
  156.                     $user->setPlainPassword($this->setPassword())
  157.                         ->setPassword($this->passwordHasher->hashPassword($user$user->getPlainPassword()));
  158.                     $password $user->getPlainPassword();
  159.                     $entityManager->flush($user);
  160.                     $this->sendNewIdentifiant($user$password);
  161.                     return $this->render('user/forgot_finish.html.twig');
  162.                 }
  163.             }
  164.         }
  165.         // if($request->request)
  166.         return $this->render('user/forgot.html.twig');
  167.     }
  168.     private function sendNewIdentifiant(User $userstring $password)
  169.     {
  170.         $mailling = new Mailling();
  171.         $mailling->setSubject('Vos identifiants Integraal');
  172.         $mailling->setMessage('
  173.             <h3>Vos identifiant sur Integraal ont changé</h3>
  174.             <p>Voici vos nouveaux identifiant pour vous connecter à la plateforme :</p>
  175.             <p>
  176.                 Adresse email : ' $user->getEmail() . '<br>
  177.                 Mot de passe : ' $password ' <br>
  178.                 ' $this->generateUrl('app.login', [], UrlGeneratorInterface::ABSOLUTE_URL) . '
  179.             </p>');
  180.         $mailling->setEmailFrom('no-reply@integraal.io');
  181.         $mailling->setEmailTo($user->getEmail());
  182.         $this->maillingNotification->notify($mailling);
  183.     }
  184.     private function setPassword()
  185.     {
  186.         $comb 'abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ1234567890';
  187.         $pass = array();
  188.         $combLen strlen($comb) - 1;
  189.         for ($i 0$i 8$i++) {
  190.             $n rand(0$combLen);
  191.             $pass[] = $comb[$n];
  192.         }
  193.         return implode($pass);
  194.     }
  195.     /**
  196.      *@Route("/password", name="user.password")
  197.      */
  198.     public function editPassword(Request $requestEntityManagerInterface $entityManager)
  199.     {
  200.         $user $this->getUser();
  201.         $form $this->createFormBuilder($user)
  202.             ->add('new_password'PasswordType::class, ['mapped' => false'label' => 'Nouveau mot de passe'])
  203.             ->getForm();
  204.         // $form = $this->createForm(UserType::class, $user);
  205.         $requestData $request->request->get('form');
  206.         if ($requestData != null) {
  207.             $password $requestData['new_password'];
  208.             $uppercase preg_match('@[A-Z]@'$password);
  209.             $lowercase preg_match('@[a-z]@'$password);
  210.             $number    preg_match('@[0-9]@'$password);
  211.             $specialChars preg_match('@[^a-z^0-9^A-Z]@'$password);
  212.             if (!$uppercase || !$lowercase || !$number || !$specialChars || strlen($password) < 8) {
  213.                 $error = ['<div class="col-12 alert alert-warning">Le mot de passe doit comporter au moins 8 caractères et doit inclure au moins une lettre minuscule, une lettre majuscule, un chiffre et un caractère spécial</div>'];
  214.             } else {
  215.                 $form->handleRequest($request);
  216.                 if ($form->isSubmitted() && $form->isValid()) {
  217.                     $user->setPlainPassword($requestData['new_password'])
  218.                         ->setPassword($this->passwordHasher->hashPassword($user$user->getPlainPassword()));
  219.                     $password $user->getPlainPassword();
  220.                     $entityManager->flush($user);
  221.                     $this->sendNewIdentifiant($user$password);
  222.                     $this->addFlash(
  223.                         'notice',
  224.                         'Les changements ont été sauvegardé.'
  225.                     );
  226.                     return $this->redirectToRoute('user.password', [], Response::HTTP_SEE_OTHER);
  227.                 }
  228.             }
  229.         }
  230.         return $this->render('user/edit_password.html.twig', [
  231.             'form' => $form->createView(),
  232.             'current_sub_page' => 'edit_password',
  233.             'error' => $error ?? ''
  234.         ]);
  235.     }
  236.     /**
  237.      *@Route("/objectif", name="user.objectif")
  238.      */
  239.     public function objectif(Request $requestEntityManagerInterface $entityManager)
  240.     {
  241.         $user $this->getUser();
  242.         $dashboardInfo = new Dashboard($user->getDashboardInfo());
  243.         $form $this->createForm(DashboardType::class, $dashboardInfo);
  244.         $form->handleRequest($request);
  245.         if ($form->isSubmitted() && $form->isValid()) {
  246.             $user->setDashboardInfo($dashboardInfo->setJson());
  247.             $entityManager->flush($user);
  248.             $this->addFlash(
  249.                 'notice',
  250.                 'Les changements ont été sauvegardé.'
  251.             );
  252.             return $this->redirectToRoute('user.objectif', [], Response::HTTP_SEE_OTHER);
  253.         }
  254.         return $this->render('user/objectif.html.twig', [
  255.             'form' => $form->createView(),
  256.             'current_sub_page' => 'objectif'
  257.         ]);
  258.     }
  259.     /**
  260.      *@Route("/settings", name="user.settings")
  261.      */
  262.     public function settingsAccount(Request $requestEntityManagerInterface $entityManager)
  263.     {
  264.         $user $this->getUser();
  265.         $form $this->createFormBuilder($user)
  266.             ->add('email'EmailType::class, ['label' => 'Email'])
  267.             ->add('first_name'TextType::class, ['label' => 'Prénom'])
  268.             ->add('name'TextType::class, ['label' => 'Nom'])
  269.             ->add('street'TextType::class, ['label' => 'Adresse'])
  270.             ->add('street_number'IntegerType::class, ['label' => 'N°'])
  271.             ->add('zipcode'TextType::class, ['label' => 'Code postal'])
  272.             ->add('city'TextType::class, ['label' => 'Ville'])
  273.             ->add('phone'TextType::class, ['label' => 'Téléphone'])
  274.             ->getForm();
  275.         // $form = $this->createForm(UserType::class, $user);
  276.         $form->handleRequest($request);
  277.         if ($form->isSubmitted() && $form->isValid()) {
  278.             $entityManager->flush($user);
  279.             $this->addFlash(
  280.                 'notice',
  281.                 'Les changements ont été sauvegardé.'
  282.             );
  283.             return $this->redirectToRoute('user.settings', [], Response::HTTP_SEE_OTHER);
  284.         }
  285.         return $this->render('user/settings.html.twig', [
  286.             'form' => $form->createView(),
  287.             'current_sub_page' => 'account_settings'
  288.         ]);
  289.     }
  290.     /**
  291.      * @Route("/change-user", name="user.changeUser", methods={"POST"})
  292.      */
  293.     public function changeUser(Request $requestUserRepository $userRepository): Response
  294.     {
  295.         if ($request->isXmlHttpRequest()) {
  296.             if ($request->request->get('PossessUser') == 'all') {
  297.                 $request->getSession()->set('userPossess''all');
  298.             } else {
  299.                 $request->getSession()->set('userPossess'$userRepository->find($request->request->get('PossessUser')));
  300.             }
  301.             return new JsonResponse([
  302.                 'redirect' => $request->headers->get('referer')
  303.             ]);
  304.         }
  305.     }
  306.     /**
  307.      * @Route("/delete/{id}", name="user.delete", methods={"POST"})
  308.      */
  309.     public function delete(Request $requestUser $userEntityManagerInterface $entityManagerUserRepository $userRepositoryNoteRepository $noteRepository): Response
  310.     {
  311.         $remove_id $user->getId();
  312.         if ($this->isCsrfTokenValid('delete' $remove_id$request->request->get('_token'))) {
  313.             $parent $userRepository->findBy(['id' => $user->getParentId()])[0];
  314.             $notes $noteRepository->findBy(['user' => $user->getId()]);
  315.             if ($parent == $user) {
  316.                 $users $userRepository->getAllAgent($parent->getId());
  317.                 foreach ($users as $userRelation) {
  318.                     if ($userRelation != $parent) {
  319.                         $this->removeUserRelation($userRelation$entityManager$userRepository$noteRepository);
  320.                         $entityManager->remove($userRelation);
  321.                     }
  322.                 }
  323.                 foreach ($user->getTasksActor() as $item) {
  324.                     $entityManager->remove($item);
  325.                     $entityManager->flush();
  326.                 }
  327.                 foreach ($user->getTasks() as $item) {
  328.                     $entityManager->remove($item);
  329.                     $entityManager->flush();
  330.                 }
  331.                 foreach ($user->getMaillings() as $item) {
  332.                     $entityManager->remove($item);
  333.                     $entityManager->flush();
  334.                 }
  335.                 foreach ($user->getMarkers() as $item) {
  336.                     $entityManager->remove($item);
  337.                     $entityManager->flush();
  338.                 }
  339.                 foreach ($user->getNotifications() as $item) {
  340.                     $entityManager->remove($item);
  341.                     $entityManager->flush();
  342.                 }
  343.                 foreach ($notes as $item) {
  344.                     $entityManager->remove($item);
  345.                     $entityManager->flush();
  346.                 }
  347.                 foreach ($user->getLeadsByPossessor() as $item) {
  348.                     $entityManager->remove($item);
  349.                     $entityManager->flush();
  350.                 }
  351.             } else {
  352.                 $this->removeUserRelation($user$entityManager$userRepository$noteRepository);
  353.             }
  354.             $entityManager->remove($user);
  355.             $entityManager->flush();
  356.             if ($request->isXmlHttpRequest()) {
  357.                 return new JsonResponse([
  358.                     'remove' => 'true'
  359.                 ]);
  360.             }
  361.         }
  362.         return $this->redirectToRoute('user.index', [], Response::HTTP_SEE_OTHER);
  363.     }
  364.     private function removeUserRelation(User $userEntityManagerInterface $entityManagerUserRepository $userRepositoryNoteRepository $noteRepository)
  365.     {
  366.         $parent $userRepository->findBy(['id' => $user->getParentId()])[0];
  367.         $notes $noteRepository->findBy(['user' => $user->getId()]);
  368.         foreach ($user->getTasksActor() as $item) {
  369.             $item->setUser($parent);
  370.             $item->setUserAction($parent);
  371.             $entityManager->flush();
  372.         }
  373.         foreach ($user->getTasks() as $item) {
  374.             $item->setUser($parent);
  375.             $item->setUserAction($parent);
  376.             $entityManager->flush();
  377.         }
  378.         foreach ($user->getMaillings() as $item) {
  379.             $item->setUser($parent);
  380.             $entityManager->flush();
  381.         }
  382.         foreach ($user->getMarkers() as $item) {
  383.             $item->setUser($parent);
  384.             $entityManager->flush();
  385.         }
  386.         foreach ($user->getNotifications() as $item) {
  387.             $item->setUser($parent);
  388.             $item->setIsSeen(0);
  389.             $entityManager->flush();
  390.         }
  391.         foreach ($notes as $item) {
  392.             $item->setUser($parent);
  393.             $entityManager->flush();
  394.         }
  395.         foreach ($user->getLeads() as $item) {
  396.             $item->setUser($parent);
  397.             $entityManager->flush();
  398.         }
  399.     }
  400. }