src/Controller/USRController.php line 1283

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