src/Controller/Admin/SecurityController.php line 62

Open in your IDE?
  1. <?php
  2. namespace App\Controller\Admin;
  3. use App\Entity\Utilisateur;
  4. use App\Form\AdminUtilisateurType;
  5. use Doctrine\DBAL\Connection;
  6. use Doctrine\DBAL\Types\Types;
  7. use Doctrine\ORM\EntityManagerInterface;
  8. use Doctrine\ORM\Tools\Pagination\Paginator;
  9. use Psr\Log\LoggerInterface;
  10. use Symfony\Bridge\Twig\Mime\TemplatedEmail;
  11. use Symfony\Bundle\FrameworkBundle\Controller\AbstractController;
  12. use Symfony\Component\HttpFoundation\Request;
  13. use Symfony\Component\HttpFoundation\Response;
  14. use Symfony\Component\Mailer\MailerInterface;
  15. use Symfony\Component\PasswordHasher\Hasher\UserPasswordHasherInterface;
  16. use Symfony\Component\Security\Http\Authentication\AuthenticationUtils;
  17. /**
  18.  * @method \App\Entity\Utilisateur getUser()
  19.  */
  20. class SecurityController extends AbstractController
  21. {
  22.     public const UTILISATEUR_TYPES = [
  23.         'username' => Types::STRING,
  24.         'password' => Types::STRING,
  25.         'salt' => Types::STRING,
  26.         'roles' => Types::TEXT,
  27.         'civilite' => Types::STRING,
  28.         'nom' => Types::STRING,
  29.         'prenom' => Types::STRING,
  30.         'mail' => Types::STRING,
  31.         'is_active' => Types::BOOLEAN,
  32.         // 'date_creation' => Types::DATETIME_IMMUTABLE,
  33.         // 'date_connexion' => Types::DATETIME_IMMUTABLE,
  34.         // 'date_modification' => Types::DATETIME_IMMUTABLE,
  35.         // 'date_debut' => Types::DATETIME_IMMUTABLE,
  36.         // 'date_fin' => Types::DATETIME_IMMUTABLE,
  37.         'telephone' => Types::STRING,
  38.         'archived' => Types::BOOLEAN,
  39.     ];
  40.     public const UTILISATEUR_STRUCTURE_TYPES = [
  41.         'idutilisateur' => Types::INTEGER,
  42.         'idstructure'  => Types::INTEGER,
  43.         'isadmin'  => Types::BOOLEAN,
  44.         'issuperv'  => Types::BOOLEAN,
  45.         'factu_acces'  => Types::BOOLEAN,
  46.         'factu_level'  => Types::INTEGER,
  47.         'responsable'  => Types::BOOLEAN,
  48.     ];
  49.     private Connection $db;
  50.     private EntityManagerInterface $em;
  51.     private LoggerInterface $usersLogger;
  52.     private MailerInterface $mailer;
  53.     /** @var \Doctrine\ORM\EntityRepository<Utilisateur> */
  54.     private $repository;
  55.     public function __construct(Connection $connectionEntityManagerInterface $managerLoggerInterface $usersLoggerMailerInterface $mailer)
  56.     {
  57.         $this->db $connection;
  58.         $this->em $manager;
  59.         $this->repository $manager->getRepository(Utilisateur::class);
  60.         $this->mailer $mailer;
  61.         $this->usersLogger $usersLogger;
  62.     }
  63.     public function loginAction(AuthenticationUtils $authenticationUtils): Response
  64.     {
  65.         // get the login error if there is one
  66.         $error $authenticationUtils->getLastAuthenticationError();
  67.         // last username entered by the user
  68.         $lastUsername $authenticationUtils->getLastUsername();
  69.         return $this->render('Admin/Security/login.html.twig', [
  70.             'last_username' => $lastUsername,
  71.             'error' => $error,
  72.         ]);
  73.     }
  74.     public function checkAction()
  75.     {
  76.         throw new \RuntimeException('You must configure the check_path to be handled by the firewall using form_login in your security firewall configuration.');
  77.     }
  78.     /**
  79.      * @see https://symfony.com/doc/current/security.html#logging-out
  80.      */
  81.     public function logoutAction()
  82.     {
  83.         // controller can be blank: it will never be executed!
  84.         throw new \Exception('Don\'t forget to activate logout in security.yaml');
  85.     }
  86.     public function lostPasswordAction(Request $requestUserPasswordHasherInterface $passwordHasher): Response
  87.     {
  88.         if ($request->get('email')) {
  89.             $utilisateur $this->repository->findOneByMail($request->get('email'));
  90.             if (!$utilisateur) {
  91.                 $this->addFlash('error''Cette adresse e-mail n\'est pas enregistrée.');
  92.                 return $this->redirectToRoute('admin_lostPassword');
  93.             } else {
  94.                 $newpass $this->randomPassword();
  95.                 //$url = 'http://numix-uce.com';
  96.                 $url =  'http://' $_SERVER['HTTP_HOST'] . '/';
  97.                 $password $passwordHasher->hashPassword($utilisateur$newpass);
  98.                 $utilisateur->setPassword($password);
  99.                 $this->em->persist($utilisateur);
  100.                 $this->em->flush();
  101.                 // Envoi du mail
  102.                 $messagemail = (new TemplatedEmail())
  103.                     ->to($request->get('email'))
  104.                     ->subject('Numix : Nouveau mot de passe')
  105.                     ->htmlTemplate('Admin/Mail/mailNewPass.html.twig')
  106.                     ->textTemplate('Admin/Mail/mailNewPass.txt.twig')
  107.                     ->context([
  108.                         'newpass' => $newpass,
  109.                         'url' => $url
  110.                     ]);
  111.                 $this->mailer->send($messagemail);
  112.                 $this->addFlash('notice''Votre mot de passe a été modifié. Le nouveau mot de passe a été envoyé à l\'adresse <strong>' $request->get('email') . '</strong>');
  113.                 return $this->redirectToRoute('admin_lostPassword');
  114.             }
  115.         }
  116.         return $this->render('Admin/Security/lostPassword.html.twig');
  117.     }
  118.     private function randomPassword()
  119.     {
  120.         $alphabet "abcdefghijklmnopqrstuwxyzABCDEFGHIJKLMNOPQRSTUWXYZ0123456789";
  121.         $pass = [];
  122.         $alphaLength strlen($alphabet) - 1;
  123.         for ($i 0$i 8$i++) {
  124.             $n rand(0$alphaLength);
  125.             $pass[] = $alphabet[$n];
  126.         }
  127.         return implode($pass);
  128.     }
  129.     public function listUsersAction(Request $request): Response
  130.     {
  131.         $qb $this->em->createQueryBuilder();
  132.         $search $request->get('search');
  133.         if (isset($search) && !empty($search)) {
  134.             $argsSearch = [];
  135.             foreach ($search['user'] as $var => $val) {
  136.                 if ($val != '') {
  137.                     $argsSearch[$var] = $search['user'][$var];
  138.                 }
  139.             }
  140.             $request->getSession()->set('searchUtilisateur'$argsSearch);
  141.             return $this->redirectToRoute('admin_users');
  142.         }
  143.         $sortOrder strtoupper($request->get('sortOrder''asc'));
  144.         $order $request->get('order''username');
  145.         $page $request->get('page'1);
  146.         // $nbparpage = $this->getParameter('listes_nbparpage');
  147.         $nbparpage 999999;
  148.         $limit 0;
  149.         if ($page != '') {
  150.             $limit = ($page 1) * $nbparpage;
  151.         } else {
  152.             $page 1;
  153.         }
  154.         $start = ($page 1) * $nbparpage;
  155.         $queryWhere "";
  156.         $sessionSearch $request->getSession()->get('searchUtilisateur');
  157.         if (isset($sessionSearch) && !empty($sessionSearch)) {
  158.             foreach ($sessionSearch as $var => $val) {
  159.                 if ($var == 'mail') {
  160.                     $var 'u.mail';
  161.                 }
  162.                 if ($var == 'archived') {
  163.                     $queryWhere .= " AND " $var " = '" $val "' ";
  164.                 } else {
  165.                     $queryWhere .= " AND lower(" $var ") LIKE lower('%" addslashes($val) . "%')";
  166.                 }
  167.             }
  168.         } else {
  169.             $queryWhere .= " AND archived = 'f' ";
  170.             $request->getSession()->set('searchUtilisateur', ['archived' => 'f']);
  171.         }
  172.         $listStructQuery 'SELECT s.* FROM structure s WHERE s.niveau < 30';
  173.         $listStruct $this->db->fetchAllAssociative($listStructQuery);
  174.         $listLinksQuery 'SELECT us.* FROM utilisateur_structure us';
  175.         $listLinks $this->db->fetchAllAssociative($listLinksQuery);
  176.         $activeStructure $request->getSession()->get('activeStructure');
  177.         $listIdsQuery '
  178.             SELECT us.idutilisateur
  179.             FROM utilisateur_structure us, structure s, utilisateur u
  180.             WHERE u.id = us.idutilisateur
  181.             AND s.idstructure = us.idstructure
  182.             AND (s.idstructure = ' $activeStructure->getIdstructure() . ' OR s.idparent = ' $activeStructure->getIdstructure() . ')
  183.             AND s.niveau < 100 ' $queryWhere;
  184.         if ($activeStructure->getNiveau() > 10 && $activeStructure->getNiveau() < 100) {
  185.             $listIdsQuery .= ' AND u.id NOT IN (SELECT idutilisateur FROM utilisateur_structure WHERE idstructure = 1)';
  186.         }
  187.         $listIds $this->db->fetchAllAssociative($listIdsQuery);
  188.         if (count($listIds) > 0) {
  189.             $listIdsStr '';
  190.             foreach ($listIds as $id) {
  191.                 $listIdsStr .= ($listIdsStr == '') ? $id['idutilisateur'] : ',' $id['idutilisateur'];
  192.             }
  193.             $qb->select('u')
  194.                 ->from(Utilisateur::class, 'u')
  195.                 ->where('u.id IN (' $listIdsStr ')')
  196.                 // ->groupBy('u.id')
  197.                 ->orderBy('u.' $order$sortOrder)
  198.                 ->setMaxResults($nbparpage)
  199.                 ->setFirstResult($start);
  200.             $utilisateurs = new Paginator($qb);
  201.         } else {
  202.             $utilisateurs = [];
  203.         }
  204.         $nbpages ceil(count($utilisateurs) / $nbparpage);
  205.         $route =  $request->get('_route');
  206.         $pagination = ($nbpages 1) ? $this->setPagination($order$sortOrder$page$nbpages$route) : '';
  207.         return $this->render('Admin/Security/listUsers.html.twig', ['utilisateurs' => $utilisateurs'pagination' => $pagination'route' => $route'order' => $order'sortOrder' => $request->get('sortOrder'), 'listStruct' => $listStruct'listLinks' => $listLinks]);
  208.     }
  209.     public function editUserAction(Request $requestUserPasswordHasherInterface $passwordHasher): Response
  210.     {
  211.         $utilisateur null;
  212.         $originalpass null;
  213.         $activeStructure $request->getSession()->get('activeStructure');
  214.         $query 'SELECT * FROM structure s WHERE (s.idstructure = ' $activeStructure->getIdstructure() . ' OR s.idparent = ' $activeStructure->getIdstructure() . ') AND niveau < 100 ORDER BY libelle';
  215.         $structures $this->db->fetchAllAssociative($query);
  216.         foreach ($structures as $k => $str) {
  217.             $query 'SELECT count(*) FROM licence l WHERE l.id_structure = ' $str['idstructure'] . ' AND now() between l.date_debut AND l.date_fin';
  218.             $licences $this->db->fetchAssociative($query);
  219.             if ($str['niveau'] < 20) {
  220.                 $structures[$k]['licences'] = 1;
  221.             } else {
  222.                 $structures[$k]['licences'] = $licences['count'];
  223.             }
  224.         }
  225.         if ($request->get('id') != '') {
  226.             $query 'SELECT * FROM utilisateur_structure us WHERE us.idutilisateur = ' $request->get('id');
  227.             $userStructure $this->db->fetchAllAssociative($query);
  228.         } else {
  229.             $userStructure = [];
  230.         }
  231.         // Verification de l'action en cours : POST = le formulaire a été soumis, pas POST = formulaire à créer
  232.         if ($request->getMethod() == 'POST') {
  233.             $action = ($request->get('id') != '') ? 'update' 'create';
  234.         } else {
  235.             $action = ($request->get('id') != '') ? 'edit' 'new';
  236.         }
  237.         // On crée un nouvel objet Utilisateur ou on charge l'existant suivant qu'on est en mode edition ou creation
  238.         if ($action == 'new' || $action == 'create') {
  239.             $utilisateur = new Utilisateur();
  240.         } elseif ($action == 'edit' || $action == 'update') {
  241.             $utilisateur $this->repository->findOneById($request->get('id'));
  242.             if (!$utilisateur) {
  243.                 throw $this->createNotFoundException('Utilisateur inconnu');
  244.             }
  245.             $originalpass $utilisateur->getPassword();
  246.         }
  247.         // On crée le formulaire : le pass est obligatoire uniquement en mode création
  248.         $form $this->createForm(AdminUtilisateurType::class, $utilisateur);
  249.         // On gère l'enregistrement uniquement en cas de soumission du formulaire
  250.         if ($action == 'create' || $action == 'update') {
  251.             $form->handleRequest($request);
  252.             if ($form->isValid()) {
  253.                 $plainPassword $form->get('password')->getData();
  254.                 if (!empty($plainPassword)) {
  255.                     $utilisateur->setSalt(md5(uniqid(''true)));
  256.                     $password $passwordHasher->hashPassword($utilisateur$plainPassword);
  257.                     $utilisateur->setPassword($password);
  258.                 } else {
  259.                     $utilisateur->setPassword($originalpass);
  260.                 }
  261.                 $role = ['ROLE_ADMIN'];
  262.                 $utilisateur->setRoles($role);
  263.                 $utilisateur->setDateCreation(new \DateTime());
  264.                 $utilisateur->setArchived('f');
  265.                 if ($utilisateur->getId() && $utilisateur->getIsActive()) {
  266.                     $this->db->executeStatement("UPDATE users_jail SET freed = 't' WHERE id_user = " $utilisateur->getId());
  267.                 }
  268.                 $this->em->persist($utilisateur);
  269.                 $this->em->flush();
  270.                 // Gestion du message flash
  271.                 $listIdsStruct '';
  272.                 foreach ($structures as $struc) {
  273.                     $listIdsStruct .= ($listIdsStruct == '') ? $struc['idstructure'] : ',' $struc['idstructure'];
  274.                 }
  275.                 $this->db->executeStatement("DELETE FROM utilisateur_structure WHERE idutilisateur = " $utilisateur->getId() . " AND idstructure IN (" $listIdsStruct ")");
  276.                 if ($request->get('structures')) {
  277.                     foreach ($request->get('structures') as $ids => $link) {
  278.                         if (isset($link['membre']) && $link['membre'] == 'membre') {
  279.                             $userStructure = ['idutilisateur' => $utilisateur->getId(), 'idstructure' => $ids];
  280.                             if (isset($link['droit'])) {
  281.                                 switch ($link['droit']) {
  282.                                     case 'admin':
  283.                                         $userStructure['isadmin'] = true;
  284.                                         break;
  285.                                     case 'superv':
  286.                                         $userStructure['issuperv'] = true;
  287.                                         break;
  288.                                 }
  289.                             }
  290.                             if (isset($link['responsable'])) {
  291.                                 $userStructure['responsable'] = ($link['responsable'] == 'responsable') ? true false;
  292.                             } else {
  293.                                 $userStructure['responsable'] = false;
  294.                             }
  295.                             //check licence
  296.                             $hasLicence false;
  297.                             $libStruct '';
  298.                             foreach ($structures as $struc) {
  299.                                 if ($struc['idstructure'] == $ids) {
  300.                                     if ($struc['niveau'] > 10) {
  301.                                         if ($struc['licences'] > 0) {
  302.                                             $hasLicence true;
  303.                                             $countUsersLicence 0;
  304.                                             $query 'SELECT id_licence, nb_utilisateur FROM licence l WHERE l.id_structure = ' $struc['idstructure'] . ' AND now() between l.date_debut AND l.date_fin';
  305.                                             $licence $this->db->fetchAssociative($query);
  306.                                             if ($licence['nb_utilisateur']) {
  307.                                                 $countUsersLicence += $licence['nb_utilisateur'];
  308.                                             }
  309.                                             $query 'SELECT * FROM option_licence o WHERE o.id_licence = ' $licence['id_licence'] . ' AND nb_utilisateur is not null';
  310.                                             $options $this->db->fetchAllAssociative($query);
  311.                                             if (count($options) > 0) {
  312.                                                 foreach ($options as $opt) {
  313.                                                     $countUsersLicence += $opt['nb_utilisateur'];
  314.                                                 }
  315.                                             }
  316.                                             $query "SELECT count(*) FROM utilisateur_structure WHERE idstructure = " $struc['idstructure'] . " AND factu_acces = 't'";
  317.                                             $countUsersFactu $this->db->fetchAssociative($query);
  318.                                         }
  319.                                         $libStruct $struc['libelle'];
  320.                                     } else {
  321.                                         $hasLicence true;
  322.                                         $countUsersLicence 1;
  323.                                         $countUsersFactu = ['count' => 0];
  324.                                     }
  325.                                 }
  326.                             }
  327.                             if (isset($link['factu']) && $link['factu'] != '') {
  328.                                 if ($hasLicence == true) {
  329.                                     if ($countUsersFactu['count'] < $countUsersLicence) {
  330.                                         $userStructure['factu_acces'] = true;
  331.                                         $userStructure['factu_level'] = $link['factu'];
  332.                                     } else {
  333.                                         $message 'Le nombre maximum d\'utilisateurs pour la licence Facturation disponible pour la structure ' $libStruct ' est déjà atteint.';
  334.                                         $this->addFlash('notice'$message);
  335.                                     }
  336.                                 } else {
  337.                                     $message 'Aucune licence Facturation disponible pour la structure ' $libStruct '.';
  338.                                     $this->addFlash('notice'$message);
  339.                                 }
  340.                             }
  341.                             $res $this->db->insert('utilisateur_structure'$userStructureself::UTILISATEUR_STRUCTURE_TYPES);
  342.                         }
  343.                     }
  344.                 }
  345.                 $message = ($action == 'create') ? 'Utilisateur créé avec succés' 'Utilisateur modifié avec succés';
  346.                 $this->addFlash('notice'$message);
  347.                 $this->usersLogger->info('Numix parcours - editUser - $message : ' $message ' - User created : ' $utilisateur->getId() . ' - User created by : ' $this->getUser()->getId());
  348.                 // Redirection
  349.                 if ($request->get('savestay')) {
  350.                     return $this->redirectToRoute('admin_user_edit', ['id' => $utilisateur->getId()]);
  351.                 } else {
  352.                     return $this->redirectToRoute('admin_users');
  353.                 }
  354.             }
  355.         }
  356.         return $this->render('Admin/Security/editUser.html.twig', ['form' => $form->createView(), 'action' => $action'structures' => $structures'userStructure' => $userStructure'activeStructure' => $activeStructure]);
  357.     }
  358.     public function deleteUserAction(Request $request)
  359.     {
  360.         $utilisateur $this->repository->findOneById($request->get('id'));
  361.         if (!$utilisateur) {
  362.             throw $this->createNotFoundException('Utilisateur inconnu');
  363.         }
  364.         $idUser $utilisateur->getId();
  365.         $this->em->remove($utilisateur);
  366.         $this->em->flush();
  367.         $message 'Utilisateur supprimé avec succés';
  368.         $this->addFlash('notice'$message);
  369.         $this->usersLogger->info('Numix parcours - deleteUser - $message : ' $message ' - User deleted : ' $idUser ' - User deleted by : ' $this->getUser()->getId());
  370.         return $this->redirectToRoute('admin_users');
  371.     }
  372.     public function archiveUserAction(Request $request)
  373.     {
  374.         $utilisateur $this->repository->findOneById($request->get('id'));
  375.         if (!$utilisateur) {
  376.             throw $this->createNotFoundException('Utilisateur inconnu');
  377.         }
  378.         $idUser $utilisateur->getId();
  379.         $utilisateur->setIsActive(FALSE);
  380.         $utilisateur->setArchived(TRUE);
  381.         $this->em->persist($utilisateur);
  382.         $this->em->flush();
  383.         $message 'Utilisateur archivé avec succés';
  384.         $this->addFlash('notice'$message);
  385.         $this->usersLogger->info('Numix parcours - archiveUser - $message : ' $message ' - User archived : ' $idUser ' - User archived by : ' $this->getUser()->getId());
  386.         return $this->redirectToRoute('admin_users');
  387.     }
  388.     public function unarchiveUserAction(Request $request)
  389.     {
  390.         $utilisateur $this->repository->findOneById($request->get('id'));
  391.         if (!$utilisateur) {
  392.             throw $this->createNotFoundException('Utilisateur inconnu');
  393.         }
  394.         $idUser $utilisateur->getId();
  395.         $utilisateur->setIsActive(FALSE);
  396.         $utilisateur->setArchived(FALSE);
  397.         $this->em->persist($utilisateur);
  398.         $this->em->flush();
  399.         $message 'Utilisateur restauré avec succés';
  400.         $this->addFlash('notice'$message);
  401.         $this->usersLogger->info('Numix parcours - unarchiveUser - $message : ' $message ' - User unarchived : ' $idUser ' - User unarchived by : ' $this->getUser()->getId());
  402.         return $this->redirectToRoute('admin_users');
  403.     }
  404.     public function exportUsersAction(Request $request): Response
  405.     {
  406.         $qb $this->em->createQueryBuilder();
  407.         $sortOrder 'ASC';
  408.         $order 'username';
  409.         $queryWhere "";
  410.         $sessionSearch $request->getSession()->get('searchUtilisateur');
  411.         if (isset($sessionSearch) && !empty($sessionSearch)) {
  412.             foreach ($sessionSearch as $var => $val) {
  413.                 if ($var 'archived') {
  414.                     $queryWhere .= " AND (u." $var ") = ('" $val "')";
  415.                 } else {
  416.                     $queryWhere .= " AND lower(" $var ") LIKE lower('%" $val "%')";
  417.                 }
  418.             }
  419.         }
  420.         $listStructQuery 'SELECT s.* FROM structure s WHERE s.niveau < 30';
  421.         $listStruct $this->db->fetchAllAssociative($listStructQuery);
  422.         $listLinksQuery 'SELECT us.* FROM utilisateur_structure us';
  423.         $listLinks $this->db->fetchAllAssociative($listLinksQuery);
  424.         $activeStructure $request->getSession()->get('activeStructure');
  425.         $listIdsQuery 'SELECT us.idutilisateur FROM utilisateur_structure us, structure s, utilisateur u WHERE u.id = us.idutilisateur AND s.idstructure = us.idstructure AND (s.idstructure = ' $activeStructure->getIdstructure() . ' OR s.idparent = ' $activeStructure->getIdstructure() . ')' $queryWhere;
  426.         $listIds $this->db->fetchAllAssociative($listIdsQuery);
  427.         $listIdsStr '';
  428.         foreach ($listIds as $id) {
  429.             $listIdsStr .= ($listIdsStr == '') ? $id['idutilisateur'] : ',' $id['idutilisateur'];
  430.         }
  431.         $qb->select('u')
  432.             ->from(\App\Entity\Utilisateur::class, 'u')
  433.             ->where('u.id IN (' $listIdsStr ')')
  434.             ->orderBy('u.' $order$sortOrder);
  435.         $utilisateurs = new Paginator($qb$fetchJoinCollection true);
  436.         $tmpPath $this->getParameter('kernel.project_dir') . '/var/tmp/';
  437.         $filename 'exportUtilisateurs' $this->getUser()->getUsername() . date('YmdHis') . '.csv';
  438.         $f fopen($tmpPath $filename"w");
  439.         $entetes = ["Civilité""Nom""Prénom""Mail""Téléphone""Structure"];
  440.         array_walk($entetes, [$this'encodeCSV']);
  441.         fputcsv($f$entetes';');
  442.         foreach ($utilisateurs as $u) {
  443.             $structlib '';
  444.             foreach ($listLinks as $link) {
  445.                 if ($link['idutilisateur'] == $u->getId()) {
  446.                     foreach ($listStruct as $struct) {
  447.                         if ($link['idstructure'] == $struct['idstructure']) {
  448.                             $structlib .= $struct['libelle'] . "\n";
  449.                         }
  450.                     }
  451.                 }
  452.             }
  453.             $line = [
  454.                 $u->getCivilite(),
  455.                 //attente H ou F
  456.                 $u->getNom(),
  457.                 $u->getPrenom(),
  458.                 $u->getMail(),
  459.                 $u->getTelephone(),
  460.                 $structlib,
  461.             ];
  462.             array_walk($line, [$this'encodeCSV']);
  463.             fputcsv($f$line';''"');
  464.         }
  465.         // Generate response
  466.         $response = new Response();
  467.         // Set headers
  468.         $response->headers->set('Cache-Control''private');
  469.         $response->headers->set('Content-Type''text/csv');
  470.         $response->headers->set('Content-Disposition''attachment; filename="' basename($filename) . '";');
  471.         $response->headers->set('Content-length'filesize($tmpPath $filename));
  472.         // Send headers before outputting anything
  473.         $response->sendHeaders();
  474.         $response->setContent(readfile($tmpPath $filename));
  475.         return $response;
  476.     }
  477.     private function encodeCSV(&$value$key)
  478.     {
  479.         $value iconv("UTF-8""WINDOWS-1252"$value);
  480.     }
  481.     private function setPagination($order$sortOrder$page$nbpages$route)
  482.     {
  483.         $args '';
  484.         $args .= isset($order) ? '&order=' $order '';
  485.         $args .= isset($sortOrder) ? '&sortOrder=' $sortOrder '';
  486.         $active = ($page == 1) ? 'class="active"' '';
  487.         $url $this->generateUrl($route);
  488.         $html_return '<ul class="pagination pagination-sm">';
  489.         $html_return .= '<li ' $active '><a href="' $url '?page=1' $args '">1</a></li>';
  490.         if ($nbpages 7) {
  491.             if ($page >= 5) {
  492.                 echo '<li>. . .</li>';
  493.             }
  494.             $min = ($page >= 4) ? $page 2;
  495.             $max = ($page <= $nbpages 3) ? $page $nbpages 1;
  496.             for ($i $min$i <= $max$i++) {
  497.                 $active = ($i == $page) ? 'class="active"' '';
  498.                 $html_return .= '<li ' $active '><a href="' $url '?page=' $i $args '">' $i '</a></li>';
  499.             }
  500.             if ($page <= $nbpages 4) {
  501.                 echo '<li>. . .</li>';
  502.             }
  503.         } else {
  504.             for ($i 2$i <= $nbpages 1$i++) {
  505.                 $active = ($i == $page) ? 'class="active"' '';
  506.                 $html_return .= '<li ' $active '><a href="' $url '?page=' $i $args '">' $i '</a></li>';
  507.             }
  508.         }
  509.         $active = ($page == $nbpages) ? 'class="active"' '';
  510.         $html_return .= '<li ' $active '><a href="' $url '?page=' $nbpages $args '">' $nbpages '</a></li>';
  511.         $html_return .= '</ul>';
  512.         return $html_return;
  513.     }
  514.     public function listUsersStructureAction(Request $request$structure)
  515.     {
  516.         $activeStructure $request->getSession()->get('activeStructure');
  517.         $query 'SELECT * FROM  utilisateur_structure us, utilisateur u WHERE us.idutilisateur = u.id AND us.idstructure = ' $structure ' AND us.idutilisateur NOT IN ( SELECT us.idutilisateur FROM  utilisateur_structure us, structure s WHERE us.idstructure = s.idstructure AND s.niveau = 10 )';
  518.         if ($activeStructure->getNiveau() > 10 && $activeStructure->getNiveau() < 100) {
  519.             $query .= ' AND u.id NOT IN (SELECT idutilisateur FROM utilisateur_structure WHERE idstructure = 1)';
  520.         }
  521.         $users $this->db->fetchAllAssociative($query);
  522.         return $this->render('Admin/Security/listUsersStructure.html.twig', ['users' => $users]);
  523.     }
  524. }