src/Controller/admin/UserController.php line 318

Open in your IDE?
  1. <?php
  2. namespace App\Controller\admin;
  3. use App\Entity\Company;
  4. use App\Entity\FormationRegistration;
  5. use App\Entity\Log;
  6. use App\Entity\Role;
  7. use App\Entity\User;
  8. use App\Entity\UserActivity;
  9. use App\Events\Events;
  10. use App\Form\UserType;
  11. use App\Security\Voter\CompanyVoter;
  12. use App\Service\completion\CompletionService;
  13. use App\Service\datatable\Builder;
  14. use App\Service\profile\ProfileService;
  15. use App\Service\subscription\SubscriptionService;
  16. use Doctrine\Persistence\ManagerRegistry;
  17. use Sensio\Bundle\FrameworkExtraBundle\Configuration\ParamConverter;
  18. use Sensio\Bundle\FrameworkExtraBundle\Configuration\Security;
  19. use Symfony\Bundle\FrameworkBundle\Controller\AbstractController;
  20. use Symfony\Component\EventDispatcher\EventDispatcherInterface;
  21. use Symfony\Component\EventDispatcher\GenericEvent;
  22. use Symfony\Component\Form\Extension\Core\Type\ChoiceType;
  23. use Symfony\Component\Form\Extension\Core\Type\TextType;
  24. use Symfony\Component\HttpFoundation\JsonResponse;
  25. use Symfony\Component\HttpFoundation\Request;
  26. use Symfony\Component\Security\Core\Authentication\Token\Storage\TokenStorageInterface;
  27. use Symfony\Component\Security\Guard\Token\PostAuthenticationGuardToken;
  28. use Symfony\Component\Routing\Annotation\Route;
  29. use Symfony\Component\Validator\Validator\ValidatorInterface;
  30. class UserController extends AbstractController
  31. {
  32.     private ManagerRegistry $managerRegistry;
  33.     public function __construct(ManagerRegistry $managerRegistry)
  34.     {
  35.         $this->managerRegistry = $managerRegistry;
  36.     }
  37.     /**
  38.      * @param Request $request
  39.      * @Security("is_granted('ROLE_RH')")
  40.      * @Route("/api/subscription/users", name="subscription-users", methods={"POST"})
  41.      */
  42.     public function fetchUsers(Request $request, ManagerRegistry $managerRegistry){
  43.         $companyID = $request->request->get('ID');
  44.         $company = $managerRegistry->getRepository(Company::class)->find($companyID);
  45.         /* @see CompanyVoter */
  46.         $this->denyAccessUnlessGranted(CompanyVoter::COMPANY_SHOW,$company);
  47.         if(!$company) {
  48.             return new JsonResponse("ko",400);
  49.         }
  50.         $dt_ajax_url = $this->generateUrl('dt-users', ['company' => $company->getId()]);
  51.         $content = $this->renderView('pages/admin/company/blocks/company.users.html.twig',[
  52.             "company"=>$company,
  53.             "users_count"=>$company->getUsers()->count(),
  54.             "dt_url"=>$dt_ajax_url,
  55.             'context'=> 'users'
  56.         ]);
  57.         $actions = $this->renderView('pages/admin/company/blocks/tab.actions.html.twig',[
  58.             'context'=> 'users',
  59.             "users_count"=>$company->getUsers()->count(),
  60.             'company' => $company
  61.         ]);
  62.         return new JsonResponse(["content"=>$content,"actions"=>$actions]);
  63.     }
  64.     /**
  65.      * @param Request $request
  66.      * @Security("is_granted('ROLE_RH')")
  67.      * @Route("/api/subscription/user", name="subscription-show-user", methods={"POST"})
  68.      */
  69.     public function fetchUser(Request $request, ManagerRegistry $managerRegistry,CompletionService $completionService,ProfileService $profileService){
  70.         $ID = $request->request->get('ID');
  71.         $user = $managerRegistry->getRepository(User::class)->find($ID);
  72.         /* @see CompanyVoter */
  73.         $this->denyAccessUnlessGranted(CompanyVoter::USER_EDIT,$user);
  74.         if(!$user) {
  75.             return new JsonResponse("ko",400);
  76.         }
  77.         $proCompletion = $completionService->getProfessional($user);
  78.         $privateCompletion = $completionService->getPrivate($user);
  79.         $userProActivities = $profileService->transformProActivitiesForRead($user);
  80.         $privateActivities = $profileService->transformPrivateActivitiesForRead($user);
  81.         //Stats visio
  82.         $logs = $this->managerRegistry->getRepository(Log::class)->getHistory($user, Events::VIDEO_COMPLETE);
  83.         $loginHistory = $this->managerRegistry->getRepository(Log::class)->getLoginHistory($user);
  84. //        if (!$this->isGranted('ROLE_ADMIN')){
  85. //            //VIDEOS only CAT === ERGO
  86. //            $logs = array_filter($logs, function ($log) {
  87. //                return isset($log['sources']['feedData']) &&  $log['sources']['feedData']['CAT'] === 'ERGO';
  88. //            });
  89. //        }
  90.         //FORMATION
  91.         if( $this->isGranted('ROLE_ADMIN') ){
  92.             $formations = $this->managerRegistry->getRepository(FormationRegistration::class)->getAllFormationViewed($user);
  93.         }
  94.         //si j suis gestionnaire > on retire les formations qui ne m'appartiennent pas
  95.         else{
  96.             $formations = $this->managerRegistry->getRepository(FormationRegistration::class)->getAllFormationViewed($user,true);
  97.         }
  98.         $content = $this->renderView('pages/admin/user/show.user.html.twig',[
  99.             "user"=>$user,
  100.             "proCompletion"=>$proCompletion,
  101.             "privateCompletion"=>$privateCompletion,
  102.             "proActivities" => $userProActivities,
  103.             "privateActivities" => $privateActivities,
  104.             "history_visio"=>$logs,
  105.             "loginHistory"=>$loginHistory,
  106.             "formations"=>$formations,
  107.             'context'=> 'users'
  108.         ]);
  109.         return new JsonResponse(["content"=>$content]);
  110.     }
  111.     /**
  112.      * RH OR ADMIN add users
  113.      * @param Request $request
  114.      * @Security("is_granted('ROLE_RH')")
  115.      * @Route("/admin/subscription/{slug}/add-users", name="admin-add-users")
  116.      * @ParamConverter("company", options={"mapping": {"slug": "slug"}})
  117.      */
  118.     public function addUsers(Request $request, Company $company, EventDispatcherInterface $eventDispatcher,
  119.                              ValidatorInterface $validator,SubscriptionService $subscriptionService)
  120.     {
  121.         /* @see CompanyVoter */
  122.         $this->denyAccessUnlessGranted(CompanyVoter::COMPANY_SHOW,$company);
  123.         /* @var $currentUser User*/
  124.         $currentUser = $this->getUser();
  125.         $hasErrors = false;
  126.         if($request->isMethod('POST')){
  127.             $em = $this->managerRegistry->getManager();
  128.             $data = $request->request->all();
  129.             //retire les lignes vides du formulaire
  130.             $allData = array_filter($data,function ($v,$k){
  131.                     return $v && $v !== "";
  132.             },ARRAY_FILTER_USE_BOTH);
  133.             //Group data by user
  134.             $usersToSave=[];
  135.             foreach ($allData as $k => $v){
  136.                 list($entity,$field,$index) = explode("_",$k);
  137.                 if(!isset( $usersToSave[$index]) && empty($usersToSave[$index])){
  138.                     $usersToSave[$index] = [];
  139.                 }
  140.                 $usersToSave[$index][$field] = $v;
  141.             }
  142.             $entityUserSaved=[];
  143.             foreach ($usersToSave as &$user){
  144.                 $_user = new User();
  145.                 if (in_array($user['role'], User::getAssignableRoleNames(), true)) {
  146.                     $user_role =$em->getRepository(Role::class)->findOneBy(['name' => $user['role']]);
  147.                 }
  148.                 else{
  149.                     $user_role =$em->getRepository(Role::class)->findOneBy(['name' => User::ROLE_USER_ACTIF]);
  150.                 }
  151.                 $_user->setRoles($user_role);
  152.                 $_user->setEmail(trim($user['email']));
  153.                 $_user->setLastname(trim($user['lastname']));
  154.                 $_user->setFirstname(trim($user['firstname']));
  155.                 if(isset($user['contact']) && $user['contact'] === "on"){
  156.                     $_user->setIsContact(1);
  157.                 }
  158.                 else{
  159.                     $_user->setIsContact(0);
  160.                 }
  161.                 $_user->setCompany($company);
  162.                 $_errors = $validator->validate($_user);
  163.                 if($_errors->count() > 0){
  164.                     $hasErrors = true;
  165.                     $user['errors'] = $_errors;
  166.                 }
  167.                 if($_errors->count() === 0){
  168.                     $em->persist($_user);
  169.                     //save user entities for emails
  170.                     array_push($entityUserSaved,$_user);
  171.                 }
  172.             }
  173.             if($subscriptionService->checkUserLimitReached($company,sizeof($usersToSave))){
  174.                 $hasErrors = true;
  175.                 $this->addFlash('notice-warning','Vous avez utilisé toutes vos licences ! Contactez votre administrateur pour en ajouter.');
  176.             }
  177.             if (!$hasErrors){
  178.                 $em->flush();
  179.                 if(sizeof($usersToSave) > 1){
  180.                     $this->addFlash('notice-success',sprintf('%d utilisateurs ont été ajoutés',sizeof($usersToSave)));
  181.                 }
  182.                 else if(sizeof($usersToSave) === 1){
  183.                     $this->addFlash('notice-success',sprintf('%d utilisateur a été ajouté',1));
  184.                 }
  185.                 //send email
  186.                 foreach ($entityUserSaved as $userSaved){
  187.                     /*Notify user by email*/
  188.                     $event = new GenericEvent($userSaved);
  189.                     $eventDispatcher->dispatch($event, Events::EMAIL_NEW_ACCOUNT);
  190.                 }
  191.                 return $this->redirectToRoute('admin-subscription-company',['slug'=>$company->getSlug(),'tab'=>'users']);
  192.             }
  193.         }
  194.         return $this->render('pages/admin/user/add.users.html.twig', [
  195.             'title_page' => $currentUser->hasRole('ROLE_RH')  ? 'Mon établissement' : 'Abonnements',
  196.             'company'=> $company,
  197.             'user_data' => ( isset($usersToSave) && $hasErrors )? $usersToSave : null
  198.         ]);
  199.     }
  200.     /**
  201.      * @param Request $request
  202.      * @Security("is_granted('ROLE_RH') or is_granted('ROLE_ADMIN')")
  203.      * @Route("/admin/user/{user}", name="admin-update-user")
  204.      */
  205.     public function updateUser(Request $request, User $user, TokenStorageInterface $tokenStorage)
  206.     {
  207.         /* @see CompanyVoter */
  208.         $this->denyAccessUnlessGranted(CompanyVoter::USER_EDIT,$user);
  209.         /** @var User $connectedUser */
  210.         $connectedUser = $this->getUser();
  211.         $editingSelf = $connectedUser->getId() === $user->getId();
  212.         $previousRole = $user->getRoles()[0] ?? null;
  213.         // Les choix dépendent du compte connecté ; la valeur initiale appartient au compte modifié.
  214.         $personal_form = $this->createForm(UserType::class, $user, [
  215.             'current_role' => $previousRole,
  216.             'actor_role' => $connectedUser->getRoles()[0] ?? null,
  217.         ]);
  218.         // $personal_form->remove('birth')->remove('gender');
  219.         if (!$this->isGranted('ROLE_RH')) {
  220.             $personal_form->remove('role');
  221.         }
  222.         $personal_form->handleRequest($request);
  223.         if ($personal_form->isSubmitted() && $personal_form->isValid()) {
  224.             $em = $this->managerRegistry->getManager();
  225.             $em->persist($user);
  226.             $em->flush();
  227.             // Renouveler uniquement la session du compte connecté après la sauvegarde.
  228.             if ($editingSelf && $previousRole !== $user->getRole()->getName()) {
  229.                 $connectedUser->setRoles($user->getRole());
  230.                 $tokenStorage->setToken(new PostAuthenticationGuardToken($connectedUser, 'main', $connectedUser->getRoles()));
  231.             }
  232.             $this->addFlash('notice-success', 'L\' utilisateur a bien été modifié');
  233.             if ($editingSelf && $user->isStandardUser()) {
  234.                 return $this->redirectToRoute('user_dashboard');
  235.             }
  236.             return $this->redirectToRoute('admin-subscription-company',['slug'=>$user->getCompany()->getSlug(),"tab"=>"users"]);
  237.         }
  238.         return $this->render('pages/admin/user/user.html.twig', [
  239.             'title_page' => 'Utilisateurs',
  240.             'personal_form' => $personal_form->createView(),
  241.             'current_user' => $user,
  242.             'context' => "update",
  243.             'company' => $user->getCompany()
  244.         ]);
  245.     }
  246.     /*AJAX*/
  247.     /**
  248.      * Alimente la datatable
  249.      * @param Request $request
  250.      * @Security("is_granted('ROLE_RH') or is_granted('ROLE_ADMIN')")
  251.      * @Route("/api/dt/company/users/{company}", name="dt-users", methods={"GET"})
  252.      * @return JsonResponse
  253.      */
  254.     public function dtCompanyUsers(Request $request, Company $company, Builder $dtBuilder, CompletionService $completionService)
  255.     {
  256.         $em = $this->managerRegistry->getManager();
  257.         $params = $request->query->all();
  258.         $roles = User::getStandardAndManagerRoleNames();
  259.         if ($this->isGranted(User::ROLE_ADMIN)) {
  260.             $roles[] = User::ROLE_ADMIN;
  261.         }
  262.         $query = $em->getRepository(User::class)->getQueryUsers($roles, $company->getId());
  263.         $columns=[
  264.             'id' => 'u.id',
  265.             'contact'=>'u.isContact',
  266.             'lastname' => 'u.lastname',
  267.             'firstname' => 'u.firstname',
  268.             'email' => 'u.email',
  269.             'role' => 'r.name',
  270.             'lastLoginAt' => 'u.lastLoginAt',
  271.             'updatedAt' => 'u.updatedAt',
  272.             ];
  273.         $dataTables = $dtBuilder
  274.             ->withColumnAliases($columns)
  275.             ->withIndexColumn('u.id')
  276.             ->withQueryBuilder($query)
  277.             ->withRequestParams($params);
  278.         $data = $dataTables->getResponse();
  279.         foreach ($data['data'] as &$d){
  280.             $user = $this->managerRegistry->getRepository(User::class)->find($d["id"]);
  281.             $d['profile'] = $completionService->getTotalUserCompletionRate($user);
  282.         }
  283.         return new JsonResponse($data);
  284.     }
  285.     /**
  286.      * check user limit process
  287.      * @param Request $request
  288.      * @Security("is_granted('ROLE_RH') or is_granted('ROLE_ADMIN')")
  289.      * @Route("/api/subscription/check-user-limit", name="check-user-limit", methods={"POST"})
  290.      * @return JsonResponse
  291.      */
  292.     public function checkUserLimit(Request $request,SubscriptionService $subscriptionService){
  293.         $ID = $request->request->get('ID');
  294.         $comp = $this->managerRegistry->getRepository(Company::class)->find($ID);
  295.         $userLimitReached = $subscriptionService->checkUserLimitReached($comp,1);
  296.         if($userLimitReached){
  297.             return new JsonResponse(0,200);
  298.         }
  299.         return new JsonResponse(1,200);
  300.     }
  301.     /**
  302.      * send invitation for given users
  303.      * @param Request $request
  304.      * @Security("is_granted('ROLE_RH') or is_granted('ROLE_ADMIN')")
  305.      * @Route("/api/user/send-invitation", name="send-invitation", methods={"POST"})
  306.      * @return JsonResponse
  307.      */
  308.     public function sendInvitation(Request $request,EventDispatcherInterface $eventDispatcher,CompletionService $completionService){
  309.         $ids = $request->request->has('ids')  ? $request->request->get('ids') : null;
  310.         $companyId = $request->request->has('company')  ? $request->request->get('company') : null;
  311.         $context = $request->request->has('context')  ? $request->request->get('context') : null;
  312.         $mode = $request->request->has('mode')  ? $request->request->get('mode') : 'exec';
  313.         $em = $this->managerRegistry->getManager();
  314.         //selection utilisateurs dans datatable
  315.         if ($ids and !empty($ids)) {
  316.             $users = $em->getRepository(User::class)->findBy(['id' => $ids]);
  317.             foreach ($users as $user) {
  318.                 /*Notify user by email*/
  319.                 $event = new GenericEvent($user);
  320.                 $eventDispatcher->dispatch($event, Events::NEW_ACCOUNT_RELANCE);
  321.             }
  322.         }
  323.         //Action globale de recherche des utilisateurs
  324.         else if($ids === null && $companyId){
  325.             try{
  326.                 $company = $em->getRepository(Company::class)->find($companyId);
  327.                 if(!$company)  return new JsonResponse('Company error',500);
  328.                 if($context === 'connection'){
  329.                     $users = $em->getRepository(User::class)->findBy(['password'=>null,'company'=>$company]);
  330.                     if($mode === 'dry'){
  331.                         return new JsonResponse([
  332.                             'users'=>sizeof($users)
  333.                         ]);
  334.                     }
  335.                     else{
  336.                         foreach ($users as $user) {
  337.                             /*Notify user by email*/
  338.                             $event = new GenericEvent($user);
  339.                             $eventDispatcher->dispatch($event, Events::NEW_ACCOUNT_RELANCE);
  340.                         }
  341.                     }
  342.                 }
  343.                 else if($context === 'completion'){
  344.                     $users =  $em->getRepository(User::class)->findUsersRegistered($company);
  345.                     $count = $completionService->findUsersCompletionLessThan($users,$mode);
  346.                     return new JsonResponse([
  347.                         'users'=>$count
  348.                     ]);
  349.                 }
  350.                 else{
  351.                     return new JsonResponse('Context error',500);
  352.                 }
  353.             }
  354.             catch (\Exception $e){
  355.                 return new JsonResponse($e->getMessage(),500);
  356.             }
  357.         }
  358.         return new JsonResponse('ok');
  359.     }
  360.     /**
  361.      * @param Request $request
  362.      * @Security("is_granted('ROLE_RH')")
  363.      * @Route("/api/user/delete", name="delete-user", methods={"DELETE"})
  364.      */
  365.     public function deleteUser(Request $request)
  366.     {
  367.         $selfUser = $this->getUser();
  368.         $em =$this->managerRegistry->getManager();
  369.         $data = $request->query->get('ids');
  370.         $outDatas = [];
  371.         if (!empty($data)) {
  372.             $users = $em->getRepository(User::class)->findBy(['id' => $data]);
  373.             foreach ($users as $user) {
  374.                 $this->denyAccessUnlessGranted(CompanyVoter::USER_DELETE,$user);
  375.                 //pas de suppression role admin
  376.                 if($user->hasRole('ROLE_ADMIN')){
  377.                     continue;
  378.                 }
  379.                 //pas de suppression RH par un RH
  380.                 if($selfUser->hasRole('ROLE_RH') && $user->hasRole('ROLE_RH')){
  381.                     return new JsonResponse('Vous ne pouvez pas supprimer un gestionnaire ! Contactez un administrateur.',403);
  382.                 }
  383.                 $em->remove($user);
  384.                 array_push($outDatas, $user->getId());
  385.             }
  386.             $em->flush();
  387.         }
  388.         return new JsonResponse($outDatas);
  389.     }
  390. }