src/Controller/USRController.php line 674

Open in your IDE?
  1. <?php
  2. namespace App\Controller;
  3. // begin token-guard ---------------------------------------------------------------------------------
  4. use Symfony\Component\Security\Csrf\CsrfTokenManagerInterface;
  5. use Symfony\Component\Security\Csrf\CsrfToken;
  6. use Symfony\Component\Security\Core\Exception\InvalidCsrfTokenException;
  7. use Symfony\Component\Security\Guard\Authenticator\AbstractFormLoginAuthenticator;
  8. // end token-guard ---------------------------------------------------------------------------------
  9. // begin mochel meyer products --------------------------------------------------------------
  10. use App\Service\MeylerService;
  11. use App\Service\USRService;
  12. use App\Service\LOGDEFService;
  13. use App\Service\DIVService;
  14. use Symfony\Bundle\FrameworkBundle\Controller\AbstractController;
  15. use Symfony\Component\Routing\Annotation\Route;
  16. use Symfony\Component\HttpFoundation\Response;
  17. use Symfony\Component\HttpFoundation\Request;
  18. use Symfony\Component\HttpFoundation\JsonResponse;
  19. use Symfony\Component\HttpKernel\Exception\NotFoundHttpException;
  20. use Symfony\Component\DependencyInjection\ParameterBag\ParameterBagInterface;
  21. use Symfony\Component\Validator\Validator\ValidatorInterface;       // contrôleur de contraintes
  22. use Doctrine\Persistence\ManagerRegistry;
  23. use Doctrine\ORM\Tools\Pagination\Paginator;
  24. use Symfony\Component\PasswordHasher\Hasher\UserPasswordHasherInterface;   // l'encodeur ofcourse
  25. use App\Entity\usr;
  26. use App\Entity\cat;
  27. use App\Entity\prf;
  28. use App\Entity\ppi;
  29. use App\Entity\CFEMP;
  30. class USRController extends AbstractController
  31. {
  32.     // some services, begin token-guard ---------------------------------------------------------------------------------
  33.     private $csrfTokenManager;
  34.     private $parambag;
  35.     private $meylerservice;
  36.     private $usrservice;
  37.     private $divservice;
  38.     public function __construct(
  39.             CsrfTokenManagerInterface $csrfTokenManager
  40.             ParameterBagInterface $parambag
  41.             MeylerService $meylerservice,
  42.             USRService $usrservice,
  43.             DIVService $divservice
  44.         )
  45.     {
  46.         $this->csrfTokenManager $csrfTokenManager;
  47.         $this->parambag $parambag;
  48.         $this->meylerservice $meylerservice;
  49.         $this->usrservice $usrservice;
  50.         $this->divservice $divservice;
  51.     }    
  52.     // end some services, token-guard ---------------------------------------------------------------------------------
  53.     // recherche usr réservé aux admins
  54.     #[Route(path'/admin/usr/rec'name'admin_usr_rec')]
  55.     public function rec
  56.         (
  57.             Request $request
  58.             ManagerRegistry $doctrine,
  59.             UserPasswordHasherInterface $passwordHasher
  60.         ): Response
  61.     {
  62.         
  63.         $em $doctrine->getManager();
  64.         $user $this->getUser();
  65.             // test vérif mapping tbl CDC TODO à supprimer plus tard
  66.             // $query = $em->getRepository(CFEMP::class)->createQueryBuilder('cfemp');             
  67.             // $query
  68.                 // ->select('cfemp')
  69.                 // ->join('cfemp.PRJID','cfprj')
  70.                 // ->join('cfprj.CFPPIID','cfppi')
  71.                 // ->join('cfprj.TFIIDS','cftfi')
  72.                 // ->join('cftfi.TIRIDS','cftir')
  73.                 // ->join('cfprj.TBFIDS','cftbf')
  74.                 // ->join('cftbf.CROIDS','cfcro')
  75.                 // ->join('cfemp.TYEID','cftye')
  76.                 // ->join('cfemp.ERBID','cferb')
  77.                 // ->where('cfemp.EMPANN IS NULL')
  78.                 // ->orderBy('cfemp.TYEID', 'DESC')
  79.             // ;
  80.             // $aga = $query->getQuery()->getResult();
  81.         // vérif si admin
  82.         $lstadmin $this->divservice->getIdAdmin();
  83.         if(($user != null)&&(in_array($user->getUsrid(), $lstadmin))){
  84.                 
  85.             // formulaire recherche
  86.             $listCAT $em->getRepository(cat::class)->findAllOrderedByLib(array(),'array');  
  87.             $form_rec $this->createForm('App\Form\USR_rec'null, array(
  88.                 'listCAT'=>$listCAT,
  89.             ));
  90.             $form_rec->add(
  91.                 'Rechercher''Symfony\Component\Form\Extension\Core\Type\SubmitType', array(
  92.                     'label'=>"Rechercher",
  93.                     'attr'=>array('class'=>'btn btn-primary'),
  94.                 )
  95.             );
  96.             $form_rec->add('Reset','Symfony\Component\Form\Extension\Core\Type\ResetType',
  97.                 array(
  98.                     'label'=>'Réinitialiser',
  99.                     'attr'=>array('class'=>'btn btn-default'),
  100.                 )
  101.             );
  102.             $form_rec->handleRequest($request);
  103.             // Récupération des données POST et construction de la requete de recherche  
  104.             $postData $request->request->get('usr_rec');
  105.             // Requete de recherche 
  106.             $rec_limit 300;
  107.             $query $em->getRepository(usr::class)->createQueryBuilder('usr'); 
  108.             $query
  109.                 ->select('usr.usrid, usr.usrorg, usr.usrnom, usr.usrpre, usr.usrstatut, usr.usremail, usr.usrdatlog, usr.usrdatcre, usr.usrdatenvchgpwd, usr.usrcodpos, cat.catlib')
  110.                 ->join('usr.catid','cat')
  111.                 ->where('usr.usrid <> 32')        // en prod, commenter
  112.             ;
  113.                 
  114.             if(($form_rec->isSubmitted())&&($form_rec->isValid())){
  115.                 // recherche par Nom ou Prénom
  116.                 if($postData['usrnom']!=''){
  117.                     $query
  118.                        ->andwhere('usr.usrnom LIKE :usrnom OR usr.usrpre LIKE :usrnom')
  119.                        ->setParameter('usrnom' '%'.$postData['usrnom'].'%')
  120.                     ;
  121.                 }
  122.                 if($postData['usremail']!=''){
  123.                     $query
  124.                        ->andwhere('usr.usremail LIKE :usremail')
  125.                        ->setParameter('usremail' '%'.$postData['usremail'].'%')
  126.                     ;
  127.                 }
  128.                 if($postData['usrcodpos']!=''){
  129.                     $query
  130.                        ->andwhere('usr.usrcodpos LIKE :usrcodpos')
  131.                        ->setParameter('usrcodpos' '%'.$postData['usrcodpos'].'%')
  132.                     ;
  133.                 }
  134.                 if($postData['usrorg']!=''){
  135.                     $query
  136.                        ->andwhere('usr.usrorg LIKE :usrorg')
  137.                        ->setParameter('usrorg' '%'.$postData['usrorg'].'%')
  138.                     ;
  139.                 }
  140.                 // recherche par Catégorie
  141.                 if($postData['catid']!=''){
  142.                     $query
  143.                        ->andwhere('usr.catid = :catid')
  144.                        ->setParameter('catid' $postData['catid'])
  145.                     ;
  146.                 }
  147.                 // recherche par Statut
  148.                 if($postData['usrstatut']!='5'){
  149.                     $query
  150.                        ->andwhere('usr.usrstatut = :usrstatut')
  151.                        ->setParameter('usrstatut' $postData['usrstatut'])
  152.                     ;
  153.                 }
  154.                 // recherche par date création
  155.                 $creation_fSPeriod $postData['creation_fSPeriod'];
  156.                 if(($postData['creation_period']!='')&&($creation_fSPeriod=='checked')){    // si switch on
  157.                     list($creatfrom,$creatto) = explode(' - ',$postData['creation_period']);
  158.                     $query
  159.                         ->andwhere('usr.usrdatcre BETWEEN :creatfrom AND :creatto')
  160.                         ->setParameter('creatfrom'$this->divservice->DateFR2EN($creatfrom))
  161.                         ->setParameter('creatto'$this->divservice->DateFR2EN($creatto))
  162.                     ;
  163.                 }
  164.             
  165.             }else{
  166.                 $creation_fSPeriod "";        // exclusion période création par défo (voir form)
  167.                 $query
  168.                    ->where('usr.usrstatut = :usrstatut')
  169.                    ->setParameter('usrstatut' '0')        // par défaut les en attente seuls
  170.                 ;
  171.             }
  172.             $query
  173.                 ->orderBy('usr.usrnom','ASC');
  174.             $utilisateurs $query->getQuery()->getArrayResult();
  175.             $nb_usr count($utilisateurs);
  176.             if($nb_usr $rec_limit){
  177.                 $utilisateurs $query->getQuery()->setMaxResults($rec_limit)->getArrayResult();
  178.             }
  179.             // vérif pour chaque utilisateur si ID présent dans une table liée (possibilité de noms de champ différents)
  180.             $grp_tables = array(
  181.                 'tbl_usrid' => array('PPI')                       // lien modif/création/annulation (usrid)
  182.                 // 'tbl_USRIDDERMOD' => array('BAD','DIS','INS','INTZ','MEC','MOB','MOV','NOTZ','ORG','PER','PLA','QUA','SES'),     // lien modf (USRIDDERMOD)
  183.                 // 'tbl_USRIDCRE' => array('BAD_FIC','BAD_ZON','DIS','INTZ','INT_MOB','MCT','MEC','MEC_FIC','MOB','MOB_FIC','MOB_URL','MOV','MOV_FIC','MOV_URL','MPR','NOT_FIC','ORG','OWM','OWQ','QMO','QUA','QUA_FIC','SES_FIC','SES_URL','USR_BUL','USR_DEP','DIS_USR')  // lien création (USRIDCRE)
  184.             );
  185.             
  186.             foreach($utilisateurs as $key=>$utilisateur){
  187.                 $utilisateurs[$key]['nboccur'] = 0;
  188.                 foreach($grp_tables as $key2=>$ungrp){
  189.                     $nomchamp substr($key24);
  190.                     foreach($ungrp as $table){
  191.                         $query $em->getRepository(PPI::class)->createQueryBuilder($table); 
  192.                         $query
  193.                             ->select('count('.$table.'.'.$nomchamp.')')
  194.                             ->where($table.'.'.$nomchamp.' = :usrid')
  195.                             ->setParameter('usrid'$utilisateur['usrid'])
  196.                         ;
  197.                         $sql $query->getQuery();
  198.                         $nboccur $sql->getSingleScalarResult();
  199.                         if($nboccur>0){
  200.                             $utilisateurs[$key]['nboccur'] = $nboccur;
  201.                             break;
  202.                         }
  203.                     }
  204.                 }
  205.             }
  206.             
  207.             // Affichage formulaire de recherche et de la liste des utilisateurs
  208.             return $this->render(
  209.                 'usr\rec.html.twig'
  210.                 array(
  211.                     'help_dir' => $this->parambag->get('dochelp_web_path'),       //forcreatmenu
  212.                     'lstadmin' => implode(',',$lstadmin),
  213.                     'form_rec' => $form_rec->createView(),
  214.                     'usrs' => $utilisateurs,
  215.                     'nb_usr' => $nb_usr,
  216.                     'rec_limit' => $rec_limit,
  217.                     'creation_fSPeriod' => $creation_fSPeriod,
  218.                 )
  219.             );
  220.             
  221.         }else{      // erreur réservé admin
  222.             $this->get('session')->getFlashBag()->add(
  223.                 'Erreur',
  224.                 'La page demandée n\'existe pas ! (adm)'
  225.             );
  226.             // Affichage page inexistante
  227.             return $this->render('default\noway.html.twig', array(
  228.             ));        
  229.         }
  230.         
  231.     }
  232.     // Suppression d'un compte USR
  233.     #[Route(path'/admin/usr/sup/{usrid}'name'admin_usr_sup')]
  234.     public function sup
  235.         (
  236.             $usrid,
  237.             Request $request
  238.             ManagerRegistry $doctrine
  239.         ): Response
  240.     {
  241.         $em $doctrine->getManager();
  242.         $user $this->getUser();
  243.         $sup false;
  244.         $lstadmin $this->divservice->getIdAdmin();
  245.         if(($user != null)&&(in_array($user->getUsrid(), $lstadmin))){    // seuls les admin peuvent éliminer
  246.             $usrid = ($usrid-17) / 2048;                // transfo simple id dans rec.html.twig
  247.             $usr $em->getRepository(usr::class)->findOneBy(array('usrid'=>$usrid));
  248.             if($usr!=null){
  249.                 $em->remove($usr);
  250.                 $em->flush();
  251.                 $supp true;
  252.             }
  253.             if($supp){
  254.                 $this->get('session')->getFlashBag()->add(
  255.                     'Succès',
  256.                     "Compte supprimé avec succès"
  257.                 );
  258.             }else{
  259.                 $this->get('session')->getFlashBag()->add(
  260.                     'Erreur',
  261.                     "Le compte n'a pas pu être supprimé"
  262.                 );
  263.             }
  264.             
  265.             // Redirection vers la liste des usr
  266.             return $this->redirect($this->generateUrl('admin_usr_rec'));
  267.             
  268.         }else{      // erreur réservé admin
  269.             $this->get('session')->getFlashBag()->add(
  270.                 'Erreur',
  271.                 'La page demandée n\'existe pas ! (adm)'
  272.             );
  273.             // Affichage page inexistante
  274.             return $this->render('default\noway.html.twig', array(
  275.             ));        
  276.         }
  277.     }
  278.     
  279.     
  280.     
  281.     // modification d'un compte USR par admin
  282.     #[Route(path'/admin/usr/maj/{usrid}'name'admin_usr_maj')]
  283.     public function maj
  284.         (
  285.             $usrid,
  286.             Request $request
  287.             ManagerRegistry $doctrine,
  288.             UserPasswordHasherInterface $passwordHasher,
  289.             ValidatorInterface $validator
  290.         ): Response
  291.     {
  292.         
  293.         $em $doctrine->getManager();
  294.         $user $this->getUser();
  295.         $maj false;
  296.         
  297.         $lstadmin $this->divservice->getIdAdmin();
  298.         if(($user != null)&&(in_array($user->getUsrid(), $lstadmin))){    // seuls les admin peuvent modifier
  299.             $usrid = ($usrid-103) / 4096;                // transfo simple id dans rec.html.twig
  300.             $usr $em->getRepository(usr::class)->findOneBy(array('usrid'=>$usrid));
  301.             if($usr!=null){
  302.                 
  303.                 $statut_avant $usr->getusrstatut();    // récup statut avant modif
  304.                 $listCAT $em->getRepository(CAT::class)->findAllOrderedByLib(array(),'array');  
  305.                 // formulaire màj admin
  306.                 $form_majadm$this->createForm('App\Form\USR_majadm'$usr, array(
  307.                     'listCAT' => $listCAT,
  308.                 ));
  309.                 $form_majadm->add('Annuler''Symfony\Component\Form\Extension\Core\Type\ButtonType', array(
  310.                     'label'=>"Annuler",
  311.                     'attr'=>array('class'=>'btn btn-primary''data-url'=>$this->generateUrl('admin_usr_rec'))
  312.                 ));
  313.                 $form_majadm->add('Enregistrer','Symfony\Component\Form\Extension\Core\Type\SubmitType',array(
  314.                     'label'=>"Enregistrer",
  315.                     'attr'=>array('class'=>'btn btn-primary')
  316.                 ));
  317.                 $form_majadm->handleRequest($request);
  318.                 // vérif saisie form_majadm via validator annotations niveau Entity (après validation formulaire)
  319.                 if($request->request->get('usr_majadm')){
  320.                     // dd($request->request->get('usr_maj'));
  321.                     $errors $validator->validate($usr);
  322.                     if(count($errors) > 0) {
  323.                         // dd($errors);
  324.                         foreach($errors as $error){
  325.                             $this->get('session')->getFlashBag()->add(
  326.                                 'Erreur',
  327.                                 $error->getmessage()
  328.                             );
  329.                         }
  330.                     }
  331.                 }else{
  332.                     $errors =  array();
  333.                 }
  334.                 if($request->request->get('usr_majadm')){      // maj utilisateur
  335.                     if(($form_majadm->isSubmitted())&&($form_majadm->isValid())){
  336.                         $postData $request->request->get('usr_majadm');
  337.                         // begin token-guard --------------------------------------------------------------------------------------------------------------
  338.                         $csrfToken $postData['_token'];
  339.                         if(false === $this->csrfTokenManager->isTokenValid(new CsrfToken('usrmajadgarg88'$csrfToken))){
  340.                             $this->get('session')->getFlashBag()->add(
  341.                                 'Erreur',
  342.                                 "Impossible d'accéder à la fonction demandée. (toua)"        // bad token user admin
  343.                             );
  344.                             return $this->redirect($this->generateUrl('pageaccueil')); // renvoi caval
  345.                             // end token-guard --------------------------------------------------------------------------------------------------------------
  346.                         
  347.                         }else{
  348.                 
  349.                             if($postData['usrpwdmaj'] != ''){      // redéfinition du mot de passe
  350.                                 // vérif pwd ok
  351.                                 $pwdok $this->usrservice->verif_pwd_usr($postData['usrpwdmaj']); 
  352.                                 if($pwdok==false){
  353.                                     $this->get('session')->getFlashBag()->add(
  354.                                         'Erreur',
  355.                                         'Ce mot de passe ne répond pas aux conditions de sécurité requises'
  356.                                     );
  357.                                     // re-affichage formulaire
  358.                                     return $this->render('usr\majadm.html.twig'
  359.                                         array(
  360.                                             'help_dir' => $this->parambag->get('dochelp_web_path'),       //forcreatmenu
  361.                                             'form_majadm' => $form_majadm->createView(),
  362.                                             'usr' => $usr,
  363.                                             'errors' => $errors,
  364.                                         )
  365.                                     );    
  366.                                 }else{
  367.                                     $hashedPassword $passwordHasher->hashPassword(
  368.                                         $usr,
  369.                                         $postData['usrpwdmaj']
  370.                                     );
  371.                                     $usr->setPassword($hashedPassword);
  372.                                 }
  373.                             }
  374.                             // Enregistrement en bdd
  375.                             $em $doctrine->getManager();
  376.                             $em->persist($usr);
  377.                             $em->flush();
  378.                         
  379.                             $activation false;    // ===========================================
  380.                             if(($statut_avant==0)&&($postData['usrstatut']==1)){        // si (ré)activation du compte
  381.                                 $activation true;
  382.                                 
  383.                                 $mailaenv = array();
  384.                                 $mailaenv['sujet'] = "Activation de votre compte Collectiv'Finance";
  385.                                 $mailaenv['titre'] = "[Rural Consult] Activation de votre compte d'accès à Collectiv'Finance";
  386.                                 $mailaenv['expediteur_nom'] = "Assistance technique Rural Consult";
  387.                                 $mailaenv['expediteur_email'] = "assistance.technique@solidaires.com";
  388.                                 $mailaenv['destinataire_nom'] = $usr->getUsrpre().' '.$usr->getUsrnom();
  389.                                 $mailaenv['destinataire_email'] = $usr->getUsremail();
  390.                                 $mailaenv['fichiers'] = array();                    // les fichiers joints
  391.                                 //$mailaenv['fichiers'][0] = array();               // 1° fichier à joindre  => pas de documents joints
  392.                                 //$mailaenv['fichiers'][0]['chemin_fichier'] = "";
  393.                                 //$mailaenv['fichiers'][0]['nom_fichier'] = "";
  394.                                 //$mailaenv['fichiers'][0]['nom_orig'] = "";
  395.                                 $mailaenv['cc'] = '';           // pas de copie ici
  396.                                 $destinataire_nom_bcc "Assistance technique Rural Consult";    
  397.                                 $destinataire_email_bcc "assistance.technique@solidaires.com";    
  398.                                 $mailaenv['bcc'] = array($destinataire_email_bcc => $destinataire_nom_bcc);
  399.                         
  400.                                 $urllogo $this->parambag->get('img_path')."entet_email_cf.webp";
  401.                             
  402.                                 // texte du mail
  403.                                 $bodymail "<div style='width:680px;margin:0 auto;'>";
  404.                                 $bodymail.= "<img style='width:680px;height:58px;border:none' src='".$urllogo."'>";
  405.                                 $bodymail.= "<div style='width:677px;text-align:left;font-size:12px Arial, Helvetica, sans-serif;color:#414141;border:1px solid #ff0000;overflow:hidden;'>";
  406.                                 $bodymail.= "<p style='padding:30px 10px;'>Bonjour <b>".$usr->getUsrpre().' '.$usr->getUsrnom()."</b><br />&nbsp;<br />";
  407.                                 $bodymail.= "Votre demande d'accès aux outils d'analyse financière Collectiv'Finance vient d'être validée.<br />&nbsp;<br />";
  408.                                 $bodymail.= "Vous pouvez dès maintenant <a href=".$this->parambag->get('web_path')."><b>vous connecter</b></a> et ";
  409.                                 $bodymail.= "utiliser ces outils d'analyse financière mis à la disposition des intercommunalités et des communes.<br />&nbsp;<br />";
  410.                                 $bodymail.= "En cas de difficulté technique, vous pourrez contacter l'assistance technique de Rural Consult :<br />";
  411.                                 $bodymail.= "- par courriel : <a href='mailto:assistance.technique@solidaires.com' title='Assistance technique Rural Consult'>assistance.technique@solidaires.com</a><br />";
  412.                                 $bodymail.= "- par téléphone : <b>01 58 50 75 75</b>.<br/>&nbsp;<br />";
  413.                                 $bodymail.= "Pour toute question concernant les outils eux-mêmes, contacter par courriel : <a href='mailto:territoiresconseils@caissedesdepots.fr' title='Rural Consult'>territoiresconseils@caissedesdepots.fr</a><br />&nbsp;<br />";
  414.                                 $bodymail.= "<span style='font-weight: 600;'>Rural Consult</strong><br />";
  415.                                 $bodymail.= "<span style='font-weight: 600;color:#ff0000;'>Banque des Territoires - Caisse des Dépôts</span><br />&nbsp;<br />";
  416.                                 $bodymail.= "</p></div>";
  417.                                 $bodymail.= "<div style='width:679px;height:20px;text-align:center;background:#ff0000;font-size:12px Arial, Helvetica, sans-serif;color:#fff;'>";
  418.                                 $bodymail.= "Rural Consult © Tous droits réservés</div>";
  419.                                 $bodymail.= "</div>";
  420.                                 $mailaenv['body'] = $bodymail;
  421.                                 
  422.                                 $unmess $this->meylerservice->envoidunmail('activation compte',$mailaenv);     // envoi
  423.                             }
  424.                         
  425.                             $message 'Compte modifié avec succès.';
  426.                             if($activation){
  427.                                 $message.= ' Ce compte est activé, un courriel a été expédié pour prévenir '.$usr->getUsrpre().' '.$usr->getUsrnom().' de cette activation.';
  428.                             }
  429.                             // Message d'information    
  430.                             $this->get('session')->getFlashBag()->add(
  431.                                 'Succès',
  432.                                 $message
  433.                             );
  434.                             
  435.                             // Redirection vers la liste des Utilisateurs
  436.                             return $this->redirect($this->generateUrl('admin_usr_rec'));                
  437.                         }
  438.                     }
  439.                 }
  440.                 
  441.                 // (ré)Affichage formulaire
  442.                 return $this->render('usr\majadm.html.twig'
  443.                     array(
  444.                         'help_dir' => $this->parambag->get('dochelp_web_path'),       //forcreatmenu
  445.                         'form_majadm' => $form_majadm->createView(),
  446.                         'usr' => $usr,
  447.                         'errors' => $errors
  448.                     )
  449.                 );    
  450.             
  451.             }else{
  452.                 $this->get('session')->getFlashBag()->add(
  453.                     'Erreur',
  454.                     'La page demandée n\'existe pas ! (nouadm)'
  455.                 );
  456.                 // Affichage page inexistante
  457.                 return $this->render('default\noway.html.twig', array(
  458.                 ));        
  459.             }
  460.             
  461.         }else{      // erreur réservé admin
  462.         
  463.             $this->get('session')->getFlashBag()->add(
  464.                 'Erreur',
  465.                 'La page demandée n\'existe pas ! (notadm)'
  466.             );
  467.             // Affichage page inexistante
  468.             return $this->render('default\noway.html.twig', array(
  469.             ));        
  470.         }
  471.         
  472.     }
  473.     
  474.     
  475.     // Màj compte USR par l'utilisateur lui-même
  476.     #[Route(path'/musr/{usrid}'name'modifcpte')]
  477.     public function majcpte
  478.         (
  479.             $usrid,
  480.             Request $request
  481.             ManagerRegistry $doctrine,
  482.             UserPasswordHasherInterface $passwordHasher,
  483.             ValidatorInterface $validator
  484.         ): Response
  485.     {
  486.         
  487.         $em $doctrine->getManager();
  488.         $user $this->getUser();
  489.         $usr $em->getRepository(usr::class)->findOneBy(array('usrid'=>$usrid));
  490.         $lstadmin $this->divservice->getIdAdmin();
  491.         if(($user->getusrid()==$usr->getusrid())||(in_array($user->getUsrid(), $lstadmin))){       // vérif si adéquat usr/user ou DPF
  492.         
  493.             // formulaire màj
  494.             $listCAT $em->getRepository(cat::class)->findAllOrderedByLib(array(),'array');  
  495.             // formulaire màj
  496.             $form_maj$this->createForm('App\Form\USR_maj',$usr,array(
  497.                 'listCAT' => $listCAT,
  498.             ));
  499.             $form_maj->add('Annuler''Symfony\Component\Form\Extension\Core\Type\ButtonType', array(
  500.                 'label'=>"Annuler",
  501.                 'attr'=>array('class'=>'btn btn-primary''data-url'=>$this->generateUrl('pageaccueil'))
  502.             ));
  503.             $form_maj->add('Enregistrer','Symfony\Component\Form\Extension\Core\Type\SubmitType',array(
  504.                 'label'=>"Enregistrer",
  505.                 'attr'=>array('class'=>'btn btn-primary')
  506.             ));
  507.             $form_maj->handleRequest($request);
  508.             // vérif saisie form_maj via validator annotations niveau Entity (après validation formulaire)
  509.             if($request->request->get('usr_maj')){
  510.                 // dd($request->request->get('usr_maj'));
  511.                 $errors $validator->validate($usr);
  512.                 if(count($errors) > 0) {
  513.                     // dd($errors);
  514.                     foreach($errors as $error){
  515.                         $this->get('session')->getFlashBag()->add(
  516.                             'Erreur',
  517.                             $error->getmessage()
  518.                         );
  519.                     }
  520.                 }
  521.             }else{
  522.                 $errors =  array();
  523.             }
  524.                 
  525.             if($request->request->get('usr_maj')){      // maj utilisateur
  526.                 if(($form_maj->isSubmitted())&&($form_maj->isValid())){
  527.                     $postData $request->request->get('usr_maj');
  528.                     // begin token-guard --------------------------------------------------------------------------------------------------------------
  529.                     $csrfToken $postData['_token'];
  530.                     if (false === $this->csrfTokenManager->isTokenValid(new CsrfToken('usrmajgarg188'$csrfToken))) {
  531.                         $this->get('session')->getFlashBag()->add(
  532.                             'Erreur',
  533.                             "Impossible d'accéder à la fonction demandée. (tou)"        // bad token user
  534.                         );
  535.                         return $this->redirect($this->generateUrl('pageaccueil')); // renvoi caval
  536.                         // end token-guard --------------------------------------------------------------------------------------------------------------
  537.                     
  538.                     }else{
  539.             
  540.                         if($postData['usrpwdmaj'] != ''){      // redéfinition du mot de passe
  541.                             // vérif pwd ok
  542.                             $pwdok $this->usrservice->verif_pwd_usr($postData['usrpwdmaj']); 
  543.                             if($pwdok==false){
  544.                                 $this->get('session')->getFlashBag()->add(
  545.                                     'Erreur',
  546.                                     'Votre mot de passe ne répond pas aux conditions de sécurité requises ! Veuillez y remédier.'
  547.                                 );
  548.                                 // re-affichage formulaire
  549.                                 return $this->render('usr\maj.html.twig'
  550.                                     array(
  551.                                         'help_dir' => $this->parambag->get('dochelp_web_path'),       //forcreatmenu
  552.                                         'form_maj' => $form_maj->createView(),
  553.                                         'usr' => $usr,
  554.                                         'errors' => $errors,
  555.                                     )
  556.                                 );    
  557.                             }else{
  558.                                 $hashedPassword $passwordHasher->hashPassword(
  559.                                     $usr,
  560.                                     $postData['usrpwdmaj']
  561.                                 );
  562.                                 $usr->setPassword($hashedPassword);
  563.                             }
  564.                         }
  565.                 
  566.                         // Enregistrement en bdd
  567.                         $em $doctrine->getManager();
  568.                         $em->persist($usr);
  569.                         $em->flush();
  570.                             
  571.                         // Message d'information    
  572.                         $this->get('session')->getFlashBag()->add(
  573.                             'Succès',
  574.                             'Compte modifié avec succès'
  575.                         );
  576.                         
  577.                         return $this->redirect($this->generateUrl('pageaccueil'));        // redir accueil lambda
  578.                 
  579.                     }
  580.                 }
  581.             }
  582.             
  583.             // Affichage formulaire
  584.             return $this->render('usr\maj.html.twig'
  585.                 array(
  586.                     'help_dir' => $this->parambag->get('dochelp_web_path'),       //forcreatmenu
  587.                     'form_maj' => $form_maj->createView(),
  588.                     'usr' => $usr,
  589.                     'errors' => $errors,
  590.                 )
  591.             );    
  592.         
  593.         }else{      // erreur de ID usr
  594.             $this->get('session')->getFlashBag()->add(
  595.                 'Erreur',
  596.                 'La page demandée n\'existe pas ! (id)'
  597.             );
  598.             // Affichage page inexistante
  599.             return $this->render('default\noway.html.twig', array(
  600.             ));        
  601.         }
  602.     }
  603.     
  604.     // Ouverture d'un nouveau compte, vérification préalable de l'e-mail
  605.     // Envoi d'un mail avec un lien de validation de l'e-mail
  606.     #[Route(path'/nusr'name'nouvcpte')]
  607.     public function ajoutcpte
  608.         (
  609.             Request $request,
  610.             ManagerRegistry $doctrine,
  611.             UserPasswordHasherInterface $passwordHasher,
  612.             ValidatorInterface $validator
  613.         ): Response
  614.     {
  615.         
  616.         $em $doctrine->getManager();
  617.         // formulaire ajout
  618.         $params = array();
  619.         $listCAT $em->getRepository(cat::class)->findAllOrderedByLib($params,'array');  
  620.         $usr = new usr();
  621.         $form_ajo $this->createForm('App\Form\USR_ajo',$usr, array(
  622.             'listCAT'=>$listCAT,
  623.         ));
  624.         $form_ajo->add('Enregistrer','Symfony\Component\Form\Extension\Core\Type\SubmitType',
  625.             array(
  626.                 'label'=>"Valider",
  627.                 'attr'=>array('class'=>'btn btn-primary')
  628.             )
  629.         );
  630.         $form_ajo->handleRequest($request);
  631.         // vérif saisie form_ajo via validator annotations niveau Entity (après validation formulaire)
  632.         if($request->request->get('usr_ajo')){
  633.             // dd($request->request->get('usr_ajo'));
  634.             $errors $validator->validate($usr);
  635.             if(count($errors) > 0) {
  636.                 // dd($errors);
  637.                 foreach($errors as $error){
  638.                     $this->get('session')->getFlashBag()->add(
  639.                         'Erreur',
  640.                         $error->getmessage()
  641.                     );
  642.                 }
  643.             }
  644.         }else{
  645.             $errors =  array();
  646.         }
  647.         
  648.         if($request->request->get('usr_ajo')){      // ajout utilisateur
  649.             if(($form_ajo->isSubmitted())&&($form_ajo->isValid())){          //  si tout OK selon validator
  650.                 $postData $request->request->get('usr_ajo');
  651.                 // begin token-guard --------------------------------------------------------------------------------------------------------------
  652.                 $csrfToken $postData['_token'];
  653.                 if (false === $this->csrfTokenManager->isTokenValid(new CsrfToken('usrajogarg;d44d'$csrfToken))) {
  654.                     $this->get('session')->getFlashBag()->add(
  655.                         'Erreur',
  656.                         "Impossible d'accéder à la fonction demandée. (tok-u)"
  657.                     );
  658.                     return $this->redirect($this->generateUrl('pageaccueil')); // renvoi caval
  659.                     // end token-guard --------------------------------------------------------------------------------------------------------------
  660.                 
  661.                 }else{
  662.                     
  663.                     if($postData['usrpwdajo'] != ''){      // saisie du mot de passe, vérif pwd ok
  664.                         $pwdok $this->usrservice->verif_pwd_usr($postData['usrpwdajo']); 
  665.                         
  666.                         if($pwdok==false){
  667.                             $this->get('session')->getFlashBag()->add(
  668.                                 'Erreur',
  669.                                 'Votre mot de passe ne répond pas aux conditions de sécurité requises'
  670.                             );
  671.                             // re-affichage formulaire
  672.                             return $this->render('usr\ajo.html.twig', array(
  673.                                 'form_ajo' => $form_ajo->createView(),
  674.                                 'errors' => $errors
  675.                             ));    
  676.                     
  677.                         }else{ // vérif si pas existe déjà username et usremail
  678.                             // traitement des chaînes retournées transmises
  679.                             $enlever = array("<"">""script");    // contre pirates
  680.                             $mettre = array("""""");
  681.                             $usremail str_replace($enlever$mettre$postData['usremail']);
  682.                             $username str_replace($enlever$mettre$postData['username']);
  683.                             $usr_exist $em->getRepository(usr::class)->findOneBy(array('usremail'=>$postData['usremail']));
  684.                             if($usr_exist==null){
  685.                                 $usr_exist $em->getRepository(usr::class)->findOneBy(array('username'=>$postData['username']));
  686.                                 if($usr_exist!=null){
  687.                                     $this->get('session')->getFlashBag()->add(
  688.                                         'Erreur',
  689.                                         'Cet identifiant (login) ne peut pas être accepté (dbl)'
  690.                                     );
  691.                                 }
  692.                             }else{
  693.                                 $this->get('session')->getFlashBag()->add(
  694.                                     'Erreur',
  695.                                     'Cet E-mail ne peut pas être accepté (red)'
  696.                                 );
  697.                             }
  698.                             if($usr_exist!=null){
  699.                                 // re-affichage formulaire
  700.                                 return $this->render('usr\ajo.html.twig', array(
  701.                                     'form_ajo' => $form_ajo->createView(),
  702.                                     'errors' => $errors
  703.                                 ));    
  704.                             }else{    // création du compte ok
  705.                             
  706.                                 $prf $em->getRepository(prf::class)->findOneBy(array('prfid'=>3));   // Collectiv' Finance
  707.                                 $cat $em->getRepository(cat::class)->findOneBy(array('catid'=>$postData['catid']));
  708.                                 $usrdatcre = new \DateTime();
  709.                                 $usrdatcre->createFromFormat("Y-m-d H:i:s"time());
  710.                                 $usr->setUsername($postData['username']);
  711.                                 $hashedPassword $passwordHasher->hashPassword(
  712.                                     $usr,
  713.                                     $postData['usrpwdajo']
  714.                                 );
  715.                                 $usr->setPassword($hashedPassword);
  716.                                 // précaution excessive contre py rat, activée pour le moment
  717.                                 $usr->setUsrorg(str_replace($enlever$mettre$postData['usrorg']));
  718.                                 $usr->setUsrnom(str_replace($enlever$mettre$postData['usrnom']));
  719.                                 $usr->setUsrpre(str_replace($enlever$mettre$postData['usrpre']));
  720.                                 $usr->setUsrdatcre($usrdatcre);
  721.                                 $usr->setUsrdatchgpwd($usrdatcre);
  722.                                 
  723.                                 // limiter à 24h la durée du lien de vérification de la validité d'un e-mail suite ouverture compte
  724.                                 $letemps time();
  725.                                 $demain time()+(3600*24);
  726.                                 $usr->setUsrmaictltok(uniqid('cftok_',true));
  727.                                 $usr->setUsrmaictllim($demain);
  728.                                 $usr->setUsrstatut(0);      // 0 = Attente de validation - 1 =  Validé - 2 = suspendu
  729.                                 $usr->setcatid($cat);
  730.                                 $usr->setprfid($prf);
  731.                                 $em->persist($usr);
  732.                                 $em->flush();
  733.                                 // ===================== envoi d'un mail pour vérif e-mail saisi, 
  734.                                 // ===================== contenu de l'e-mail : lien de confirm
  735.                                 $mailaenv = array();
  736.                                 $mailaenv['sujet'] = "Demande d'ouverture de compte : Collectiv'Finances";
  737.                                 $mailaenv['titre'] = "[Rural Consult] Accès aux outils d'analyse financière'";
  738.                                 $mailaenv['expediteur_nom'] = "Collectiv'Finances";
  739.                                 $mailaenv['expediteur_email'] = "assistance.technique@solidaires.com";            // TODO à modifier
  740.                                 $mailaenv['fichiers'] = array();                    // les fichiers joints
  741.                                 
  742.                                 $mailaenv['cc'] = '';           // pas de copie ici
  743.                                 
  744.                                 // pour préveni admin de l'intention d'ouverture de compte
  745.                                 $destinataire_nom_bcc "Assistance technique Rural Consult";    
  746.                                 $destinataire_email_bcc "assistance.technique@solidaires.com";    
  747.                                 $mailaenv['bcc'] = array($destinataire_email_bcc => $destinataire_nom_bcc);
  748.                                 $urllogo $this->parambag->get('img_path')."entet_email_cf.webp";
  749.                                 
  750.                                 // texte du mail
  751.                                 $bodymail "<div style='width:680px;margin:0 auto;'>";
  752.                                 $bodymail.= "<img style='width:680px;height:58px;border:none' src='".$urllogo."'>";
  753.                                 $bodymail.= "<div style='width:677px;text-align:left;font-size:12px Arial, Helvetica, sans-serif;color:#414141;border:1px solid #ff0000;overflow:hidden;'>";
  754.                                 $bodymail.= "<p style='padding:30px 10px;'>Bonjour ".$usr->getUsrpre()." ".$usr->getUsrnom().",<br />&nbsp;<br />";
  755.                                 $bodymail.= "Nous avons reçu une demande d'ouverture de compte pour un accès aux outils d'analyse financière mis à disposition par Rural Consult [".date('d-m-Y H:i:s')."]<br />&nbsp;<br />";
  756.                                 $bodymail.= "Si vous êtes à l'origine de cette demande, veuillez suivre les instructions ci-dessous :<br />";
  757.                                 $bodymail.= " - Cliquez sur le lien afin de confirmer votre demande : <a href='";
  758.                                 $bodymail.= $this->parambag->get('web_path')."vemail?ie=UTF8&tok=".$usr->getUsrmaictltok()."'>Lien de confirmation</a><br />&nbsp;<br />";
  759.                                 $bodymail.= "Si vous rencontrez des difficultés pour valider votre demande d'ouverture de compte, veuillez nous envoyer un courriel en cliquant sur : <a href='mailto:assistance.technique@solidaires.com' title='Collectiv'Finances'>Assistance Collectiv'Finance.</a><br / >";
  760.                                 $bodymail.= "Si vous n'avez pas demandé d'ouverture de compte, ignorez ce courriel, nous effacerons cette demande.<br />&nbsp;<br />";
  761.                                 $bodymail.= "<i><span style='font-weight: 600;color:#0ea210;'>Important</span> : Rural Consult ne vous enverra jamais un courriel vous demandant d'indiquer votre mot de passe.</i><br />&nbsp;<br />";
  762.                                 $bodymail.= "<span style='font-weight: 600;'>Rural Consult</strong><br />";
  763.                                 $bodymail.= "<span style='font-weight: 600;color:#ff0000;'>Banque des Territoires - Caisse des Dépôts</span><br />&nbsp;<br />";
  764.                                 $bodymail.= "</p></div>";
  765.                                 $bodymail.= "<div style='width:679px;height:20px;text-align:center;background:#ff0000;font-size:12px Arial, Helvetica, sans-serif;color:#fff;'>";
  766.                                 $bodymail.= "Rural Consult © Tous droits réservés</div>";
  767.                                 $bodymail.= "</div>";
  768.                                 $mailaenv['body'] = $bodymail;
  769.                                 
  770.                                 // 1° mail vers assistance.technique@solidaires.com
  771.                                 $mailaenv['destinataire_nom'] = "Administrateur Rural Consult";
  772.                                 $mailaenv['destinataire_email'] = "assistance.technique@solidaires.com";            // TODO à modifier
  773.                                 $unmess $this->meylerservice->envoidunmail('demande ouverture compte',$mailaenv);     // envoi
  774.                                 // 2° mail vers utilisateur demandeur
  775.                                 $mailaenv['destinataire_nom'] = $usr->getUsrpre().' '.$usr->getUsrnom();
  776.                                 $mailaenv['destinataire_email'] = $usr->getUsremail();
  777.                                 $unmess $this->meylerservice->envoidunmail('demande ouverture compte',$mailaenv);     // envoi
  778.                                 $this->get('session')->getFlashBag()->add(
  779.                                     'Succès',
  780.                                     'Votre compte a été créé. Un mail de vérification de votre demande vous a été envoyé. Il contient des instructions pour la transmission de votre demande à Rural Consult'
  781.                                 );
  782.                                 return $this->redirect($this->generateUrl('pageaccueil'));
  783.                             }
  784.                         }
  785.                         
  786.                     }else{
  787.                         $this->get('session')->getFlashBag()->add(
  788.                             'Erreur',
  789.                             'Votre mot de passe doit être obligatoirement indiqué'
  790.                         );
  791.                         // re-affichage formulaire
  792.                         return $this->render('usr\ajo.html.twig', array(
  793.                             'form_ajo' => $form_ajo->createView(),
  794.                             'errors' => $errors
  795.                         ));    
  796.                         
  797.                     }
  798.                 }
  799.             }
  800.         }
  801.         
  802.         // Affichage form nouv usr
  803.         return $this->render('usr\ajo.html.twig', array(
  804.             'form_ajo' => $form_ajo->createView(),
  805.             'errors' => $errors
  806.         ));    
  807.         
  808.     }
  809.      // Provenance : lien contenu dans e-mail "Demande d'ouverture de compte : Collectiv'Finances"
  810.      //  - vérif du lien cliqué contenu dans l'e-mail envoyé
  811.      //  - vérif du délai max autorisé (24h)
  812.     #[Route(path'/vemail'name'verifemail')]
  813.     public function emailverif
  814.         (
  815.             Request $request
  816.             ManagerRegistry $doctrine
  817.         ): Response
  818.     {
  819.         
  820.         if(!isset($_GET['tok'])){   // no token
  821.             $this->get('session')->getFlashBag()->add(
  822.                 'Erreur',
  823.                 'La page demandée n\'existe pas ! (nto)'
  824.             );
  825.             // Affichage page inexistante
  826.             return $this->render('default\noway.html.twig', array());        
  827.             
  828.         }else{  // ya1token
  829.             $em $doctrine->getManager();
  830.             $usr $em->getRepository(usr::class)->findOneBy(array('usrmaictltok'=>$_GET['tok']));
  831.            
  832.             if($usr==null){  // bad token
  833.                 $this->get('session')->getFlashBag()->add(
  834.                     'Erreur',
  835.                     'La page demandée n\'existe pas ! (bdt)'
  836.                 );
  837.                 // Affichage page inexistante
  838.                 return $this->render('default\noway.html.twig', array());        
  839.                 
  840.             }else{  // tok ok, vérif délai
  841.             
  842.                 $usrmaictllim $usr->getUsrmaictllim();    // date limite de vérif validité e-mail suite ouverture de compte
  843.                 $maintenant time();
  844.                 if($usrmaictllim $maintenant){    // trop tard : chgt avant 24h max
  845.                     $this->get('session')->getFlashBag()->add(
  846.                         'Erreur',
  847.                         'Le délai de vérification de l\'e-mail (24h) est dépassé (date limite : '.date('d/m/Y H:i',$usrmaictllim).'. Veuillez refaire une demande de création de compte (tim)'
  848.                     );
  849.                     // inactivation compte : modif e-mail pour permettre nouv dde avec même e-mail
  850.                     $usremail $usr->getUsremail().'.outlim'.rand(1999);
  851.                     $usr->setUsremail($usremail);
  852.                     $usr->setUsrmaictltok(null);                    // token lien vérif validité d'un e-mail suite ouverture compte
  853.                     $usr->setUsrmaictllim(null);                        // ràz durée du lien de vérification de la validité d'un e-mail suite ouverture compte
  854.                     $em->persist($usr);
  855.                     $em->flush();
  856.                     
  857.                     // Affichage page inexistante
  858.                     return $this->render('default\noway.html.twig', array());
  859.             
  860.                 }else{        // délai OK, validation ouverture de compte, expédition mail aux admin's
  861.  
  862.                     // affichage confirmation d'ouverture du compte, envoi avis aux administrateurs de la demande
  863.                     // ============================= envoi d'un mail aux ADMIN
  864.                     $mailaenv = array();
  865.                     $mailaenv['sujet'] = "Demande d'ouverture de compte : Collectiv'Finance";
  866.                     $mailaenv['titre'] = "[Rural Consult] Création de compte d'accès aux outils d'analyse financière'";
  867.                     $mailaenv['expediteur_nom'] = "Assistance technique Rural Consult";
  868.                     $mailaenv['expediteur_email'] = "assistance.technique@solidaires.com";        // TODO à modifier
  869.                     $mailaenv['fichiers'] = array();                    // les fichiers joints
  870.                     $mailaenv['cc'] = '';           // pas de copie ici
  871.                     $mailaenv['bcc'] = '';        // pas de copi cach
  872.                     $urllogo $this->parambag->get('img_path')."entet_email_cf.webp";
  873.                     
  874.                     // texte du mail
  875.                     $bodymail "<div style='width:680px;margin:0 auto;'>";
  876.                     $bodymail.= "<img style='width:680px;height:58px;border:none' src='".$urllogo."'>";
  877.                     $bodymail.= "<div style='width:677px;text-align:left;font-size:12px Arial, Helvetica, sans-serif;color:#414141;border:1px solid #ff0000;overflow:hidden;'>";
  878.                     $bodymail.= "<p style='padding:30px 10px;'>Bonjour,<br />&nbsp;<br />";
  879.                     $bodymail.= "En tant qu'administrateur des outils d'analyse financière de Rural Consult, vous recevez ce courriel pour vous informer d'une demande d'ouverture de compte.<br />&nbsp;<br />";
  880.                     $bodymail.= "La demande est faite par : <b>".$usr->getUsrnom()." ".$usr->getUsrpre()." - ".$usr->getusrorg()."</b><br />&nbsp;<br />";
  881.                     $bodymail.= "Vous pouvez consulter et valider cette demande en vous connectant sur le site Collectiv'Finance : <a href=";
  882.                     $bodymail.= $this->parambag->get('web_path')."><b>Vous connecter</b></a><br />&nbsp;<br />";
  883.                     $bodymail.= "Si vous validez cette demande, le demandeur recevra un courriel pour l'informer de l'activation de son compte lui permettant d'accéder aux outils d'analyse financière.<br />&nbsp;<br />";
  884.                     $bodymail.= "<span style='font-weight: 600;'>Rural Consult</strong><br />";
  885.                     $bodymail.= "<span style='font-weight: 600;color:#ff0000;'>Banque des Territoires - Caisse des Dépôts</span><br />&nbsp;<br />";
  886.                     $bodymail.= "</p></div>";
  887.                     $bodymail.= "<div style='width:679px;height:20px;text-align:center;background:#ff0000;font-size:12px Arial, Helvetica, sans-serif;color:#fff;'>";
  888.                     $bodymail.= "Rural Consult © Tous droits réservés</div>";
  889.                     $bodymail.= "</div>";
  890.                     $mailaenv['body'] = $bodymail;
  891.                     
  892.                     // 1° mail vers assistance.technique@solidaires.com
  893.                     $mailaenv['destinataire_nom'] = "Administrateur Rural Consult";
  894.                     $mailaenv['destinataire_email'] = "assistance.technique@solidaires.com";            // TODO à modifier
  895.                     $unmess $this->meylerservice->envoidunmail('Demande ouverture compte',$mailaenv);     // envoi
  896.                     // 2° mail vers damien.christiany@caissedesdepots.fr (06/23...))
  897.                     // $mailaenv['destinataire_nom'] = "Administrateur Rural Consult";
  898.                     // $mailaenv['destinataire_email'] = "damien.christiany@caissedesdepots.fr";
  899.                     // $unmess = $this->meylerservice->envoidunmail('Demande ouverture compte',$mailaenv);     // envoi
  900.                     $usr->setUsrmaictltok(null);                            // token lien vérif validité d'un e-mail suite ouverture compte
  901.                     $usr->setUsrmaictllim(null);                                // ràz durée du lien de vérification de la validité d'un e-mail suite ouverture compte
  902.                     $em->persist($usr);
  903.                     $em->flush();
  904.                     $this->get('session')->getFlashBag()->add(
  905.                         'Succès',
  906.                         "Votre demande d'ouverture de compte a été confirmée. Rural Consult en a été informé et donnera rapidement suite à votre demande."
  907.                     );
  908.                     return $this->redirect($this->generateUrl('pageaccueil'));
  909.                 }
  910.                 
  911.             }
  912.         }
  913.     }
  914.     // Identifiant oublié : envoi d'un mail de renvoi du login
  915.     #[Route(path'/flogin'name'identifoubli')]
  916.     public function loginoubli
  917.         (
  918.             Request $request
  919.             ManagerRegistry $doctrine,
  920.             LOGDEFService $logdefservice,
  921.         ): Response
  922.     {
  923.         
  924.         $msgcplt=''$loginchgoblig 0$floginemail '';
  925.         if(isset($_POST['floginemail'])){
  926.             // begin token-guard --------------------------------------------------------------------------------------------------------------
  927.             $csrfToken $_POST['_csrf_token'];
  928.             if (false === $this->csrfTokenManager->isTokenValid(new CsrfToken('identifoubliadm48'$csrfToken))) {
  929.                 $txtmsg "Une erreur a eu lieu ! Veuillez reprendre votre saisie (fat)";    // false token
  930.                 $this->get('session')->getFlashBag()->add(
  931.                     'Erreur',
  932.                    $txtmsg
  933.                 );
  934.                 return $this->render('usr\loginoubli.html.twig', array(
  935.                     'msgcplt' => $msgcplt,
  936.                     'loginchgoblig' => $loginchgoblig,
  937.                     'floginemail' => $floginemail,
  938.                 ));
  939.                 //throw new InvalidCsrfTokenException('Invalid CSRF token.'); //non utilisé ici -> ajax
  940.                 // end token-guard --------------------------------------------------------------------------------------------------------------
  941.                 
  942.             }else{  // vérif e-mail saisi, rech compte etc..
  943.        
  944.                 $floginemail $_POST['floginemail'];
  945.                 $em $doctrine->getManager();
  946.                 $usr $em->getRepository(usr::class)->findOneBy(array('usremail'=>$floginemail));
  947.                 if($usr==null){
  948.                     $txtmsg "Une erreur a eu lieu ! Veuillez reprendre votre saisie. (not)";    // non trouvé
  949.                     $msgcplt "Si vous ne vous souvenez pas de l'e-mail ou de l'identifiant associé à votre compte, contactez notre support technique";
  950.                     
  951.                     $this->get('session')->getFlashBag()->add(
  952.                         'Erreur',
  953.                         $txtmsg
  954.                         //'L\'E-mail saisi n\'est associé à aucun compte !'     trop explicite :-(
  955.                     );
  956.                     
  957.                     // ré-Affichage loginoubli (affiché soit à la dde, soit chgt login oblig)
  958.                     if(isset($_POST['loginchgoblig'])){
  959.                         $loginchgoblig $_POST['loginchgoblig'];
  960.                     }
  961.                     
  962.                     return $this->render('usr\loginoubli.html.twig', array(
  963.                         'msgcplt' => $msgcplt,
  964.                         'loginchgoblig' => $loginchgoblig,
  965.                         'floginemail' => $floginemail,
  966.                     ));        
  967.                     
  968.                 }else{  // vérif statut du compte, si pas ok renvoi vers login
  969.                     
  970.                     // dans tous les cas suivants, renvoi vers login
  971.                     // a) les infobulles fusion de la page
  972.                     $lesdefs = array('ppi','mod','pro','pli');
  973.                     $deflog = array();
  974.                     foreach($lesdefs as $ladef){
  975.                         $deflog[$ladef] = $logdefservice->get_unedef($ladef); 
  976.                     }
  977.                     if($usr->getUsrstatut()!=1){
  978.                         if($usr->getUsrstatut()==0){
  979.                             $txtmsg "Votre compte n'est pas actif. Veuillez refaire une demande de renvoi d'identifiant lorsque votre compte sera activé. (noa)";    // non activé
  980.                         }else{
  981.                             $txtmsg "Votre compte est bloqué. Veuillez contacter notre assistance technique en nous envoyant un courriel à l'adresse assistance.technique@solidaires.com (cbl)";    // compte bloqué
  982.                         }
  983.                         $this->get('session')->getFlashBag()->add(
  984.                             'Erreur',
  985.                             $txtmsg
  986.                         );
  987.                         return $this->render('security/login.html.twig'
  988.                             array(
  989.                                 'last_username' => '',
  990.                                 'error' => '',
  991.                                 'deflog' => $deflog
  992.                             )
  993.                         );                    
  994.                     
  995.                     }else{    // compte OK, vérif dat der envoi login et nb ddes (si >5 en moins d'un jour => blocage)
  996.                         $datenvlog = new \DateTime();
  997.                         $hier date('Y-m-d H:i:s'time()-(3600*24));
  998.                         
  999.                         if($usr->getUsrdatenvlog()==null){  // cas de la 1° dde envoi log
  1000.                             $datenvlog->createFromFormat("Y m d "time());
  1001.                             $usr->setUsrdatenvlog($datenvlog);
  1002.                             $usr->setUsrnbenvlog(0);    // idem envoi log / pwd
  1003.                             $em->persist($usr);
  1004.                             $em->flush();
  1005.                         }else{  // si antérieur à hier, raz
  1006.                             $usrdatenvlog $usr->getUsrdatenvlog()->format('Y-m-d H:i:s');
  1007.                             if($usrdatenvlog $hier){    // dernière dde antérieure à hier, raz
  1008.                                 $usr->setUsrdatenvlog($datenvlog);  // attrib date du jour
  1009.                                 $usr->setUsrnbenvlog(0);    // 1° envoi log en  24h
  1010.                                 $em->persist($usr);
  1011.                                 $em->flush();
  1012.                             }
  1013.                         }
  1014.                         
  1015.                         $usrdatenvlog $usr->getUsrdatenvlog()->format('Y-m-d H:i:s');
  1016.                         if(($usrdatenvlog >= $hier)&&($usr->getUsrnbenvlog()>=5)){    // si plus de 5 ddes depuis hier
  1017.                             $txtmsg 'Une erreur a eu lieu ! Veuillez reprendre votre saisie (ab)';        // abus
  1018.                             $this->get('session')->getFlashBag()->add(
  1019.                                 'Erreur',
  1020.                                 $txtmsg
  1021.                             );
  1022.                             
  1023.                             return $this->render('security/login.html.twig'
  1024.                                 array(
  1025.                                     'last_username' => '',
  1026.                                     'error' => '',
  1027.                                     'deflog' => $deflog
  1028.                                 )
  1029.                             );
  1030.                         
  1031.                         }else{        // tout ok envoi du mail de renvoi de l'identifiant
  1032.                             $usr_login $usr->getUsername();
  1033.                             $nbenvlog $usr->getUsrnbenvlog() + 1;
  1034.                             $usr->setUsrnbenvlog($nbenvlog);    // nième envoi log
  1035.                             $em->persist($usr);
  1036.                             $em->flush();
  1037.                         
  1038.                             $mailaenv = array();
  1039.                             $mailaenv['titre'] = '[rural Consult] Renvoi de votre identifiant';
  1040.                             $mailaenv['expediteur_nom'] = "Assistance technique Rural Consult";
  1041.                             $mailaenv['expediteur_email'] = "assistance.technique@solidaires.com";
  1042.                             $mailaenv['destinataire_nom'] = $usr->getUsrpre().' '.$usr->getUsrnom();
  1043.                             $mailaenv['destinataire_email'] = $_POST['floginemail'];
  1044.                             
  1045.                             $mailaenv['cc'] = '';           // pas de copie ici
  1046.                             
  1047.                             $destinataire_nom_bcc "Assistance technique Rural Consult";    
  1048.                             $destinataire_email_bcc "assistance.technique@solidaires.com";    
  1049.                             $mailaenv['bcc'] = array($destinataire_email_bcc => $destinataire_nom_bcc);
  1050.                             
  1051.                             $mailaenv['fichiers'] = array();                    // pas de fichier joint ici
  1052.                             
  1053.                             $mailaenv['sujet'] = "Renvoi de votre identifiant Collectiv'Finance";
  1054.                             $urllogo $this->parambag->get('img_path')."entet_email_cf.webp";
  1055.                             
  1056.                             // texte du mail
  1057.                             $bodymail "<div style='width:680px;margin:0 auto;'>";
  1058.                             $bodymail.= "<img style='width:680px;height:58px;border:none' src='".$urllogo."'>";
  1059.                             $bodymail.= "<div style='width:677px;text-align:left;font-size:12px Arial, Helvetica, sans-serif;color:#414141;border:1px solid #ff0000;overflow:hidden;'>";
  1060.                             $bodymail.= "<p style='padding:30px 10px;'>Bonjour ".$mailaenv['destinataire_nom'].",<br />&nbsp;<br />";
  1061.                             $bodymail.= "Nous avons reçu une demande de renvoi de votre identifiant le ".$datenvlog->format("d-m-Y H:i").".<br />";
  1062.                             $bodymail.= "Votre identifiant : <b style='color:#ff0000';>".$usr_login."</b><br />&nbsp;<br />";
  1063.                             $bodymail.= "Si vous n'êtes pas à l'origine de cette demande, ignorez ce courriel.<br />&nbsp;<br />";
  1064.                             $bodymail.= "<i><span style='font-weight: 600;color:#0ea210;'>Important</span> : Rural Consult ne vous enverra jamais un courriel vous demandant d'indiquer votre mot de passe.</i><br />&nbsp;<br />";
  1065.                             $bodymail.= "<span style='font-weight: 600;'>Rural Consult</strong><br />";
  1066.                             $bodymail.= "<span style='font-weight: 600;color:#ff0000;'>Banque des Territoires - Caisse des Dépôts</span><br />&nbsp;<br />";
  1067.                             $bodymail.= "</p></div>";
  1068.                             $bodymail.= "<div style='width:679px;height:20px;text-align:center;background:#ff0000;font-size:12px Arial, Helvetica, sans-serif;color:#fff;'>";
  1069.                             $bodymail.= "Rural Consult © Tous droits réservés</div>";
  1070.                             $bodymail.= "</div>";
  1071.                             $mailaenv['body'] = $bodymail;
  1072.                             $unmess $this->meylerservice->envoidunmail('loginoubli',$mailaenv);     // envoi
  1073.                             
  1074.                             $this->get('session')->getFlashBag()->add(
  1075.                                 'Succès',
  1076.                                 "Un e-mail vous a été envoyé. Il contient votre identifiant de connexion."
  1077.                             );
  1078.                             return $this->render('security/login.html.twig'
  1079.                                 array(
  1080.                                     'last_username' => '',
  1081.                                     'error' => '',
  1082.                                     'deflog' => $deflog
  1083.                                 )
  1084.                             );
  1085.                         }
  1086.                     }
  1087.                 }
  1088.                     
  1089.             }
  1090.             
  1091.         }else{
  1092.             
  1093.             // Affichage loginoubli
  1094.             return $this->render('usr\loginoubli.html.twig', array(
  1095.                 'msgcplt' => $msgcplt,
  1096.                 'loginchgoblig' => $loginchgoblig,
  1097.                 'floginemail' => $floginemail,
  1098.             ));        
  1099.         }
  1100.         
  1101.     }
  1102.     
  1103.     // PWD oublié : envoi d'un mail pour réinitialiser le pwd
  1104.     #[Route(path'/fpwd'name'motdpasseoubli')]
  1105.     public function pwdoubli
  1106.         (
  1107.             Request $request
  1108.             ManagerRegistry $doctrine,
  1109.             LOGDEFService $logdefservice,
  1110.         ): Response
  1111.     {
  1112.     
  1113.         //var_dump($request);
  1114.         $msgcplt='';
  1115.         
  1116.         $pwdchgoblig 0;
  1117.         if(isset($_POST['fpwdemail'])){
  1118.             
  1119.             $em $doctrine->getManager();
  1120.             $usr $em->getRepository(usr::class)->findOneBy(array('usremail'=>$_POST['fpwdemail']));
  1121.             if($usr == null){
  1122.                 // Message d'information    
  1123.                 $this->get('session')->getFlashBag()->add(
  1124.                     'Erreur',
  1125.                     'Une erreur de saisie ne nous permet pas d\'identifier votre compte'
  1126.                 );
  1127.                 $msgcplt "Si vous ne vous souvenez pas de l'e-mail associé à votre compte, veuillez nous écrire à l'adresse ci-dessous.";
  1128.                 
  1129.                 // ré-Affichage pwdoubli (affiché soit à la dde, soit chgt pwd oblig)
  1130.                 if(isset($_POST['pwdchgoblig'])){
  1131.                     $pwdchgoblig $_POST['pwdchgoblig'];
  1132.                 }
  1133.                 
  1134.                 return $this->render('usr/pwdoubli.html.twig', array(
  1135.                     'msgcplt' => $msgcplt,
  1136.                     'pwdchgoblig' => $pwdchgoblig,
  1137.                     'fpwdemail' => $_POST['fpwdemail']
  1138.                 ));        
  1139.                 
  1140.             }else{  // ok, envoi du mail
  1141.             
  1142.                 $token $_POST['_csrf_token'];
  1143.                 $datddechgpdw = new \DateTime();
  1144.                 $datddechgpdw->createFromFormat("Y m d "time());
  1145.                 $usr->setUsrchgpwdtok($token);                // CSRF token dde chgt PWD
  1146.                 $usr->setUsrdatddechgpwd(time());        // Timestamp dde chgt PWD
  1147.                 $cpteurdde $usr->getUsrnbenvpwd() + 1;
  1148.                 $usr->setUsrnbenvpwd($cpteurdde);            // à titre indicatif, nb dde changement de pwd
  1149.                 $em->persist($usr);
  1150.                 $em->flush();
  1151.                 // préparation du mèl
  1152.                 $mailaenv = array();
  1153.                 $mailaenv['sujet'] = "Demande de changement de mot de passe : Collectiv'Finance";
  1154.                 $mailaenv['titre'] = "[Rural Consult] Demande de changement de mot de passe";
  1155.                 $mailaenv['expediteur_nom'] = "Assistance technique Rural Consult";
  1156.                 $mailaenv['expediteur_email'] = "assistance.technique@solidaires.com";            // TODO à modifier
  1157.                 $mailaenv['destinataire_nom'] = $usr->getUsrpre().' '.$usr->getUsrnom();
  1158.                 $mailaenv['destinataire_email'] = $_POST['fpwdemail'];
  1159.                 $mailaenv['fichiers'] = array();                    // les fichiers joints
  1160.                 
  1161.                 //$mailaenv['fichiers'][0] = array();               // 1° fichier à joindre  => pas de documents joints
  1162.                 //$mailaenv['fichiers'][0]['chemin_fichier'] = "";
  1163.                 //$mailaenv['fichiers'][0]['nom_fichier'] = "";
  1164.                 //$mailaenv['fichiers'][0]['nom_orig'] = "";
  1165.                 
  1166.                 $mailaenv['cc'] = '';           // pas de copie ici
  1167.                 
  1168.                 $destinataire_nom_bcc "Assistance technique Rural Consult";    
  1169.                 $destinataire_email_bcc "assistance.technique@solidaires.com";    
  1170.                 $mailaenv['bcc'] = array($destinataire_email_bcc => $destinataire_nom_bcc);
  1171.                 $urllogo $this->parambag->get('img_path')."entet_email_cf.webp";
  1172.                 
  1173.                 // texte du mail
  1174.                 $bodymail "<div style='width:680px;margin:0 auto;'>";
  1175.                 $bodymail.= "<img style='width:680px;height:58px;border:none' src='".$urllogo."'>";
  1176.                 $bodymail.= "<div style='width:677px;text-align:left;font-size:12px Arial, Helvetica, sans-serif;color:#414141;border:1px solid #ff0000;overflow:hidden;'>";
  1177.                 $bodymail.= "<p style='padding:30px 10px;'>Bonjour,<br />&nbsp;<br />";
  1178.                 $bodymail.= "Nous avons reçu une demande de changement du mot de passe associé à votre E-mail à cette date : ".$datddechgpdw->format("d-m-Y H:i").". ";
  1179.                 $bodymail.= "Si vous êtes à l'origine de cette demande, suivez les instructions ci-dessous.<br />&nbsp;<br />";
  1180.                 $bodymail.= "Cliquez sur le lien ci-après pour réinitialiser votre mot de passe : <a href=";
  1181.                 $bodymail.= $this->parambag->get('web_path')."mpwd?ie=UTF8&tok=".$token.">Lien pour la réinitialisation de votre mot de passe</a><br />&nbsp;<br />";
  1182.                 $bodymail.= "Si vous n'avez pas demandé de changement de votre mot de passe, ignorez ce courriel.<br />";
  1183.                 $bodymail.= "Si vous rencontrez des difficultés pour changer de mot de passe, veuillez nous envoyer un courriel à l'adresse suivante : <a href='mailto:assistance.technique@solidaires.com' title='Aide Rural Consult'>assistance.technique@solidaires.com.</a><br / >&nbsp;<br />";
  1184.                 $bodymail.= "<i><span style='font-weight: 600;color:#0ea210;'>Important</span> : Rural Consult ne vous enverra jamais un courriel vous demandant d'indiquer votre mot de passe.</i><br />&nbsp;<br />";
  1185.                 $bodymail.= "<span style='font-weight: 600;'>Rural Consult</strong><br />";
  1186.                 $bodymail.= "<span style='font-weight: 600;color:#ff0000;'>Banque des Territoires - Caisse des Dépôts</span><br />&nbsp;<br />";
  1187.                 $bodymail.= "</p></div>";
  1188.                 $bodymail.= "<div style='width:679px;height:20px;text-align:center;background:#ff0000;font-size:12px Arial, Helvetica, sans-serif;color:#fff;'>";
  1189.                 $bodymail.= "Rural Consult © Tous droits réservés</div>";
  1190.                 $bodymail.= "</div>";
  1191.                 $mailaenv['body'] = $bodymail;
  1192.                 
  1193.                 $unmess $this->meylerservice->envoidunmail('reinitialisation mot de passe',$mailaenv);     // envoi
  1194.                 $this->get('session')->getFlashBag()->add(
  1195.                     'Succès',
  1196.                     'Un courriel vous a été envoyé. Vous y trouverez un lien pour réinitialiser votre mot de passe'
  1197.                 );
  1198.                 // a) les infobulles fusion de la page
  1199.                 // $lesdefs = array('ppi','mod','pro','eau','pfi','lis','mev');
  1200.                 $lesdefs = array('ppi','mod','pro','pli');
  1201.                 $deflog = array();
  1202.                 foreach($lesdefs as $ladef){
  1203.                     $deflog[$ladef] = $logdefservice->get_unedef($ladef); 
  1204.                 }
  1205.                 return $this->render('security/login.html.twig'
  1206.                     array(
  1207.                         'last_username' => '',
  1208.                         'error' => '',
  1209.                         'deflog' => $deflog
  1210.                     )
  1211.                 );
  1212.                 
  1213.             }
  1214.             
  1215.         }else{
  1216.         
  1217.             // Affichage pwdoubli
  1218.             return $this->render('usr\pwdoubli.html.twig', array(
  1219.                 'msgcplt' => $msgcplt,
  1220.                 'pwdchgoblig' => $pwdchgoblig,
  1221.                 'fpwdemail' => ''
  1222.             ));        
  1223.         }
  1224.         
  1225.     }
  1226.     
  1227.     // Provenance :lien contenu dans un mail de réponse à une demande de changement de mot de passe
  1228.     #[Route(path'/mpwd'name'motdpassemodif')]
  1229.     public function pwdmodif
  1230.         (
  1231.             Request $request
  1232.             ManagerRegistry $doctrine,
  1233.             UserPasswordHasherInterface $passwordHasher,
  1234.         ): Response
  1235.     {
  1236.         
  1237.         // pwd à modifier
  1238.         //var_dump($request);
  1239.         
  1240.         if(!isset($_GET['tok'])){   // no token
  1241.             $this->get('session')->getFlashBag()->add(
  1242.                 'Erreur',
  1243.                 'La page demandée n\'existe pas ! (nt)'
  1244.             );
  1245.             return $this->render('default\noway.html.twig', array(
  1246.             ));        
  1247.             
  1248.         }else{  // ya1token
  1249.             $em $doctrine->getManager();
  1250.             $usr $em->getRepository(usr::class)->findOneBy(array('usrchgpwdtok'=>$_GET['tok']));
  1251.             if($usr == null){  // bad token
  1252.                 $this->get('session')->getFlashBag()->add(
  1253.                     'Erreur',
  1254.                     'La page demandée n\'existe pas ! (bdt)'
  1255.                 );
  1256.                 return $this->render('default\noway.html.twig', array(
  1257.                 ));        
  1258.                 
  1259.             }else{  // tok ok, vérif délai
  1260.             
  1261.                 $usrid $usr->getUsrid();
  1262.                 $usrdatddechg $usr->getUsrdatddechgpwd();        // int contenant la date/heure de demande
  1263.                 $letemps time();
  1264.                 $hier time()-(3600*24);
  1265.                 if($usrdatddechg $hier){    // after time : chgt avant 24h max
  1266.                     $this->get('session')->getFlashBag()->add(
  1267.                         'Erreur',
  1268.                         'Le délai de validité de votre demande de changement de mot de passe (24h) est dépassé depuis le '.date('d/m/Y H:i',$usrdatddechg).'. Veuillez refaire une demande de changement de mot de passe. (tim)'
  1269.                     );
  1270.                     return $this->render('default\noway.html.twig', array(
  1271.                     ));
  1272.                     
  1273.                 }else{  // tout ok, affichage page saisie / modif pwd 
  1274.                     return $this->render('usr\pwdmodif.html.twig'
  1275.                         array(
  1276.                             'tok' => $_GET['tok'],
  1277.                             'missens' => ($usrid 117),        // brouiller
  1278.                             'msgcplt' => '',
  1279.                         )
  1280.                     );
  1281.                 }
  1282.             }
  1283.         }
  1284.     }
  1285.     
  1286.     // confirmation changement mot de passe, vérifications diverses
  1287.     #[Route(path'/cpwd'name'motdpasseconf')]
  1288.     public function pwdconf
  1289.         (
  1290.             Request $request
  1291.             ManagerRegistry $doctrine,
  1292.             LOGDEFService $logdefservice,
  1293.             UserPasswordHasherInterface $passwordHasher
  1294.         ): Response
  1295.     {
  1296.         
  1297.         // modif pwd confirmée
  1298.         $flagok true;
  1299.         //var_dump($request);
  1300.         // vérifs diverses : token ok, missens ok, pwd a et b ok
  1301.         if( (!isset($_POST['_csrf_token'])) || (!isset($_POST['_missens'])) || (!is_numeric($_POST['_missens'])) || ($_POST['_mpwdb']!=$_POST['_mpwda']) ){
  1302.             $flagok false;
  1303.         }
  1304.         
  1305.         if($flagok == false){   // problème
  1306.             $this->get('session')->getFlashBag()->add(
  1307.                 'Erreur',
  1308.                 'La page demandée n\'existe pas ! (pb)'
  1309.             );
  1310.             return $this->render('default\noway.html.twig', array());        
  1311.             
  1312.         }else{  // ok à priori
  1313.             // var_dump($_POST);
  1314.             $em $doctrine->getManager();
  1315.             $usrid = ($_POST['_missens'] / 117);      // voir unptipeupluo
  1316.             $usr $em->getRepository(usr::class)->findOneBy(array('usrchgpwdtok'=>$_POST['_csrf_token'], 'usrid'=>$usrid));
  1317.             if($usr == null){  // bad couple token/usrid
  1318.                 $this->get('session')->getFlashBag()->add(
  1319.                     'Erreur',
  1320.                     'La page demandée n\'existe pas ! (bdt)'
  1321.                 );
  1322.                 return $this->render('default\noway.html.twig', array());        
  1323.                 
  1324.             }else{  // tok + usrid ok, vérif longueur des pwd et contenus retour login après màj ou non
  1325.                 $pwdok $this->usrservice->verif_pwd_usr($_POST['_mpwda']); 
  1326.                 if(($_POST['_mpwda'] != $_POST['_mpwdb']) || ($pwdok==false)){
  1327.                     $this->get('session')->getFlashBag()->add(
  1328.                         'Erreur',
  1329.                         'Votre mot de passe ne répond pas aux conditions de sécurité requises (ab)'
  1330.                     );
  1331.                     return $this->render('security/login.html.twig'
  1332.                         array(
  1333.                             'last_username' => '',
  1334.                             'error' => ''
  1335.                         )
  1336.                     );
  1337.                 
  1338.                 }else{        // tout ok, validation nouv pwd
  1339.                     
  1340.                     $usrdatchgpwd = new \DateTime();
  1341.                     $usrdatchgpwd->createFromFormat("Y-m-d H:i:s"time());
  1342.                     
  1343.                     $hashedPassword $passwordHasher->hashPassword(
  1344.                         $usr,
  1345.                         $_POST['_mpwda']
  1346.                     );
  1347.                     $usr->setPassword($hashedPassword);
  1348.                     $usr->setUsrchgpwdtok(null);
  1349.                     $usr->setUsrdatddechgpwd(null);
  1350.                     $usr->setUsrdatchgpwd($usrdatchgpwd);
  1351.                     $em->persist($usr);
  1352.                     $em->flush();
  1353.                     
  1354.                     $this->get('session')->getFlashBag()->add(
  1355.                         'Succès',
  1356.                         'Votre mot de passe a été modifié avec succès'
  1357.                     );
  1358.                     // a) les infobulles fusion de la page
  1359.                     // $lesdefs = array('ppi','mod','pro','eau','pfi','lis','mev');
  1360.                     $lesdefs = array('ppi','mod','pro','pli');
  1361.                     $deflog = array();
  1362.                     foreach($lesdefs as $ladef){
  1363.                         $deflog[$ladef] = $logdefservice->get_unedef($ladef); 
  1364.                     }
  1365.                     return $this->render('security/login.html.twig'
  1366.                         array(
  1367.                             'last_username' => '',
  1368.                             'error' => '',
  1369.                             'deflog' => $deflog
  1370.                         )
  1371.                     );
  1372.                     
  1373.                 }
  1374.             }
  1375.         }
  1376.     }
  1377.     // EMAILING'S ============================================
  1378.     // TODO : Vérifier fonctionnement (31/07/24)
  1379.     // Expédition d'un mailing pour changement de pwd obligatoire
  1380.     // envoi à tous les usr dont usrdatchgpwd < date jour -1 an ou vide
  1381.     #[Route(path'/mailchgpwd'name'envmailddechgpwd')]
  1382.     public function pwdchgoblig
  1383.         (
  1384.             Request $request
  1385.             ManagerRegistry $doctrine
  1386.         ): Response
  1387.     {
  1388.         $em $doctrine->getManager();
  1389.         $user $this->getUser();
  1390.         
  1391.         $lstadmin $this->divservice->getIdAdmin();
  1392.         if(($user != null)&&(in_array($user->getUsrid(), $lstadmin))){       // seuls les admin
  1393.        
  1394.             $search_now time();
  1395.             $datchglimit date('Y-m-d'mktime(0,0,0,date('m'$search_now),date('d'$search_now),date('Y'$search_now)-1));
  1396.             $nbmailenvoyes 0;
  1397.             // préparation du mèl
  1398.             $mailaenv = array();
  1399.             $mailaenv['sujet'] = "[Rural Consult] Renouvellement de votre mot de passe Collectiv'Finances";
  1400.             $mailaenv['titre'] = "[Rural Consult] Renouvellement de votre mot de passe";
  1401.             $mailaenv['expediteur_nom'] = "Assistance technique Rural Consult";
  1402.             $mailaenv['expediteur_email'] = "assistance.technique@solidaires.com";            // TODO à modifier
  1403.             $mailaenv['destinataire_nom'] = "";
  1404.             $mailaenv['destinataire_email'] = "";
  1405.             $mailaenv['fichiers'] = array();                    // les fichiers joints
  1406.             //$mailaenv['fichiers'][0] = array();               // 1° fichier à joindre  => pas de documents joints
  1407.             //$mailaenv['fichiers'][0]['chemin_fichier'] = "";
  1408.             //$mailaenv['fichiers'][0]['nom_fichier'] = "";
  1409.             //$mailaenv['fichiers'][0]['nom_orig'] = "";
  1410.             $mailaenv['cc'] = '';           // pas de copie ici
  1411.             $destinataire_nom_bcc "Assistance technique Rural Consult";    
  1412.             $destinataire_email_bcc "assistance.technique@solidaires.com";    
  1413.             $mailaenv['bcc'] = array($destinataire_email_bcc => $destinataire_nom_bcc);
  1414.             $urllogo $this->parambag->get('img_path')."entet_email_cf.webp";
  1415.             $web_path $this->parambag->get('web_path');
  1416.             
  1417.             // à effectuer en N fois 
  1418.             // requête préalable : UPDATE `cdc`.`usr` SET `usrdatenvchgpwd` = NULL, `usrchgpwdtok` = NULL
  1419.             $query $em->getRepository(usr::class)->createQueryBuilder('usr'); 
  1420.             $query
  1421.                 ->select('usr')
  1422.                 ->where($query->expr()->orX(
  1423.                        $query->expr()->lte('usr.usrchgpwdtok'':datchglimit'),          // pwd pas changé depuis limit
  1424.                        $query->expr()->isNull('usr.usrchgpwdtok'),
  1425.                        $query->expr()->eq('usr.usrchgpwdtok'':valzero')
  1426.                    ))            
  1427.                 ->setParameter('datchglimit' $datchglimit)
  1428.                 ->setParameter('valzero' null)
  1429.                 // ->andwhere('usr.usrid >= :usrid_mini')                                  
  1430.                 // ->andwhere('usr.usrid <= :usrid_maxi')
  1431.                 // ->setParameter('usrid_mini' , 3051)                     // 3246 limite max, éviter 3150 lhostis
  1432.                 // ->setParameter('usrid_maxi' , 3149)                     // 3149 16/10 - 3050 08/10 - 2950 30/08 23:04 - 2800 30/08 11:45 - 2600 27/08 13:22
  1433.                 // ->andwhere('usr.usrdatlog IS NULL')                     // A SUPPRIMER une fois les mails envoyés
  1434.                 //->andwhere('usr.usrdatenvchgpwd IS NULL')     // A REACTIVER une fois les mails envoyés
  1435.                 //->andwhere('usr.USRCHGPWDTOK IS NULL')         // A REACTIVER une fois les mails envoyés
  1436.                 ->orderBy('usr.usrdatcre''ASC')
  1437.             ;
  1438.             $utilisateurs $query->getQuery()->getResult();
  1439.             $nb_usr count($utilisateurs);
  1440.             
  1441.             if(count($utilisateurs)>0){
  1442.                 foreach($utilisateurs as $usr){
  1443.                     $nombr_alea rand().'cdc'.rand().'fc';
  1444.                     $mailaenv['destinataire_nom'] = "";
  1445.                     $mailaenv['destinataire_email'] = $usr->getUsremail();
  1446.                     
  1447.                     // texte du mail
  1448.                     $bodymail "<div style='width:680px;margin:0 auto;'>";
  1449.                     $bodymail.= "<img style='width:680px;height:58px;border:none' src='".$urllogo."'>";
  1450.                     $bodymail.= "<div style='width:677px;text-align:left;font-size:12px Arial, Helvetica, sans-serif;color:#414141;border:1px solid #ff0000;overflow:hidden;'>";
  1451.                     $bodymail.= "<p style='padding:20px 10px;'>Bonjour <b>".$usr->getUsrpre()." ".$usr->getUsrnom()."</b>,<br />&nbsp;<br />";
  1452.                     $bodymail.= "Vous avez ouvert un compte « Solidaires » le ".$usr->getUsrdatcre()->format("d/m/Y").".<br />";
  1453.                     $bodymail.= "Nous réinstallons désormais cette application dans un nouvel environnement, intégrant le nouveau règlement européen sur la protection des données (RGPD) en vigueur.<br />";
  1454.                     $bodymail.= "Ces nouvelles règles modifient directement la gestion des mots de passe : ainsi, lors de votre prochaine connexion, l’application vous guidera à travers une procédure automatique de changement de votre mot de passe.<br />";
  1455.                     $bodymail.= "En l'absence de renouvellement de votre mot de passe dans les 30 jours, nous procéderons à la suppression de votre compte utilisateur et de vos données saisies d'une antériorité supérieure à 3 ans.<br />";
  1456.                     $bodymail.= "Cliquez sur le lien ci-après pour modifier votre mot de passe dès maintenant : <a href=";
  1457.                     $bodymail.= $web_path."mpwd?ie=UTF8&tok=".$nombr_alea.">Lien pour la réinitialisation de votre mot de passe valable 24 heures</a><br />&nbsp;<br />";
  1458.                     $bodymail.= "Si vous rencontrez des difficultés pour changer de mot de passe, veuillez nous envoyer un courriel à l'adresse suivante : <a href='mailto:assistance.technique@solidaires.com' title='Assistance technique Rural Consult'>assistance.technique@solidaires.com.</a><br / >&nbsp;<br />";
  1459.                     $bodymail.= "<br />&nbsp;<br />";
  1460.                     
  1461.                     $bodymail.= "Collectiv'Finances vous propose des outils d'analyse financière dédiés aux communes et collectivités locales.<br />";
  1462.                     $bodymail.= "Nous vous informons que Collectiv'Finances s’est enrichi d’un nouvel outil : la modélisation financière de projet.<br />";
  1463.                     $bodymail.= "Espérant que ce nouvel outil vous sera utile, nous restons à votre disposition pour toute information supplémentaire.<br />&nbsp;<br />";
  1464.                     $bodymail.= "<i><span style='font-weight: 600;color:#0ea210;'>Important</span> : Rural Consult ne vous enverra jamais un courriel vous demandant d'indiquer votre mot de passe.</i><br />&nbsp;<br />";
  1465.                     $bodymail.= "<span style='font-weight: 600;'>Rural Consult</strong><br />";
  1466.                     $bodymail.= "<span style='font-weight: 600;color:#ff0000;'>Banque des Territoires - Caisse des Dépôts</span><br />&nbsp;<br />";
  1467.                     $bodymail.= "</p></div>";
  1468.                     $bodymail.= "<div style='width:679px;height:20px;text-align:center;background:#ff0000;font-size:12px Arial, Helvetica, sans-serif;color:#fff;'>";
  1469.                     $bodymail.= "Rural Consult © Tous droits réservés</div>";
  1470.                     $bodymail.= "</div>";
  1471.                     $mailaenv['body'] = $bodymail;
  1472.                     
  1473.                     $unmess $this->meylerservice->envoidunmail('reinitialisation mot de passe',$mailaenv);     // envoi
  1474.                     
  1475.                     $nbmailenvoyes++;
  1476.                     $usrdatenvchgpwd = new \DateTime();
  1477.                     $usrdatenvchgpwd->createFromFormat("Y-m-d H:i:s"time());
  1478.                     
  1479.                     // Enregistrement en bdd
  1480.                     $usr->setUsrchgpwdtok($nombr_alea);
  1481.                     $usr->setUsrdatddechgpwd(time());
  1482.                     $usr->setUsrdatenvchgpwd($usrdatenvchgpwd);
  1483.                     $em->persist($usr);     // TODO à activer en PROD
  1484.                     $em->flush();             // TODO à activer en PROD
  1485.                 }
  1486.                 
  1487.                 $this->get('session')->getFlashBag()->add(
  1488.                     'Succès',
  1489.                     $nbmailenvoyes.' mails envoyés. Nb utilisateurs sélect : '.$nb_usr
  1490.                 );
  1491.                 
  1492.             }else{
  1493.                 
  1494.                 $this->get('session')->getFlashBag()->add(
  1495.                     'Succès',
  1496.                     'Aucun utilisateur sélectionné, aucun courriel à envoyer.'
  1497.                 );
  1498.                 
  1499.             }
  1500.             return $this->redirect($this->generateUrl('pageaccueil'));                    
  1501.         
  1502.         }else{      // erreur réservé admin
  1503.             $this->get('session')->getFlashBag()->add(
  1504.                 'Erreur',
  1505.                 'La page demandée n\'existe pas ! (adm)'
  1506.             );
  1507.             // Affichage page inexistante
  1508.             return $this->render('default\noway.html.twig', array(
  1509.             ));        
  1510.         }
  1511.     
  1512.     }
  1513.     // TODO : à revoir, vérifier fonctionnement (31/07/24)
  1514.     // Envoi mailing à tous les usr => info EXCEL dans PROSPER et MODELICO
  1515.     #[Route(path'/mailgraph'name'envmailgraph')]
  1516.     public function mailgraph(Request $requestManagerRegistry $doctrine): Response
  1517.     {
  1518.         $em $doctrine->getManager();
  1519.         $user $this->getUser();
  1520.         
  1521.         $lstadmin $this->divservice->getIdAdmin();
  1522.         if(($user != null)&&(in_array($user->getUsrid(), $lstadmin))){       // seuls les admin
  1523.         
  1524.             $nbmailenvoyes 0;
  1525.             $mailaenv = array();
  1526.             $mailaenv['sujet'] = "[Rural Consult] Collectiv'Finance : Les outils financiers";
  1527.             $mailaenv['titre'] = "[Rural Consult] Collectiv'Finance : Les outils financiers";
  1528.             $mailaenv['expediteur_nom'] = "Collectiv'Finance Infos";
  1529.             $mailaenv['expediteur_email'] = "solidaires@solidaires.com";                    // TODO à modifier
  1530.             $mailaenv['destinataire_nom'] = "";
  1531.             $mailaenv['destinataire_email'] = "";
  1532.             $mailaenv['fichiers'] = array();                    // les fichiers joints
  1533.             $mailaenv['fichiers'][0] = array();               // 1 fichier à joindre
  1534.             $mailaenv['fichiers'][0]['chemin_fichier'] = $this->get('kernel')->getRootDir(). "/../web/doc/help/";
  1535.             $mailaenv['fichiers'][0]['nom_fichier'] = "guide-tableau-financier.pdf";
  1536.             $mailaenv['fichiers'][0]['nom_orig'] = "guide-tableau-financier.pdf";
  1537.             $mailaenv['cc'] = '';           // pas de copie ici
  1538.             $destinataire_nom_bcc "Assistance technique Rural Consult";    
  1539.             $destinataire_email_bcc "assistance.technique@solidaires.com";    
  1540.             $mailaenv['bcc'] = array($destinataire_email_bcc => $destinataire_nom_bcc);
  1541.             $graph_b $this->parambag->get('img_path')."graph_b.jpg";
  1542.             $graph_c $this->parambag->get('img_path')."graph_c.jpg";
  1543.             $urllogo $this->parambag->get('img_path')."entet_email_cf.webp";
  1544.             $web_path $this->parambag->get('web_path');
  1545.             
  1546.             $search_now time();
  1547.             $datcremax date('Y-m-d'mktime(0,0,0,date('m'$search_now),date('d'$search_now)-8,date('Y'$search_now)));
  1548.             
  1549.             // à effectuer en N fois 
  1550.             $query $em->getRepository(usr::class)->createQueryBuilder('usr'); 
  1551.             $query
  1552.                 ->select('usr')
  1553.                 ->where('usr.usrdatenvchgpwd IS NULL')
  1554.                 ->andwhere('usr.usrdatcre < :datcremax')
  1555.                 ->setParameter('datcremax' ,$datcremax)
  1556.                 ->andwhere('usr.usrid IN (11)')               // pour se limiter un peu...
  1557.                 ->orderBy('usr.usrid''DESC')
  1558.             ;
  1559.             $utilisateurs $query->getQuery()->getResult();
  1560.             $nb_usr count($utilisateurs);
  1561.             
  1562.             if($nb_usr>0){
  1563.                 $k=0;
  1564.                 foreach($utilisateurs as $usr){
  1565.                     $k++;
  1566.                     
  1567.                     if($k<=30){ // par paquet
  1568.                     
  1569.                         $mailaenv['destinataire_nom'] = "";
  1570.                         $mailaenv['destinataire_email'] = $usr->getUsremail();
  1571.                         
  1572.                         // texte du mail
  1573.                         $bodymail "<div style='width:750px;margin:0 auto;'>";
  1574.                         $bodymail.= "<img style='width:750;height:64px;border:none' src='".$urllogo."'>";
  1575.                         $bodymail.= "<div style='width:747px;text-align:left;font-size:12px Arial, Helvetica, sans-serif;color:#414141;border:1px solid #4f8eaf;overflow:hidden;'>";
  1576.                         $bodymail.= "<p style='padding:20px 10px;'>Bonjour <b>".$usr->getUsrpre()." ".$usr->getUsrnom()."</b>,<br />&nbsp;<br />";
  1577.                         $bodymail.= "notre site « <a href=".$this->parambag->get('web_path')."><b>Solidaires</b></a> » met à la disposition des communes et intercommunalités des outils simplifiés d'analyse financière permettant de simuler le calcul des indicateurs retenus pour la contractualisation (loi de programmation des finances publiques du 22/01/2018).";
  1578.                         $bodymail.= "<br />&nbsp;<br />";
  1579.                         $bodymail.= "Il vous est proposé : <br />";
  1580.                         $bodymail.= " - un tableau d'analyse rétro/prospective <b>« PROSPER »</b> qui reprend de façon détaillée (fonctionnement et investissement) l'ensemble des agrégats financiers utiles à l'analyse,<br />";
  1581.                         $bodymail.= " - un tableau plus synthétique <b>« MODELICO »</b> mesurant l'impact prospectif d'un nouvel emprunt sur les indicateurs de solvabilité de la collectivité (épargne de gestion, épargne brute, épargne nette, autofinancement, capacité de désendettement - CAPDES…).";
  1582.                         $bodymail.= "<br />&nbsp;<br />";
  1583.                         $bodymail.= "A partir de vos données, « <a href=".$this->parambag->get('web_path')."><b>Solidaires</b></a> » vous permet désormais d'obtenir instantanément la représentation graphique des indicateurs principaux .";
  1584.                         $bodymail.= "<br />&nbsp;<br />";
  1585.                         $bodymail.= "<img style='width:550px;height:240px;' src='".$graph_b."'>";
  1586.                         $bodymail.= "<br />&nbsp;<br />";
  1587.                         $bodymail.= "<img style='width:550px;height:240px;' src='".$graph_c."'>";
  1588.                         $bodymail.= "<br />&nbsp;<br />";
  1589.                         $bodymail.= "« <a href=".$this->parambag->get('web_path')."><b>Solidaires</b></a> » vous proposera progressivement d'autres graphiques. <b>Faites-nous part de vos suggestions.</b>";
  1590.                         $bodymail.= "<br />&nbsp;<br />";
  1591.                         $bodymail.= "Vous pouvez dès maintenant les utiliser en vous connectant à « <a href=".$this->parambag->get('web_path')."><b>Solidaires</b></a> ».<br / >&nbsp;<br />";
  1592.                         $bodymail.= "Votre identifiant est : <span style='color:#ff0000;font-weight: 600;'>".$usr->getUsername()."</span><br />  Avec votre identifiant, vous retrouverez vos simulations saisies précédemment.<br / >&nbsp;<br />";
  1593.                         $bodymail.= "Si vous rencontrez des difficultés pour vous connecter, veuillez nous envoyer un courriel à l'adresse suivante : <a href='mailto:assistance.technique@solidaires.com' title='Assistance technique Rural Consult'>assistance.technique@solidaires.com</a>.<br />";
  1594.                         $bodymail.= "Nous restons à votre disposition pour toute information complémentaire.";
  1595.                         $bodymail.= "<br />&nbsp;<br />";
  1596.                         
  1597.                         $bodymail.= "<strong>Caisse des Dépôts<br />";
  1598.                         $bodymail.= "Service Rural Consult</strong><br />";
  1599.                         $bodymail.= "<div style='font-size:11px;'>";
  1600.                         $bodymail.= "&nbsp;Vous avez ouvert un compte « Solidaires » le ".$usr->getUsrdatcre()->format("d/m/Y").".<br />";
  1601.                         $bodymail.= "</div>";
  1602.                         $bodymail.= "</p></div>";
  1603.                         $bodymail.= "<div style='width:750px;height:20px;text-align:center;background:#4f8eaf;font-size:12px Arial, Helvetica, sans-serif;color:#fff;'>";
  1604.                         $bodymail.= "Rural Consult © Tous droits réservés</div>";
  1605.                         $bodymail.= "</div>";
  1606.                         $bodymail.= "<br />&nbsp;<br />";
  1607.                         $mailaenv['body'] = $bodymail;
  1608.                         
  1609.                         /* inactiv19
  1610.                         $unmess = $this->meylerservice->envoidunmail('solidaires infos',$mailaenv);     // envoi
  1611.                         
  1612.                         $nbmailenvoyes++;
  1613.                         $usrdatenvchgpwd = new \DateTime();
  1614.                         $usrdatenvchgpwd->createFromFormat("Y-m-d H:i:s", time());
  1615.                         // Enregistrement en bdd
  1616.                         $usr->setUsrchgpwdtok(null);
  1617.                         $usr->setUsrdatddechgpwd(null);
  1618.                         $usr->setUsrdatenvchgpwd($usrdatenvchgpwd);
  1619.                         $em->persist($usr);     // TODO à activer en PROD
  1620.                         $em->flush();             // TODO à activer en PROD
  1621.                         */
  1622.                     }
  1623.                 }
  1624.                 
  1625.                 $this->get('session')->getFlashBag()->add(
  1626.                     'Succès',
  1627.                     $nbmailenvoyes.' mails envoyés. Nb utilisateurs sélect : '.$nb_usr
  1628.                 );
  1629.                 
  1630.             }else{
  1631.                 
  1632.                 $this->get('session')->getFlashBag()->add(
  1633.                     'Succès',
  1634.                     'Aucun utilisateur sélectionné, aucun courriel à envoyer.'
  1635.                 );
  1636.                 
  1637.             }
  1638.             return $this->redirect($this->generateUrl('pageaccueil'));                    
  1639.         
  1640.         }else{      // erreur réservé admin
  1641.             $this->get('session')->getFlashBag()->add(
  1642.                 'Erreur',
  1643.                 'La page demandée n\'existe pas ! (adm)'
  1644.             );
  1645.             // Affichage page inexistante
  1646.             return $this->render('default\noway.html.twig', array(
  1647.             ));        
  1648.         }
  1649.     
  1650.     }
  1651.     
  1652.     // TODO : à revoir, vérifier fonctionnement (31/07/24)
  1653.     // Annonce ISBA, envoi à tous les usr
  1654.     #[Route(path'/mailisba'name'envmailisba')]
  1655.     public function mailisba
  1656.         (
  1657.             Request $request
  1658.             ManagerRegistry $doctrine
  1659.         ): Response
  1660.     {
  1661.         $em $doctrine->getManager();
  1662.         $user $this->getUser();
  1663.         
  1664.         $lstadmin $this->divservice->getIdAdmin();
  1665.         if(($user != null)&&(in_array($user->getUsrid(), $lstadmin))){       // seuls les admin
  1666.         
  1667.             $nbmailenvoyes 0;
  1668.             $mailaenv = array();
  1669.             $mailaenv['sujet'] = "[Rural Consult] Solidaires : les outils financiers";
  1670.             $mailaenv['titre'] = "[Rural Consult] Solidaires : les outils financiers";
  1671.             $mailaenv['expediteur_nom'] = "Solidaires Infos";
  1672.             $mailaenv['expediteur_email'] = "solidaires@solidaires.com";
  1673.             $mailaenv['destinataire_nom'] = "";
  1674.             $mailaenv['destinataire_email'] = "";
  1675.             $mailaenv['fichiers'] = array();                    // les fichiers joints
  1676.             $mailaenv['cc'] = '';           // pas de copie ici
  1677.             $destinataire_nom_bcc "Assistance technique Rural Consult";    
  1678.             $destinataire_email_bcc "assistance.technique@solidaires.com";    
  1679.             $mailaenv['bcc'] = array($destinataire_email_bcc => $destinataire_nom_bcc);
  1680.             //$mailaenv['bcc'] = '';      // test, alors inutile
  1681.             $urllogo $this->parambag->get('img_path')."entet_email_cf.webp";
  1682.             $logotc $this->parambag->get('img_path')."logo_tc.jpg";
  1683.             $logoisba $this->parambag->get('img_path')."isba_elen_mel.png";
  1684.             $logomodelico $this->parambag->get('img_path')."modelico.png";
  1685.             $logoprosper $this->parambag->get('img_path')."prosper_mel.png";
  1686.             $logomeven $this->parambag->get('img_path')."mev_m_mel.png";
  1687.             
  1688.             $web_path $this->parambag->get('web_path');
  1689.             
  1690.             $search_now time();
  1691.             $datcremax date('Y-m-d'mktime(0,0,0,date('m'$search_now),date('d'$search_now)-4,date('Y'$search_now)));
  1692.             
  1693.             // à effectuer en N fois 
  1694.             $query $em->getRepository(usr::class)->createQueryBuilder('usr'); 
  1695.             $query
  1696.                 ->select('usr')
  1697.                 ->where('usr.usrdatisb IS NULL')
  1698.                 ->andwhere('usr.usrdatcre < :datcremax')
  1699.                 ->setParameter('datcremax' ,$datcremax)
  1700.                 //->andwhere('usr.usrid <= 347')               // pour se limiter un peu... 179 SJA
  1701.                 ->orderBy('usr.usrid''ASC')
  1702.             ;
  1703.             $utilisateurs $query->getQuery()->getResult();
  1704.             $nb_usr count($utilisateurs);
  1705.             
  1706.             if($nb_usr>0){
  1707.                 $k=0;
  1708.                 foreach($utilisateurs as $usr){
  1709.                     $k++;
  1710.                     
  1711.                     if($k<=100){ // par paquet
  1712.                     
  1713.                         $mailaenv['destinataire_nom'] = "";
  1714.                         $mailaenv['destinataire_email'] = $usr->getUsremail();              // TODO à activer en PROD
  1715.                         //$mailaenv['destinataire_email'] = "didier.pfennig@free.fr";       // TODO à désactiver en PROD
  1716.                         //style="color:#0075ae; padding-top:150px; padding-bottom:0px; padding-left:0px; padding-right:0px;">
  1717.                         //mailisba
  1718.                         // texte du mail
  1719.                         $bodymail '<div style="width:750px;margin:0 auto;">';
  1720.                             $bodymail.= '<img style="width:750;height:64px;border:none" src="'.$urllogo.'">';
  1721.                             $bodymail.= '<div style="width:747px;text-align:left;font-size:12px Arial, Helvetica, sans-serif;color:#414141;border:1px solid #4f8eaf;overflow:hidden;">';
  1722.                     
  1723.                                 $bodymail.= '<p style="padding-left:10px; padding-right:10px;"><b>Madame, Monsieur,</b></p>';
  1724.                                 $bodymail.= '<p style="padding-left:10px; padding-right:10px;text-align: justify;">';
  1725.                                     $bodymail.= 'vous êtes utilisatrice / utilisateur des outils d’analyse financière, sur le site de &laquo; <a href='.$this->parambag->get("web_path").'><b>Solidaires</b></a>&raquo;, développés par Rural Consult, un service de la Banque des Territoires de la Caisse des dépôts.';
  1726.                                 $bodymail.= '</p>';
  1727.                                 $bodymail.= '<br />';
  1728.                                 $bodymail.= '<table width="100%">';
  1729.                                     $bodymail.= '<tr>';
  1730.                                         $bodymail.= '<td width="5%">';
  1731.                                             $bodymail.= '<img style="width:45px;height:45px;" src="'.$logoisba.'">';
  1732.                                                 $bodymail.= '<br />&nbsp;<br />';
  1733.                                                 $bodymail.= '<br />&nbsp;<br />';
  1734.                                         $bodymail.= '</td>';
  1735.                                         $bodymail.= '<td width="95%">';
  1736.                                             $bodymail.= '<p style="font-size:15px;padding-left:10px; padding-right:10px;text-align: justify;">';
  1737.                                                 $bodymail.= 'Nous mettons en ligne <span style="color:#ff0000;font-weight: 600;">une nouvelle application &laquo; ISBA - Impact Simplifié d\'un investissement sur le Budget annexe Eau / Assainissement &raquo;</span> pour :<br />';
  1738.                                             $bodymail.= '</p>';
  1739.                                             $bodymail.= '<ul>';
  1740.                                                 $bodymail.= '<li>Simuler l\'impact théorique d\'un investissement (PPI) sur le prix de l\'eau et la redevance d\'assainissement<l/i>';
  1741.                                                 $bodymail.= '<li>Déterminer le montant d\'emprunts nécessaires à l\'équilibre des comptes,</li>';
  1742.                                                 $bodymail.= '<li>Calculer la nouvelle annuité de dette,</li>';
  1743.                                                 $bodymail.= '<li>Moduler l\'augmentation théorique des tarifs dans l\'onglet &laquo; impact choisi &raquo; pour en voir les conséquences sur 6 années de prospective financière,</li>';
  1744.                                                 $bodymail.= '<li>Visualiser les principaux résultats sous forme de graphiques</li>';
  1745.                                             $bodymail.= '</ul>';
  1746.                                             $bodymail.= '<p style="font-size:15px;padding-left:10px; padding-right:10px;text-align: justify;">';
  1747.                                                 $bodymail.= 'L\'application <b>&laquo; ISBA &raquo;</b> contient également <span style="color:#ff0000;font-weight: 600;">un guide utilisateur détaillant les formules de calcul, un bouton &laquo; Nous écrire &raquo; et un jeu de graphiques exportables (avec leurs données chiffrées) en format Excel</span>.';
  1748.                                                 $bodymail.= '<br />&nbsp;<br />';
  1749.                                                 $bodymail.= 'La saisie de données est souvent une étape difficile à franchir ... ! Nous vous donnons accès à une <i><b>simulation exemple</b></i> modifiable permettant de visualiser et tester immédiatement les possibilités offertes par <b>&laquo; ISBA &raquo;</b>.';
  1750.                                                 $bodymail.= '<br />&nbsp;<br />';
  1751.                                             $bodymail.= '</p>';
  1752.                                         $bodymail.= '</td>';
  1753.                                     $bodymail.= '</tr>';
  1754.                                     $bodymail.= '<tr>';
  1755.                                         $bodymail.= '<td width="5%">';
  1756.                                             $bodymail.= '<img style="width:35px;height:35px;padding-left:5px;" src="'.$logomodelico.'"><br />&nbsp;<br />';
  1757.                                             $bodymail.= '<img style="width:35px;height:35px;padding-left:5px;" src="'.$logoprosper.'">';
  1758.                                             $bodymail.= '<br />&nbsp;<br />';
  1759.                                         $bodymail.= '</td>';
  1760.                                         $bodymail.= '<td width="95%">';
  1761.                                             $bodymail.= '<p style="font-size:15px;padding-left:10px; padding-right:10px;text-align: justify;">';
  1762.                                                 $bodymail.= 'Ces <i><b>simulations exemple</b></i> existent aussi pour les tableaux financiers, ainsi que les graphiques exportables pour &laquo; <b>MODELICO &raquo;</b> et des éditions (pdf) pour <b>&laquo; PROSPER &raquo;</b>. Il est également possible d’obtenir sur simple demande un tableau de calcul sous Excel.';
  1763.                                             $bodymail.= '</p>';
  1764.                                         $bodymail.= '</td>';
  1765.                                     $bodymail.= '</tr>';
  1766.                                     $bodymail.= '<tr>';
  1767.                                         $bodymail.= '<td width="5%">';
  1768.                                             $bodymail.= '<img style="width:35px;height:35px;padding-left:5px;" src="'.$logomeven.'">';
  1769.                                         $bodymail.= '</td>';
  1770.                                         $bodymail.= '<td width="95%">';
  1771.                                             $bodymail.= '<p style="font-size:15px;padding-left:10px; padding-right:10px;text-align: justify;">';
  1772.                                                 $bodymail.= '&laquo; <b>Solidaires</b> &raquo; vous permet également d\'accéder à l\'application <span style="color:#247aa1;font-weight: 600;">&laquo; Manifestations Evénementiels &raquo; réalisée par la ville de ERAGNY sur OISE</span> pour évaluer <span style="color:#247aa1;font-weight: 600;">le coût d\'une manifestation (culturelle, sportive...) ou d\'un dispositif mis en place par les collectivités</span>.<br />';
  1773.                                                 $bodymail.= 'En page d\'accueil de &laquo; <a href='.$this->parambag->get("web_path").'><b>Solidaires</b></a>&raquo; vous pourrez faire une demande de téléchargement de cet outil (tableur Excel) et entrer en contact avec les créateurs de cet outil.';
  1774.                                             $bodymail.= '</p>';
  1775.                                         $bodymail.= '</td>';
  1776.                                     $bodymail.= '</tr>';
  1777.                                 $bodymail.= '</table>';
  1778.                                 $bodymail.= '<br />';
  1779.                                 
  1780.                                 $bodymail.= '<p style="padding-left:10px; padding-right:10px;text-align: justify;">';
  1781.                                     $bodymail.= 'Vous pouvez dès maintenant utiliser ces outils en vous connectant à &laquo; <a href='.$this->parambag->get("web_path").'><b>Solidaires</b></a> &raquo;.<br / >';
  1782.                                     $bodymail.= 'Votre identifiant est : <span style="color:#ff0000;font-weight: 600;">'.$usr->getUsername().'</span>';
  1783.                                     $bodymail.= '&nbsp;&nbsp;Avec votre identifiant, vous retrouverez vos simulations saisies précédemment.';
  1784.                                     $bodymail.= '<br />&nbsp;<br />';
  1785.                                     $bodymail.= 'Si vous rencontrez des difficultés pour vous connecter, veuillez nous envoyer un courriel à l\'adresse suivante : <a href="mailto:assistance.technique@solidaires.com" title="Assistance technique Rural Consult">assistance.technique@solidaires.com</a>.';
  1786.                                     $bodymail.= '<br />&nbsp;<br />';
  1787.                                     $bodymail.= 'Nous restons à votre disposition pour toute autre information.';
  1788.                                     $bodymail.= '<br />&nbsp;<br />';
  1789.                                     $bodymail.= '<span style="color:#ff0000;font-weight: 600;">Damien CHRISTIANY</span><br />';
  1790.                                     $bodymail.= '<span style="color:#6c6c6c;font-weight: 600;">Direction du Réseau et des Territoires</span><br />';
  1791.                                     $bodymail.= 'Rural Consult<br />';
  1792.                                     $bodymail.= '72 av. Pierre Mendès France Paris 75914 cedex 13<br />';
  1793.                                     $bodymail.= '<br />&nbsp;<br />';
  1794.                                 $bodymail.= '</p>';
  1795.                                 
  1796.                                 $bodymail.= '<div style="font-size:11px;">';
  1797.                                     $bodymail.= '&nbsp;Vous avez ouvert un compte « Solidaires » le '.$usr->getUsrdatcre()->format('d/m/Y').'.<br />';
  1798.                                 $bodymail.= '</div>';
  1799.                             $bodymail.= '</div>';
  1800.                             $bodymail.= '<div style="width:750px;height:20px;text-align:center;background:#4f8eaf;font-size:12px Arial, Helvetica, sans-serif;color:#fff;">';
  1801.                                 $bodymail.= 'Rural Consult © Tous droits réservés';
  1802.                             $bodymail.= '</div>';
  1803.                             $bodymail.= '<br />&nbsp;<br />';
  1804.                         $bodymail.= '</div>';
  1805.                         $mailaenv['body'] = $bodymail;
  1806.                         
  1807.                         // $unmess = $this->meylerservice->envoidunmail('solidaires infos',$mailaenv);     // envoi
  1808.                         
  1809.                         $nbmailenvoyes++;
  1810.                         $usrdatisb = new \DateTime();
  1811.                         $usrdatisb->createFromFormat("Y-m-d H:i:s"time());
  1812.                         // Enregistrement en bdd
  1813.                         $usr->setusrdatisb($usrdatisb);
  1814.                         // $em->persist($usr);     // TODO à activer en PROD
  1815.                         // $em->flush();             // TODO à activer en PROD
  1816.                     
  1817.                     }
  1818.                 }
  1819.                 
  1820.                 $this->get('session')->getFlashBag()->add(
  1821.                     'Succès',
  1822.                     $nbmailenvoyes.' mails envoyés. Nb utilisateurs sélect : '.$nb_usr
  1823.                 );
  1824.                 
  1825.             }else{
  1826.                 
  1827.                 $this->get('session')->getFlashBag()->add(
  1828.                     'Succès',
  1829.                     'Aucun utilisateur sélectionné, aucun courriel à envoyer.'
  1830.                 );
  1831.                 
  1832.             }
  1833.             return $this->redirect($this->generateUrl('pageaccueil'));                    
  1834.         
  1835.         }else{      // erreur réservé admin
  1836.             $this->get('session')->getFlashBag()->add(
  1837.                 'Erreur',
  1838.                 'La page demandée n\'existe pas ! (adm)'
  1839.             );
  1840.             // Affichage page inexistante
  1841.             return $this->render('default\noway.html.twig', array(
  1842.             ));        
  1843.         }
  1844.     
  1845.     }
  1846.     
  1847.     
  1848.     
  1849.     // TODO : à revoir, vérifier fonctionnement (31/07/24)
  1850.     // Annonce PPI, envoi à tous les usr (mailing 07/2022)
  1851.     #[Route(path'/mailppi'name'envmailppi')]
  1852.     public function mailppi
  1853.         (
  1854.             Request $request
  1855.             ManagerRegistry $doctrine
  1856.         ): Response
  1857.     {
  1858.         
  1859.         $em $doctrine->getManager();
  1860.         $user $this->getUser();
  1861.         
  1862.         $lstadmin $this->divservice->getIdAdmin();
  1863.         if(($user != null)&&(in_array($user->getUsrid(), $lstadmin))){       // seuls les admin
  1864.         
  1865.             $nbmailaexpedier 10;
  1866.             $nbmailenvoyes 0;
  1867.             $mailaenv = array();
  1868.             $mailaenv['sujet'] = "[Rural Consult] Solidaires : les nouveaux outils d'analyse financière";
  1869.             $mailaenv['titre'] = "[Rural Consult] Solidaires : les nouveaux outils d'analyse financière";
  1870.             $mailaenv['expediteur_nom'] = "Solidaires Infos";
  1871.             $mailaenv['expediteur_email'] = "solidaires@solidaires.com";
  1872.             $mailaenv['destinataire_nom'] = "";
  1873.             $mailaenv['destinataire_email'] = "";
  1874.             $mailaenv['fichiers'] = array();                    // les fichiers joints
  1875.             $mailaenv['cc'] = '';           // pas de copie ici
  1876.             $destinataire_nom_bcc "Assistance technique Rural Consult";    
  1877.             $destinataire_email_bcc "assistance.technique@solidaires.com";    
  1878.             $mailaenv['bcc'] = array($destinataire_email_bcc => $destinataire_nom_bcc);
  1879.             //$mailaenv['bcc'] = '';      // test, alors inutile
  1880.             $urllogo $this->parambag->get('img_path')."entet_email_cf.webp";
  1881.             $logotc $this->parambag->get('img_path')."logo_tc.jpg";
  1882.             
  1883.             $iconppi $this->parambag->get('img_path')."ppi.png";
  1884.             $iconmod $this->parambag->get('img_path')."mod.png";
  1885.             $iconpro $this->parambag->get('img_path')."pro.png";
  1886.             $iconisb $this->parambag->get('img_path')."isb.png";
  1887.             $iconpfi $this->parambag->get('img_path')."pfi.png";
  1888.             $iconlis $this->parambag->get('img_path')."lis.png";
  1889.             $iconmev $this->parambag->get('img_path')."mev.png";
  1890.             
  1891.             $web_path $this->parambag->get('web_path');
  1892.             
  1893.             $search_now time();
  1894.             $datcremax date('Y-m-d'mktime(0,0,0,date('m'$search_now),date('d'$search_now)-4,date('Y'$search_now)));
  1895.             
  1896.             // à effectuer en N fois 
  1897.             $query $em->getRepository(usr::class)->createQueryBuilder('usr'); 
  1898.             $query
  1899.                 ->select('usr')
  1900.                 ->where('usr.usrdatppi IS NULL')
  1901.                 // ->andwhere('usr.usrdatcre < :datcremax') bof...
  1902.                 // ->setParameter('datcremax' ,$datcremax)
  1903.                 ->orderBy('usr.usrnom''ASC')
  1904.             ;
  1905.             $utilisateurs $query->getQuery()->getResult();
  1906.             $nb_usr count($utilisateurs);
  1907.             
  1908.             if($nb_usr>0){
  1909.                 $k=0;
  1910.                 foreach($utilisateurs as $usr){
  1911.                     $k++;
  1912.                     
  1913.                     if($k <= $nbmailaexpedier){ // par paquet
  1914.                     
  1915.                         $mailaenv['destinataire_nom'] = "";
  1916.                         $mailaenv['destinataire_email'] = $usr->getUsremail();              // TODO à activer en PROD
  1917.                         // $mailaenv['destinataire_email'] = "didier.pfennig@free.fr";                 // TODO à désactiver en PROD
  1918.                         // texte du mail
  1919.                         $bodymail '<div style="width:750px;margin:0 auto;">';
  1920.                             $bodymail.= '<img style="width:750;height:64px;border:none" src="'.$urllogo.'">';
  1921.                             $bodymail.= '<div style="width:747px;text-align:left;font-size:12px Arial, Helvetica, sans-serif;color:#414141;border:1px solid #4f8eaf;overflow:hidden;">';
  1922.                     
  1923.                                 $bodymail.= '<p style="padding-left:10px; padding-right:10px;"><b>Madame, Monsieur,</b></p>';
  1924.                                 $bodymail.= '<p style="padding-left:10px; padding-right:10px;text-align: justify;">';
  1925.                                     $bodymail.= 'vous recevez ce courriel car vous avez déjà utilisé les outils d’analyse financière du site &laquo; <a href='.$this->parambag->get("web_path").'><b>Solidaires</b></a> &raquo; développés par Rural Consult, un service de la Banque des Territoires de la Caisse des Dépôts.';
  1926.                                 $bodymail.= '</p>';
  1927.                                 $bodymail.= '<p style="padding-left:10px; padding-right:10px;text-align: justify;">';
  1928.                                     $bodymail.= 'Aujourd\'hui, nous vous annonçons la mise en ligne de 3 nouveaux outils à visée pédagogique qui répondront, nous l\'esp&eacute;rons, à vos attentes.<br />&nbsp;<br />';
  1929.                                     $bodymail.= '<table width="100%">';
  1930.                                         $bodymail.= '<tr>';
  1931.                                             $bodymail.= '<td width="5%">';
  1932.                                                 $bodymail.= '<img src="'.$iconppi.'" style="vertical-align:middle;border:0;" height="50" width="50">';
  1933.                                             $bodymail.= '</td>';
  1934.                                             $bodymail.= '<td width="95%" style="font-size:14px;">';
  1935.                                                 $bodymail.= '<b>Plan Pluriannuel d\'Investissement</b> : construire un tableau de PPI, consolider les co&ucirc;ts d\'un ensemble de projets et mesurer le poids des emprunts n&eacute;cessaires à l\'&eacute;quilibre.';
  1936.                                             $bodymail.= '</td>';
  1937.                                         $bodymail.= '</tr>';
  1938.                                         $bodymail.= '<tr>';
  1939.                                             $bodymail.= '<td width="5%">';
  1940.                                                 $bodymail.= '<img src="'.$iconpfi.'" style="vertical-align:middle;border:0;" height="50" width="50">';
  1941.                                             $bodymail.= '</td>';
  1942.                                             $bodymail.= '<td width="95%" style="font-size:14px;">';
  1943.                                                 $bodymail.= '<b>Potentiel Fiscal</b> : Comprendre le calcul du potentiel fiscal 2021 d\'une commune et simuler son &eacute;volution &agrave; partir des nombreuses variables qui le composent.';
  1944.                                             $bodymail.= '</td>';
  1945.                                         $bodymail.= '</tr>';
  1946.                                         $bodymail.= '<tr>';
  1947.                                             $bodymail.= '<td width="5%">';
  1948.                                                 $bodymail.= '<img src="'.$iconlis.'" style="vertical-align:middle;border:0;" height="50" width="50">';
  1949.                                             $bodymail.= '</td>';
  1950.                                             $bodymail.= '<td width="95%" style="font-size:14px;">';
  1951.                                                 $bodymail.= '<b>Lissage de taux</b> : R&eacute;aliser l\'harmonisation progressive de taux multiples sur une p&eacute;riode variable (maximum 20 ans) vers un taux unique choisi.';
  1952.                                             $bodymail.= '</td>';
  1953.                                         $bodymail.= '</tr>';
  1954.                                     $bodymail.= '</table>';
  1955.                                 $bodymail.= '</p>';
  1956.                                 $bodymail.= '<p style="padding-left:10px; padding-right:10px;text-align: justify;">';
  1957.                                     $bodymail.= 'Nous avons aussi mis à jour les outils suivants :<br />';
  1958.                                     $bodymail.= '<table width="100%">';
  1959.                                         $bodymail.= '<tr>';
  1960.                                             $bodymail.= '<td width="5%">';
  1961.                                                 $bodymail.= '<img src="'.$iconmod.'" style="vertical-align:middle;border:0;" height="50" width="50">';
  1962.                                             $bodymail.= '</td>';
  1963.                                             $bodymail.= '<td width="95%" style="font-size:14px;">';
  1964.                                                 $bodymail.= '<b>MODELICO</b> : pour mesurer l\'impact simplifi&eacute; d\'un nouvel emprunt sur les principaux indicateurs financiers (soldes de gestion) d\'une collectivit&eacute; locale.';
  1965.                                             $bodymail.= '</td>';
  1966.                                         $bodymail.= '</tr>';
  1967.                                         $bodymail.= '<tr>';
  1968.                                             $bodymail.= '<td width="5%">';
  1969.                                                 $bodymail.= '<img src="'.$iconpro.'" style="vertical-align:middle;border:0;" height="50" width="50">';
  1970.                                             $bodymail.= '</td>';
  1971.                                             $bodymail.= '<td width="95%" style="font-size:14px;">';
  1972.                                                 $bodymail.= '<b>PROSPER</b> : pour calculer les principaux indicateurs financiers d\'une collectivit&eacute; locale : autofinancement brut et net, besoin de financement, capacit&eacute; de d&eacute;sendettement.';
  1973.                                             $bodymail.= '</td>';
  1974.                                         $bodymail.= '</tr>';
  1975.                                         $bodymail.= '<tr>';
  1976.                                             $bodymail.= '<td width="5%">';
  1977.                                                 $bodymail.= '<img src="'.$iconisb.'" style="vertical-align:middle;border:0;" height="50" width="50">';
  1978.                                             $bodymail.= '</td>';
  1979.                                             $bodymail.= '<td width="95%" style="font-size:14px;">';
  1980.                                                 $bodymail.= '<b>ISBA</b> : pour une aide &agrave; la d&eacute;cision en mati&egrave;re de financement des infrastructures d\'eau et d\'assainissement. Calcul de l\'impact simplifi&eacute; d\'un nouvel investissement sur les tarifs et les redevances.';
  1981.                                             $bodymail.= '</td>';
  1982.                                         $bodymail.= '</tr>';
  1983.                                         $bodymail.= '<tr>';
  1984.                                             $bodymail.= '<td width="5%">';
  1985.                                                 $bodymail.= '<img src="'.$iconmev.'" style="vertical-align:middle;border:0;" height="50" width="50">';
  1986.                                             $bodymail.= '</td>';
  1987.                                             $bodymail.= '<td width="95%" style="font-size:14px;">';
  1988.                                                 $bodymail.= '<b>MEVEN</b> : vous pourrez télécharger le tableur MEVEN pour calculer les co&ucirc;ts g&eacute;n&eacute;r&eacute;s par l\'organisation d\'un &eacute;v&egrave;nement local.';
  1989.                                             $bodymail.= '</td>';
  1990.                                         $bodymail.= '</tr>';
  1991.                                     $bodymail.= '</table>';
  1992.                                 $bodymail.= '</p>';
  1993.                                 $bodymail.= '<p style="padding-left:10px; padding-right:10px;text-align: justify;">';
  1994.                                     $bodymail.= 'L\'ensemble de ces outils est à votre disposition sur le site web &laquo; <a href='.$this->parambag->get("web_path").'><b>Solidaires</b></a> &raquo;.<br / >';
  1995.                                     $bodymail.= 'Avec votre identifiant, vous retrouverez toutes vos simulations saisies précédemment.<br />';
  1996.                                     $bodymail.= 'Votre identifiant est : <span style="color:#ff0000;font-weight: 600;">'.$usr->getUsername().'</span><br />';
  1997.                                     $bodymail.= 'Si vous ne vous souvenez pas de votre mot de passe, vous pourrez le modifier.';
  1998.                                     $bodymail.= '<br />&nbsp;<br />';
  1999.                                     $bodymail.= 'Si vous rencontrez des difficultés pour vous connecter, veuillez nous envoyer un courriel à l\'adresse suivante : <a href="mailto:assistance.technique@solidaires.com" title="Assistance technique Rural Consult">assistance.technique@solidaires.com</a>.';
  2000.                                     $bodymail.= '<br />&nbsp;<br />';
  2001.                                     $bodymail.= 'Nous restons à votre disposition pour toute autre information.';
  2002.                                     $bodymail.= '<br />&nbsp;<br />';
  2003.                                     $bodymail.= '<span style="color:#6c6c6c;font-weight: 600;">Direction du Réseau et des Territoires</span><br />';
  2004.                                     $bodymail.= 'Rural Consult<br />';
  2005.                                     $bodymail.= '72 av. Pierre Mendès France Paris 75914 cedex 13<br />';
  2006.                                     $bodymail.= '<br />&nbsp;<br />';
  2007.                                 $bodymail.= '</p>';
  2008.                                 
  2009.                                 $bodymail.= '<div style="font-size:11px;">';
  2010.                                     $bodymail.= '&nbsp;Vous avez ouvert un compte « Solidaires » le '.$usr->getUsrdatcre()->format('d/m/Y').'.<br />';
  2011.                                 $bodymail.= '</div>';
  2012.                             $bodymail.= '</div>';
  2013.                             $bodymail.= '<div style="width:750px;height:20px;text-align:center;background:#4f8eaf;font-size:12px Arial, Helvetica, sans-serif;color:#fff;">';
  2014.                                 $bodymail.= 'Rural Consult © Tous droits réservés';
  2015.                             $bodymail.= '</div>';
  2016.                             $bodymail.= '<br />&nbsp;<br />';
  2017.                         $bodymail.= '</div>';
  2018.                         $mailaenv['body'] = $bodymail;
  2019.                         
  2020.                         $unmess $this->meylerservice->envoidunmail('solidaires infos 2022',$mailaenv);     // envoi
  2021.                         
  2022.                         $nbmailenvoyes++;
  2023.                         $usrdatppi = new \DateTime();
  2024.                         $usrdatppi->createFromFormat("Y-m-d H:i:s"time());
  2025.                         // Enregistrement en bdd
  2026.                         $usr->setUSRDATPPI($usrdatppi);
  2027.                         $em->persist($usr);     // TODO à activer en PROD
  2028.                         $em->flush();             // TODO à activer en PROD
  2029.                     
  2030.                     }
  2031.                 }
  2032.                 
  2033.                 $this->get('session')->getFlashBag()->add(
  2034.                     'Succès',
  2035.                     $nbmailenvoyes.' mails envoyés. Nb utilisateurs sélect : '.$nb_usr
  2036.                 );
  2037.                 
  2038.             }else{
  2039.                 
  2040.                 $this->get('session')->getFlashBag()->add(
  2041.                     'Succès',
  2042.                     'Aucun utilisateur sélectionné, aucun courriel à envoyer.'
  2043.                 );
  2044.                 
  2045.             }
  2046.             return $this->redirect($this->generateUrl('pageaccueil'));                    
  2047.         
  2048.         }else{      // erreur réservé admin
  2049.             $this->get('session')->getFlashBag()->add(
  2050.                 'Erreur',
  2051.                 'La page demandée n\'existe pas ! (adm)'
  2052.             );
  2053.             // Affichage page inexistante
  2054.             return $this->render('default\noway.html.twig', array(
  2055.             ));        
  2056.         }
  2057.     
  2058.     }
  2059.     
  2060. }